Home [kubernetes-실습] 간단한 application 배포, yaml템플릿, 서비스 expose 해보기
Post
Cancel

[kubernetes-실습] 간단한 application 배포, yaml템플릿, 서비스 expose 해보기

nginx app 간단하게 배포해보기

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
# nginx app 배포 하기
ps0107@k8smaster1:~$ kubectl create deployment nginx --image=nginx  
deployment.apps/nginx created

# 현재 클러스터의 event 확인
ps0107@k8smaster1:~$ kubectl get events
LAST SEEN   TYPE     REASON              OBJECT                        MESSAGE
29s         Normal   Scheduled           pod/nginx-554b9c67f9-cncvz    Successfully assigned default/nginx-554b9c67f9-cncvz to k8sworker1
27s         Normal   Pulling             pod/nginx-554b9c67f9-cncvz    Pulling image "nginx"
21s         Normal   Pulled              pod/nginx-554b9c67f9-cncvz    Successfully pulled image "nginx"
20s         Normal   Created             pod/nginx-554b9c67f9-cncvz    Created container nginx
19s         Normal   Started             pod/nginx-554b9c67f9-cncvz    Started container nginx
29s         Normal   SuccessfulCreate    replicaset/nginx-554b9c67f9   Created pod: nginx-554b9c67f9-cncvz
29s         Normal   ScalingReplicaSet   deployment/nginx              Scaled up replica set nginx-554b9c67f9 to 1

# nginx object의 자세한 정보를 확인
ps0107@k8smaster1:~$ kubectl describe deployment nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Tue, 28 Jan 2020 10:10:43 +0000
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-554b9c67f9 (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  71s   deployment-controller  Scaled up replica set nginx-554b9c67f9 to 1

yaml 파일 템플릿 만드는 3가지 방법

명령어리소스 생성설명
$ kubectl get deployment nginx -o yaml필요템플릿 내용 중에서 아래 라인 삭제하여 사용 </br> – createTimestamp </br> – resourceVersion </br> – selfLink </br> – uid </br> – status 포함 아래 전체
$ kubectl get deployment nginx –export필요템플릿 내용 그대로 사용 가능. 필요한 부분만 수정해서 사용.
$ kubectl create deployment nginx –dry-run필요없음실제 object를 생성하지 않고 yaml 파일 템플릿을 얻을 수 있음.
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
# -o 옵션을  nginx object의 정보를 yaml 형태로 볼수 있다
ps0107@k8smaster1:~$ kubectl get deployment nginx -o yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2020-01-28T10:10:43Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
  resourceVersion: "8641"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx
  uid: 7de7b7fa-7897-45e8-af80-7fa18af75220
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2020-01-28T10:10:53Z"
    lastUpdateTime: "2020-01-28T10:10:53Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2020-01-28T10:10:43Z"
    lastUpdateTime: "2020-01-28T10:10:53Z"
    message: ReplicaSet "nginx-554b9c67f9" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1
  
# --dry-run 옵션을 사용하면 현재 object resource 가 없더라도 템플릿을 얻을수 있다.
ps0107@k8smaster1:~$ kubectl create deployment two --image=nginx --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: two
  name: two
spec:
  replicas: 1
  selector:
    matchLabels:
      app: two
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: two
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

# --export 옵션을 사용하여 현재 nginx 객체에서 필요없는 부분이 삭제 되어 템플릿을 보여준다.
ps0107@k8smaster1:~$ kubectl get deployments nginx --export -o yaml
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: null
  generation: 1
  labels:
    app: nginx
  name: nginx
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status: {}

nginx app 서비스 expose 해보기

  • 참고로 nginx expose 후 ifconfig로 인터페이스를 보면 calico 인터페이스가 두개 생성이 되는것을 볼수 있다.
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
# nginx 서비스 expose를 시도했으나 컨테이너 포트 미지정으로 에러 발생.
ps0107@k8smaster1:~$ kubectl expose deployment/nginx 
error: could not find port via --port flag or introspection
See kubectl expose -h for help and examples

# -o 옵션으로 현재 nginx 리소스의 템플릿 파일 만듬.
ps0107@k8smaster1:~$ kubectl get deployment nginx -o yaml > nginx_1.yaml

# 만들어진 템플릿 파일에 필요 없는 부분 삭제하 아래와 같이 container port 부분 추가
ps0107@k8smaster1:~$ vi nginx_1.yaml
....
   spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
....

# 수정된 yaml 파일로 nginx update
# replace 옵션: 해당 yaml 파일에 내용으로 전체 update, 새로운 deployment를 생성하고 기존 것을 terminate 시킴
ps0107@k8smaster1:~$ kubectl replace -f nginx_1.yaml 
deployment.extensions/nginx replaced

# AGE 부분 보면 새로 생성된거 확인이 가능하다.
ps0107@k8smaster1:~$ kubectl get deployment,pod
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/nginx   1/1     1            1           49m

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7bffc778db-6bhr6   1/1     Running   0          2m9s

# 다시 서비스 expose 해본다. 이번에 정상적으로 됐다.
ps0107@k8smaster1:~$ kubectl expose deployment/nginx
service/nginx exposed

# nginx svc 조회
ps0107@k8smaster1:~$ kubectl get svc nginx
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.97.139.18   <none>        80/TCP    13s

# nginx endpoint 조회 (endpoint는 pod ip + container port)
ps0107@k8smaster1:~$ kubectl get ep nginx
NAME    ENDPOINTS        AGE
nginx   192.168.1.3:80   25s

# nginx cluster ip로 curl 테스트
ps0107@k8smaster1:~$ curl 10.97.139.18:80
Welcome to nginx!

# nginx endpoint 로 curl 테스트
ps0107@k8smaster1:~$ curl 192.168.1.3:80
Welcome to nginx!

nginx web server를 scale out 해보기

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
# replicas를 3으로 조정
ps0107@k8smaster1:~$ kubectl scale deployment nginx --replicas=3
deployment.extensions/nginx scaled

# 3개의 pod가 생성된것을 확인할 수 있다.
ps0107@k8smaster1:~$ kubectl get deployment nginx         
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           15h

# endpoint도 pod 갯수대로 생성이 되었다.
ps0107@k8smaster1:~$ kubectl get ep nginx        
NAME    ENDPOINTS                                       AGE
nginx   192.168.0.10:80,192.168.1.3:80,192.168.1.4:80   14h

# 3개의 pod정보를 확인할 수 있다.
ps0107@k8smaster1:~$ kubectl get po -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
nginx-7bffc778db-4zbb2   1/1     Running   0          42s   192.168.1.4    k8sworker1   <none>           <none>
nginx-7bffc778db-6bhr6   1/1     Running   0          14h   192.168.1.3    k8sworker1   <none>           <none>
nginx-7bffc778db-zvlft   1/1     Running   0          42s   192.168.0.10   k8smaster1   <none>           <none>

# 예전에 생성된거 1개 제외하고 2개가 추가로 생성되었다. 예전에 생성된 pod를 삭제해 보자.
ps0107@k8smaster1:~$ kubectl delete po nginx-7bffc778db-6bhr6 
pod "nginx-7bffc778db-6bhr6" deleted

# pod가 새로 생성이 되었다.
ps0107@k8smaster1:~$ kubectl get po -o wide                   
NAME                     READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
nginx-7bffc778db-4zbb2   1/1     Running   0          2m45s   192.168.1.4    k8sworker1   <none>           <none>
nginx-7bffc778db-svxw2   1/1     Running   0          29s     192.168.1.5    k8sworker1   <none>           <none>
nginx-7bffc778db-zvlft   1/1     Running   0          2m45s   192.168.0.10   k8smaster1   <none>           <none>

# endpoint도 새로 생성된걸 확인 할 수있다.
ps0107@k8smaster1:~$ kubectl get ep nginx 
NAME    ENDPOINTS                                       AGE
nginx   192.168.0.10:80,192.168.1.4:80,192.168.1.5:80   14h

# cluster ip로 curl 테스트 해보면 3개의 pod로 분산되어 들어간다.

클러스터 외부에서 접근할 수 있도록 설정해보기

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
# 현재 pod 정보
ps0107@k8smaster1:~$ kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7bffc778db-4zbb2   1/1     Running   0          37m
nginx-7bffc778db-svxw2   1/1     Running   0          35m
nginx-7bffc778db-zvlft   1/1     Running   0          37m

# pod 안에 환경설정 정보를 확인해본다 (KUBERNETES란 네이밍이 들어간 것만)
ps0107@k8smaster1:~$ kubectl exec nginx-7bffc778db-4zbb2 -- printenv | grep KUBERNETES
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1   
KUBERNETES_PORT_443_TCP_PORT=443     
KUBERNETES_SERVICE_HOST=10.96.0.1   
KUBERNETES_SERVICE_PORT_HTTPS=443   
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443   
KUBERNETES_PORT=tcp://10.96.0.1:443          
KUBERNETES_SERVICE_PORT=443       
KUBERNETES_PORT_443_TCP_PROTO=tcp       

# 현재 svc 정보 확인
ps0107@k8smaster1:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   17h
nginx        ClusterIP   10.97.139.18   <none>        80/TCP    14h

# nginx svc 리소스를 삭제 해준다. 다시 생성하기 위해서.
ps0107@k8smaster1:~$ kubectl delete svc nginx 
service "nginx" deleted

# 이번엔 LoadBalancer 타입으로 생성해준다.
ps0107@k8smaster1:~$ kubectl expose deployment nginx --type=LoadBalancer 
service/nginx exposed

# 생성된 것을 확인할 수 있다. 
# 참고로 external-ip는 eks 같은 클라우드 서비스를 쓸 경우 elb 주소가 들어간다.
# 현재는 없으므로 pending 상태이다. 대신 node port 하나가 생성되었다 (31325 port)
ps0107@k8smaster1:~$ kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        17h
nginx        LoadBalancer   10.103.105.106   <pending>     80:31325/TCP   8s
  • 웹브라우저를 통해서 http://{노드아이피}:{노드포트} 로 접속하면 nginx 화면을 볼수 있다. 3개의 pod로 분산되어 들어가게 된다. replicas를 0으로 해서 다시 접속하면 웹접속은 실패할 것이다. 실습 후 이제 리소스를 정리해본다. 상위 객체 삭제시 하위객체까지 삭제되고, 하위 객체 삭제시 상위객체는 남아 있게 된다.
1
2
3
4
5
6
7
8
ps0107@k8smaster1:~$ kubectl delete deployments nginx 
deployment.extensions "nginx" deleted

ps0107@k8smaster1:~$ kubectl delete ep nginx  
endpoints "nginx" deleted

ps0107@k8smaster1:~$ kubectl delete svc nginx 
service "nginx" deleted
This post is licensed under CC BY 4.0 by the author.

[kubernetes-실습] 쿠버네티스 클러스트 노드 확장 및 셋팅

[kubernetes-실습] deployment 의 CPU, Memory 제약