1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
| # nginx deployment 배포를 위한 yaml 파일 준비
ps0107@k8smaster1:~$ vi nginx-one.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-one
labels:
system: secondary
namespace: accounting
spec:
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.11.1
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 8080 #-> 포트는 8080으로 지정
protocol: TCP
nodeSelector: #-> nodeSelector는 secondOne으로 지정
system: secondOne
# 현재 node에 설정된 라벨 확인
ps0107@k8smaster1:~$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8smaster1 Ready master 5d21h v1.15.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8smaster1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8sworker1 Ready <none> 5d21h v1.15.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8sworker1,kubernetes.io/os=linux
# yaml파일로 생성하려 시도하는데 namespace 가 없어서 실패
ps0107@k8smaster1:~$ kubectl create -f nginx-one.yaml
Error from server (NotFound): error when creating "nginx-one.yaml": namespaces "accounting" not found
# namespace 생성
ps0107@k8smaster1:~$ kubectl create ns accounting
namespace/accounting created
# 다시 nginx-one deployment 배포
ps0107@k8smaster1:~$ kubectl create -f nginx-one.yaml
deployment.extensions/nginx-one created
# 생성된 pod 확인
# 두개의 pod 가 accounting namespace에 생성됨을 확인, 그러나 상태가 pendding 상태임
ps0107@k8smaster1:~$ kubectl -n accounting get pods
NAME READY STATUS RESTARTS AGE
nginx-one-575db47668-fcgpf 0/1 Pending 0 19s
nginx-one-575db47668-mng7p 0/1 Pending 0 19s
# 생성된 pod의 상세 내용 확인
# 자세한 내용을 보면 아랫쪽 Events 에 FailedScheduling 을 볼 수도 있다.
# 왜냐하면 node selector 가 secondOne을 찾는데 없어서 warning이 발생했다
ps0107@k8smaster1:~$ kubectl -n accounting describe pod nginx-one-575db47668-fcgpf
Name: nginx-one-575db47668-fcgpf
Namespace: accounting
Priority: 0
Node: <none>
Labels: app=nginx
pod-template-hash=575db47668
Annotations: <none>
Status: Pending
IP:
Controlled By: ReplicaSet/nginx-one-575db47668
Containers:
nginx:
Image: nginx:1.11.1
Port: 8080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-m2wzl (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
default-token-m2wzl:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-m2wzl
Optional: false
QoS Class: BestEffort
Node-Selectors: system=secondOne
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 61s (x2 over 61s) default-scheduler 0/2 nodes are available: 2 node(s) did not match node selector.
# 해결하기 위해 노드에 label 부여해준다.
ps0107@k8smaster1:~$ kubectl label node k8sworker1 system=secondOne
node/k8sworker1 labeled
# 노드에 부여된 라벨을 확인한다.
ps0107@k8smaster1:~$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8smaster1 Ready master 5d21h v1.15.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8smaster1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8sworker1 Ready <none> 5d21h v1.15.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8sworker1,kubernetes.io/os=linux,system=secondOne
# 다시 pod 상태를 확인해본다. 정상 running 상태로 돌아왔다.
ps0107@k8smaster1:~$ kubectl -n accounting get pods
NAME READY STATUS RESTARTS AGE
nginx-one-575db47668-fcgpf 1/1 Running 0 2m40s
nginx-one-575db47668-mng7p 1/1 Running 0 2m40s
# label을 통해 pod를 검색해본다.
# 모든 namespace 에서 app=nginx으로 select
ps0107@k8smaster1:~$ kubectl get pods -l app=nginx --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
accounting nginx-one-575db47668-fcgpf 1/1 Running 0 3m6s
accounting nginx-one-575db47668-mng7p 1/1 Running 0 3m6s
# nginx-one을 svc expose 시킨다.
ps0107@k8smaster1:~$ kubectl -n accounting expose deployment nginx-one
service/nginx-one exposed
# nginx-one의 endpoint 확인
# pod 갯수대로 보임. yaml 파일 설정으로 인해 8080 포트로 expose 됨
ps0107@k8smaster1:~$ kubectl -n accounting get ep nginx-one
NAME ENDPOINTS AGE
nginx-one 192.168.1.73:8080,192.168.1.74:8080 14s
# curl 테스트 실패
# 현재 임의로 8080으로 부여했는데 실제 이미지의 오픈 포트로 설정해 줘야 한다.
ps0107@k8smaster1:~$ curl 192.168.1.73:8080
curl: (7) Failed to connect to 192.168.1.73 port 8080: Connection refused
# 실제 이미지 포트인 80으로 리슨되어 있다.
ps0107@k8smaster1:~$ curl 192.168.1.73:80
......
<title>Welcome to nginx!</title>
.....
# yaml 파일에서 수정한다 (8080->80)
ps0107@k8smaster1:~$ vi nginx-one.yaml
....
ports:
- containerPort: 80
....
# 다시 deployment를 생성하기 위해 기존것을 삭제한다.
ps0107@k8smaster1:~$ kubectl -n accounting delete deploy nginx-one
deployment.extensions "nginx-one" deleted
# svc 객체도 삭제후 다시 생성해 줘야 한다.
ps0107@k8smaster1:~$ kubectl -n accounting delete svc nginx-one
service "nginx-one" deleted
# 수정된 내용으로 deployment 생성
ps0107@k8smaster1:~$ kubectl create -f nginx-one.yaml
deployment.extensions/nginx-one created
# 다시 svc expose 해줌.
ps0107@k8smaster1:~$ kubectl -n accounting expose deployment nginx-one
service/nginx-one exposed
# endpoint 확인
ps0107@k8smaster1:~$ kubectl -n accounting get ep
NAME ENDPOINTS AGE
nginx-one 192.168.1.75:80,192.168.1.76:80 22s
# 80으로 서비스 테스트 이상없음
ps0107@k8smaster1:~$ curl 192.168.1.75:80
....
<title>Welcome to nginx!</title>
....
|