spec: replicas 부분이 replica에 대한 부분 그 밑에는 pod에 대한 내용은 template부터이다.
pod에 labels를 붙여야 replicaset이 labels의 개수를 셀 수 있음
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-nginx
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx-pods-label
template:
metadata:
name: my-nginx-pod
labels:
app: my-nginx-pods-label
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl apply -f nginx-rs.yaml
replicaset.apps/replicaset-nginx created
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get rs
NAME DESIRED CURRENT READY AGE
replicaset-nginx 3 3 1 14s
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-nginx-89kwm 1/1 Running 0 67s
replicaset-nginx-9s54t 1/1 Running 0 67s
replicaset-nginx-f4b89 1/1 Running 0 67s
pod의 이름은 뒤에 임의의 수를 붙여주게 됨
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-nginx-89kwm 1/1 Running 0 2m27s app=my-nginx-pods-label
replicaset-nginx-9s54t 1/1 Running 0 2m27s app=my-nginx-pods-label
replicaset-nginx-f4b89 1/1 Running 0 2m27s app=my-nginx-pods-label
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl delete pod replicaset-nginx-89kwm
pod "replicaset-nginx-89kwm" deleted
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-nginx-6x6fp 1/1 Running 0 29s
replicaset-nginx-9s54t 1/1 Running 0 4m29s
replicaset-nginx-f4b89 1/1 Running 0 4m29s
kubectl edit pod replicaset-nginx-f4b89
라벨로 확인하기 때문에 하나의 라벨을 지웠더니, 그를 채우기 위해 4개가 된 것을 볼 수 있다.
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-nginx-6x6fp 1/1 Running 0 2m48s
replicaset-nginx-9s54t 1/1 Running 0 6m48s
replicaset-nginx-djqvz 1/1 Running 0 18s
replicaset-nginx-f4b89 1/1 Running 0 6m48s
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl delete -f nginx-rs.yaml
replicaset.apps "replicaset-nginx" deleted
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-nginx-f4b89 1/1 Running 0 7m31s
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl delete pod replicaset-nginx-f4b89
pod "replicaset-nginx-f4b89" deleted
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl apply -f nginx-rs.yaml
replicaset.apps/replicaset-nginx created
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-nginx-98d52 1/1 Running 0 5s
replicaset-nginx-j5mbs 1/1 Running 0 5s
replicaset-nginx-wrpvm 1/1 Running 0 5s
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ vi nginx-rs.yaml
yaml파일 편집기로 들어가replicas를 5로 바꿈
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl apply -f nginx-rs.yaml
replicaset.apps/replicaset-nginx configured
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-nginx-98d52 1/1 Running 0 76s
replicaset-nginx-cgrtm 1/1 Running 0 5s
replicaset-nginx-j5mbs 1/1 Running 0 76s
replicaset-nginx-r4plg 1/1 Running 0 5s
replicaset-nginx-wrpvm 1/1 Running 0 76s
일반적인 포드는 삭제가 자유로운 포드이며 이름의 경우도 임의의 hash 뒤에 붙이게 된다.
deployment: test-deploy
replicaset : test-deploy-12345(2개의 포드를 유지)
[일반적인 pod] [스테이트풀셋적용된(해당pod를 지속적사용)]
pod : test-deploy-12345-sdfasd - statefulset → test-deploy-12345-1
test-deploy-12345-lsdfkqf - statefulset → test-deploy-12345-2
롤링 업데이트가 가능하다.
nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx-pods-label
template:
metadata:
name: my-nginx-pod
labels:
app: my-nginx-pods-label
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl apply -f nginx-deploy.yaml
deployment.apps/deploy-nginx created
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME READY STATUS RESTARTS AGE
deploy-nginx-7f797dbc66-2kg9z 1/1 Running 0 43s
deploy-nginx-7f797dbc66-6shnl 1/1 Running 0 43s
deploy-nginx-7f797dbc66-rq9xt 1/1 Running 0 43s
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get deploy,rs,pod
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deploy-nginx 3/3 3 3 65s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deploy-nginx-7f797dbc66 3 3 3 65s
NAME READY STATUS RESTARTS AGE
pod/deploy-nginx-7f797dbc66-2kg9z 1/1 Running 0 65s
pod/deploy-nginx-7f797dbc66-6shnl 1/1 Running 0 65s
pod/deploy-nginx-7f797dbc66-rq9xt 1/1 Running 0 65s
deploy 정보 확인
replicaset 확인
pod별로 다른이름으로 생성되도록
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get rs --show-labels
NAME DESIRED CURRENT READY AGE LABELS
deploy-nginx-7f797dbc66 3 3 3 2m48s app=my-nginx-pods-label,pod-template-hash=7f797dbc66
기본적인 내용 외에 pod-template-has=~~가 붙어있는 것 확인 가능
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl rollout history deploy deploy-nginx
deployment.apps/deploy-nginx
REVISION CHANGE-CAUSE
1 <none>
최초 배포 했을 때 1번
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl set image deploy deploy-nginx nginx=httpd:latest
deployment.apps/deploy-nginx image updated
앞에 deploy-nginx : [deploy 이름], 그 다음 nginx=httpd:latest [컨테이너이름]=[이미지이름]
pod 하나로 들어갔더니 nginx가 아닌 apache2로 된 것을 볼 수 있다. 이미지가 잘 변경되었다는 뜻
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl exec -it deploy-nginx-586b998bb6-9jmpm -- bash
root@deploy-nginx-586b998bb6-9jmpm:/usr/local/apache2#
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl rollout history deploy deploy-nginx
deployment.apps/deploy-nginx
REVISION CHANGE-CAUSE
1 <none> # 최초 배퍼 (nginx)
2 <none> # 이미지 업데이트(httpd=apache2) "now here"
REVISION이 2개로 늘은 것을 확인할 수 있다. 현재 2번에 있는 것
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl rollout undo deploy deploy-nginx --to-revision=1
deployment.apps/deploy-nginx rolled back
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod,rs
NAME READY STATUS RESTARTS AGE
pod/deploy-nginx-7f797dbc66-6lc85 1/1 Running 0 69s
pod/deploy-nginx-7f797dbc66-p6fpj 1/1 Running 0 77s
pod/deploy-nginx-7f797dbc66-sq8vj 1/1 Running 0 73s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deploy-nginx-586b998bb6 0 0 0 5m38s
replicaset.apps/deploy-nginx-7f797dbc66 3 3 3 12m # 최초만든게 undo 됨
nginx로 다시 undo 된 것을 볼 수 있다.
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl exec -it deploy-nginx-7f797dbc66-6lc85 -- bash
root@deploy-nginx-7f797dbc66-6lc85:/#
Deployment를 이용하면 하위에 있는 replicaset이 생성된다.
우리는 두 replicaset의 정보를 확인하여 둘 다 동일한 라벨이 있는 것을 확인할 수 있다.
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get rs --show-labels
NAME DESIRED CURRENT READY AGE LABELS
deploy-nginx-586b998bb6 0 0 0 6m59s app=my-nginx-pods-label,pod-template-hash=586b998bb6
deploy-nginx-7f797dbc66 3 3 3 13m app=my-nginx-pods-label,pod-template-hash=7f797dbc66
만약 replicaset에서 개수를 늘린다면 (최초 배포는 3 → 6개로 늘린다면) 신규 이미지를 활용한 pod만 6개로 3개가 추가된다.
결론적으로 deployment는 이미지의 버전관리가 가능하여 기존 버전에서 생성된 pod들과 신규 이미지에서 생성된 pod를 구분하기 위하여 추가적인 라벨을 자동 생성한 뒤, 이를 pod에 붙여준다.
이를 통해 기존 pod와 신규 pod를 구분할 수 있다.
replica면 app=my-gninx-pods-labels만 붙어있는데, deploy에서는 추가 라벨 pod-template-hash를 붙여서 버전관리를 한다.
즉, 예를들어 old버전 3개, new버전 3개가 있는데 new버전 pod를 6개가 되도록 늘린다고했을 때, 기존에 붙어있던 라벨은 다 똑같으니 구분이 안되니 deployment에서는 또 다른 라벨(pod-template-hash)을 붙여 구분해주어 결국 old버전 3개, new 버전 6개가 되도록 한다.
버전관리를 위해서는 파일 수정은 하지말 것(rollout 쓰기)
다음과 같이 새로운 이미지를 지정해 업데이트 시킨다.
kubectl set image deploy deploy-nginx nginx=httpd:latest
kubectl rollout undo deploy my-nginx-deployment --to-revison=1 <-- 최초상태로 복귀
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl delete -f nginx-deploy.yaml
deployment.apps "deploy-nginx" deleted