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 된것을 확인을 할 수 있습니다.
'쿠버네티스' 카테고리의 다른 글
| [클라우드] 7. Deployment strategies (6) | 2022.09.13 |
|---|---|
| [클라우드] 6. Kubernetes Service 배포 (38) | 2022.09.03 |
| [클라우드] 4. Kubernetes Replicaset 배포 (4) | 2022.08.28 |
| [클라우드] 3.Kuberdnetes Pod 배포하기 (4) | 2022.08.28 |
| [클라우드] 2. Kubernetes namespace (3) | 2022.08.27 |