쿠버네티스

[클라우드] 5. Kubernetes Deployment 배포

트리스탄1234 2022. 8. 31. 19:55
728x90
반응형

Kubernetes에서 상위 Object인 Deployment에 대해서 알아 보도록 하겠습니다. Deployment 객체는 Replicaset이나 Pod보다 상위 객체 입니다. 즉 다시 말해서 Deployment를 통해 원하는 객체를 모두 생성이 가능 합니다. 그리고 Deployment객체를 통해 어플리케이션의 업데이트나 롤백이 가능하게 해 줍니다.

그럼 Deployment 객체를 생성하고 배포를 해봅시다.

그림에서 보듯이 Deployment 안에는 Replicaset과 Pod객체를 포함을 하고 있습니다. 위의 그림은 Replicaset은 4개의 Pod로 유지하고 Level값은 my-nginx로 대상 Pod를 정의 하고 있고 Container부분에서 세부 Spec을 정의를 하고 있습니다.

쿠버네티스에서는 각 객체를 개별적으로 생성 배포하는 방법보다. 이런 Deployment객체를 사용하여 배포하는 것을 권장하고 있고 있고 Deployment를 사용할때의 장점을 보면 아래와 같습니다.

  • Pod의 scale in / out 되는 기준을 정의.
  • Pod의 배포되고 update 되는 모든 버전을 추적 가능
  • 배포된 Pod에 대한 rollback을 수행 가능

그럼 이제 test 디렉토리 아래에 Deployment 디렉토리를 만들고 deployment.yaml을 생성 하고 아래 내용을 파일에 저장 후에 배포를 해보겠습니다.

root@master-VirtualBox:~/test# mkdir deployment
root@master-VirtualBox:~/test# cd deployment/
root@master-VirtualBox:~/test/deployment# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment ==> 배포될 객체 정의
metadata:
name: my-nginx-deployment ==> 객체의 이름 정의
spec:
selector:
matchLabels:
run: my-nginx ==> Deployment에 포함되는 객체의 Label값
replicas: 2 ==> 복제 Pod 수
template: ==> Pod의 형식 정의
metadata:
labels:
run: my-nginx
spec: ==> Pod의 스펙 정의
containers:
- name: my-nginx-container
image: nginx
imagePullPolicy: Always
ports:
- containerPort: 80

위와 같이 입력 하고 저장을 하였으면 이제 kubectl 명령을 통해 Deployment 객체를 배포 해보겠습니다.

root@master-VirtualBox:~/test/deployment# kubectl apply -f deployment.yaml
deployment.apps/my-nginx-deployment created
root@master-VirtualBox:~/test/deployment# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx-deployment 0/2 2 0 26s
root@master-VirtualBox:~/test/deployment# kubectl get replicasets
NAME DESIRED CURRENT READY AGE
my-nginx-deployment-5f85fc96f7 2 2 2 36s
root@master-VirtualBox:~/test/deployment# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-deployment-5f85fc96f7-s9glk 1/1 Running 0 44s
my-nginx-deployment-5f85fc96f7-xv75s 1/1 Running 0 44s

deployment 객체를 통해서 replicaset과 pod모두 정상 배포가 되었고 정상 상태임을 확인 하였습니다.

그럼 이제 Pod를 임의로 삭제를 해서 replicaset이 자동으로 복구를 하는지 확인을 해봅시다.

root@master-VirtualBox:~/test/deployment# kubectl delete pod my-nginx-deployment-5f85fc96f7-s9glk
pod "my-nginx-deployment-5f85fc96f7-s9glk" deleted
root@master-VirtualBox:~/test/deployment# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-deployment-5f85fc96f7-xv75s 1/1 Running 0 6m55s
my-nginx-deployment-5f85fc96f7-z7lgs 0/1 ContainerCreating 0 2s

위의 로그에서 보듯이 한개의 Pod를 삭제 하자 마자 Replicast에 의해서 자동으로 하나가 생성됨을 확인할 수 있습니다. 새로 생성한 이유는 Deployment 객체의 replica 파라메터에서 2로 지정을 하였기 때문에 2개의 Pod를 유지 하기 위해 새로 생성을 한것 입니다.

그럼 이번에는 kubectl 명령을 이용해서 deployment의 replica의 값을 변경하고 조회를 해봅시다.

root@master-VirtualBox:~/test/deployment# kubectl edit deployments my-nginx-deployment
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"my-nginx-deployment","namespace":"default"},"spec":{"replicas":2,"selector":{"matchLabels":{"run":"my-nginx"}},"template":{"metadata":{"labels":{"run":"my-nginx"}},"spec":{"containers":[{"image":"nginx","imagePullPolicy":"Always","name":"my-nginx-container","ports":[{"containerPort":80}]}]}}}}
creationTimestamp: "2022-08-01T04:14:17Z"
generation: 2
name: my-nginx-deployment
namespace: default
resourceVersion: "59837"
uid: 448df212-8dc8-42ec-aa90-a7f484bdb974
spec:
progressDeadlineSeconds: 600
replicas: 4
revisionHistoryLimit: 10
selector:
matchLabels:
run: my-nginx
strategy:

수정을 완료 하였으면 아래 그림과 같이 Pod와 Deployment, Replicaset의 정보를 확인해 봅시다.

root@master-VirtualBox:~/test/deployment# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx-deployment 4/4 4 4 13m
root@master-VirtualBox:~/test/deployment#
root@master-VirtualBox:~/test/deployment# kubectl get replicasets.apps
NAME DESIRED CURRENT READY AGE
my-nginx-deployment-5f85fc96f7 4 4 4 13m
root@master-VirtualBox:~/test/deployment# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-deployment-5f85fc96f7-bw48j 1/1 Running 0 113s
my-nginx-deployment-5f85fc96f7-mvrvn 1/1 Running 0 113s
my-nginx-deployment-5f85fc96f7-xv75s 1/1 Running 0 13m
my-nginx-deployment-5f85fc96f7-z7lgs 1/1 Running 0 6m46s

2개의 Pod에서 4개의 Pod로 2개가 늘어나면서 운영 되는걸 확인할 수 있습니다.

그럼 이제 배포된 Pod들의 버전을 변경을 한후에 다시 이전 버전으로 돌려봅시다.

Pod의 이미지를 nginx:latest 에서 nginx:1.9.1으로 변경하고, 변경에 대한 이력을 기록하기 위해 annotations에 change-cause을 추가 합니다. 추후에 이력조회시 변경내용으로 조회를 하기 위해서 입니다.

아래와 같이 deployment.yaml파일을 열고 빨간색 부분과 같이 수정 후 저장 합니다.

root@master-VirtualBox:~/test/deployment# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
annotations:
kubernetes.io/change-cause: "set image nginx 1.9.1"
spec:
selector:
matchLabels:
run: my-nginx
replicas: 4
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx-container
image: nginx:1.9.1
imagePullPolicy: Always
ports:
- containerPort: 80

이제 수정한 deployment를 배포하고 변경사항을 살펴 봅시다.

root@master-VirtualBox:~/test/deployment# kubectl apply -f deployment.yaml
root@master-VirtualBox:~/test/deployment# kubectl get deployments ==> deployment의 정보 조회
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx-deployment 4/4 4 4 44m
root@master-VirtualBox:~/test/deployment# kubectl get replicasets ==> replicaset의 정보 조회
NAME DESIRED CURRENT READY AGE
my-nginx-deployment-5f85fc96f7 0 0 0 44m
my-nginx-deployment-d6b6494f6 4 4 4 2m46s
root@master-VirtualBox:~/test/deployment# kubectl get pods ==> pod의 정보 조회
NAME READY STATUS RESTARTS AGE
my-nginx-deployment-d6b6494f6-5v4xk 1/1 Running 0 26s
my-nginx-deployment-d6b6494f6-6nmxk 1/1 Running 0 2m33s
my-nginx-deployment-d6b6494f6-dk29d 1/1 Running 0 26s
my-nginx-deployment-d6b6494f6-n2f4b 1/1 Running 0 2m53s
root@master-VirtualBox:~/test/deployment# kubectl describe pods my-nginx-deployment-d6b6494f6-5v4xk
Name: my-nginx-deployment-d6b6494f6-5v4xk
Namespace: default
Priority: 0
Node: worknode2-virtualbox/192.168.1.6
Start Time: Mon, 01 Aug 2022 13:58:24 +0900
Labels: pod-template-hash=d6b6494f6
run=my-nginx
Annotations: cni.projectcalico.org/podIP: 172.16.7.137/32
cni.projectcalico.org/podIPs: 172.16.7.137/32
Status: Running
IP: 172.16.7.137
IPs:
IP: 172.16.7.137
Controlled By: ReplicaSet/my-nginx-deployment-d6b6494f6
Containers:
my-nginx-container:
Container ID: containerd://1f041353efe8f49e7de4522032d61bf0ba0b88fe444a6b148ffa34962a85db85
Image: nginx:1.9.1
Image ID: sha256:ee609d78a6476f051fcbf5f3be370c2bb2c5c3b72d05538df0451f9de1604816
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Mon, 01 Aug 2022 13:58:30 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5kkl2 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-5kkl2:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m58s default-scheduler Successfully assigned default/my-nginx-deployment-d6b6494f6-5v4xk to worknode2-virtualbox
Normal Pulling 3m57s kubelet Pulling image "nginx:1.9.1"
Normal Pulled 3m53s kubelet Successfully pulled image "nginx:1.9.1" in 4.602785633s
Normal Created 3m52s kubelet Created container my-nginx-container
Normal Started 3m52s kubelet Started container my-nginx-container

위의 그림과 같이 빨간색 부분에서 image가 1.9.1로 변경이 되었음을 확인할 수 있습니다.

그럼 이제 아래 명령이 이용해서 deployment의 revision이력을 조회를 해보겠습니다.

root@master-VirtualBox:~/test/deployment# kubectl rollout history deployment
deployment.apps/my-nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 change image nginx 1.9.1 ==> revision 2의 세부 내역을 아래 명령어로 조회
root@master-VirtualBox:~/test/deployment# kubectl rollout history deployment --revision=2
deployment.apps/my-nginx-deployment with revision #2
Pod Template:
Labels: pod-template-hash=d6b6494f6
run=my-nginx
Annotations: kubernetes.io/change-cause: change image nginx 1.9.1
Containers:
my-nginx-container:
Image: nginx:1.9.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>

그럼 이제 'kubectl rollout history deployment'의 결과값 중에서 최초의 버전인 revision 1으로 rollback을 해보겠 습니다.

root@master-VirtualBox:~/test/deployment# kubectl rollout undo deployment --to-revision=1
deployment.apps/my-nginx-deployment rolled back
root@master-VirtualBox:~/test/deployment# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx-deployment 4/4 4 4 56m
root@master-VirtualBox:~/test/deployment# kubectl get replicasets
NAME DESIRED CURRENT READY AGE
my-nginx-deployment-5f85fc96f7 4 4 4 57m
my-nginx-deployment-d6b6494f6 0 0 0 15m
root@master-VirtualBox:~/test/deployment# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-deployment-5f85fc96f7-2pd8t 1/1 Running 0 69s
my-nginx-deployment-5f85fc96f7-5wj4s 1/1 Running 0 66s
my-nginx-deployment-5f85fc96f7-t9s9t 1/1 Running 0 69s
my-nginx-deployment-5f85fc96f7-z8wrs 1/1 Running 0 6
root@master-VirtualBox:~/test/deployment# kubectl describe pod my-nginx-deployment-5f85fc96f7-2pd8t
Name: my-nginx-deployment-5f85fc96f7-2pd8t
Namespace: default
Priority: 0
Node: worknode2-virtualbox/192.168.1.6
Start Time: Mon, 01 Aug 2022 14:10:26 +0900
Labels: pod-template-hash=5f85fc96f7
run=my-nginx
Annotations: cni.projectcalico.org/podIP: 172.16.7.138/32
cni.projectcalico.org/podIPs: 172.16.7.138/32
Status: Running
IP: 172.16.7.138
IPs:
IP: 172.16.7.138
Controlled By: ReplicaSet/my-nginx-deployment-5f85fc96f7
Containers:
my-nginx-container:
Container ID: containerd://8204770b9456cda5faf12aad5438d8893225459c7391a50814b9964c38c7196b
Image: nginx
Image ID: docker.io/library/nginx@sha256:bd06dfe1f8f7758debd49d3876023992d41842fd8921565aed315a678a309982
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Mon, 01 Aug 2022 14:10:29 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9jctd (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-9jctd:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 88s default-scheduler Successfully assigned default/my-nginx-deployment-5f85fc96f7-2pd8t to worknode2-virtualbox
Normal Pulling 87s kubelet Pulling image "nginx"
Normal Pulled 85s kubelet Successfully pulled image "nginx" in 1.927570903s
Normal Created 85s kubelet Created container my-nginx-container
Normal Started 85s kubelet Started container my-nginx-container
root@master-VirtualBox:~/test/deployment#

위의 그림과 같이 이전 버전의 image로 rollback 된것을 확인을 할 수 있습니다.

 

728x90
반응형