[클라우드/K8S 기본(2) - Replicaset과 Deployment]

SooYeon Yeon·2022년 9월 13일
0

클라우드 K8S

목록 보기
4/18

Replicaset

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
  • replicaset 정보 보기
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
replicaset-nginx   3         3         1       14s
  • pod 정보 보기
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
  • pod 중 한개를 지우고 다시 보면 다른pod가 생성되어서 3개가 유지된다.
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
  • delete 후 확인해보면 라벨이 없는 하나는 남아있는 것을 볼 수 있다.
  • 라벨이 없기 때문에 replica set과는 독립적으로 있기 때문에 수동으로 지워야 한다
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

deployment

일반적인 포드는 삭제가 자유로운 포드이며 이름의 경우도 임의의 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번

  • 이미지 변경하기
  • 기존 nginx:latest → httpd:latest로 이미지 update
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#
  • rollout history 확인
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번에 있는 것

  • revision 1번으로 돌아가기
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 <-- 최초상태로 복귀
  • deploy 삭제
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl delete -f nginx-deploy.yaml
deployment.apps "deploy-nginx" deleted

0개의 댓글