본문 바로가기
Docker, k8s

[Kubernetes] 디플로이먼트 생성/업데이트/롤백 nginx 예시

by bryan.oh 2020. 3. 30.
반응형

 

나중에 보려고 아래 내용을 따라 하며 대략 정리한겁니다. 
더 자세한 내용을 보시려면 아래 링크에서 확인하세요.
참조 https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/
 

디플로이먼트

 

kubernetes.io

 

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3   # 3개의 레플리카 파드 생성
  selector:     # 디플로이먼트가 관리할 파드를 찾는 방법.
    matchLabels:      # label 의 app 이름이 nginx 인것을 찾아라.
      app: nginx
  template:
    metadata:
      labels:
        app: nginx		# labels필드를 사용해서 app: nginx 레이블을 붙힘
    spec:
      containers:           # 컨테이너 하나 생성
      - name: nginx			# name 필드의 값 nginx
        image: nginx:1.7.9	# 도커허브의 nginx:1.7.9 이미지 사용
        ports:
        - containerPort: 80

참고: 디플로이먼트에는 파드 템플릿 레이블과 적절한 셀렉터를 반드시 명시해야 한다(이 예시에서는 app: nginx). 레이블 또는 셀렉터는 다른 컨트롤러(다른 디플로이먼트와 스테이트풀 셋 포함)와 겹치지 않아야 한다. 쿠버네티스는 겹치는 것을 막지 않으며, 만약 다중 컨트롤러가 겹치는 셀렉터를 가지는 경우 해당 컨트롤러의 충돌 또는 예기치 않은 동작을 야기할 수 있다.

 

1. 디플로이먼트 생성

$ kubectl apply -f nginx-deployment.yaml

2. 생성 확인

$ kubectl get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/3     0            0           1s

아직 생성 중이면 이렇게 나오므로 잠시 후 다시 명령어 실행하면

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           18s

3. 레플리카셋(rs)를 확인

$ kubectl get rs

4. 각 파드에 생성된 레이블 확인

$ kubectl get pods --show-labels
NAME                                READY     STATUS    RESTARTS   AGE       LABELS
nginx-deployment-75675f5897-7ci7o   1/1       Running   0          18s       app=nginx,pod-template-hash=3123191453
nginx-deployment-75675f5897-kzszj   1/1       Running   0          18s       app=nginx,pod-template-hash=3123191453
nginx-deployment-75675f5897-qqcnn   1/1       Running   0          18s       app=nginx,pod-template-hash=3123191453

 

 

디플로이먼트 업데이트


참고: 디플로이먼트의 파드 템플릿(즉, .spec.template)이 변경된 경우에만 디플로이먼트의 롤아웃이 트리거(trigger) 된다. 예를 들면 템플릿의 레이블이나 컨테이너 이미지가 업데이트된 경우이다. 디플로이먼트의 스케일링과 같은 다른 업데이트는 롤아웃을 트리거하지 말아야 한다.

- nginx:1.7.9 에서 nginx:1.9.1 로 nginx 파드를 업데이트 하려면

- set

$ kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1

# 간단하게 사용

$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 --record

위에서 yaml 에 metadata: name : nginx-deployment 으로 했기때문에

deployment.apps/nginx-deployment 로 찾고,
뒤에 어떤것을 뭐로 set 할지 나옴 set image [디플로이먼트 이름] [이미지명] 

updated 메시지:

deployment.apps/nginx-deployment image updated

 

- deployment edit

$ kubectl edit deployment.v1.apps/nginx-deployment

메시지 : deployment.apps/nginx-deployment edited

- rollout 상태 확인

$ kubectl rollout status deployment.v1.apps/nginx-deployment

 

- deployment 세부 정보 조회

$ kubectl describe deployments

 

 

디플로이먼트 롤백


위의 업데이트에서 nginx 버전을 잘못 입력한 경우 롤백 하는 방법.

예제에서는 nginx 이름을 잘못 입력하여 디플로이먼트를 업데이트하고 있다.

$ kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
deployment.apps/nginx-deployment image updated

오타가 나도 업데이트가 됐다고 나온다.

$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-1564180365   3         3         3       25s
nginx-deployment-2035384211   0         0         0       36s
nginx-deployment-3066724191   1         1         0       6s

마지막의 레플리카.

$ kubectl get pods
NAME                                READY     STATUS             RESTARTS   AGE
nginx-deployment-1564180365-70iae   1/1       Running            0          25s
nginx-deployment-1564180365-jbqqo   1/1       Running            0          25s
nginx-deployment-1564180365-hysrc   1/1       Running            0          25s
nginx-deployment-3066724191-08mng   0/1       ImagePullBackOff   0          6s
참고: 디플로이먼트 컨트롤러가 잘못된 롤아웃을 자동으로 중지하고, 새로운 레플리카셋의 스케일 업을 중지한다. 이는 지정한 롤링 업데이트의 파라미터(구체적으로 maxUnavailable)에 따라 달라진다. 쿠버네티스는 기본값으로 25%를 설정한다.

 

디플로이먼트 상세보기

$ kubectl describe deployment

Replicas: 3 desired | 1 updated | 4 total | 3 available | 1 unavailable

이 문제를 해결하려면 디플로이먼트를 안정적인 이전 수정 버전으로 롤백해야 한다

디플로이먼트의 롤아웃 기록 확인

$ kubectl rollout history deployment.v1.apps/nginx-deployment

출력

deployments "nginx-deployment"
REVISION    CHANGE-CAUSE
1           kubectl apply --filename=nginx-deployment.yaml --record=true
2           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
3           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true

참고: 위에 나오는 CHANGE-CAUSE 변경하기

$ kubectl annotate deployment.v1.apps/nginx-deployment kubernetes.io/change-cause="image updated to 1.9.1"

 

각 수정 버전의 세부 정보 확인 ( 마지막에 위의 list 에 있는 REVISION 번호 입력 )

$ kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2

 

이전 수정 버전으로 롤백

다음 단계에 따라 디플로이먼트를 현재 버전에서 이전 버전인 버전 2로 롤백한다.

# 바로 이전 버전으로 rollback 
$ kubectl rollout undo deployment.v1.apps/nginx-deployment

# 또는 revision 을 지정해서 rollback
$ kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2

 

 

 

 

조회


- deployment 세부 정보

$ kubectl describe deployments

name, namespace, labels, selector, replicas, container 등등 모든 정보를 볼수있습니다.

- list 조회

# deployment 확인
$ kubectl get deployments

# deployment name 지정 조회
$ kubectl get deployment [deployment name]


# 레플리카셋 확인
$ kubectl get rs

# 롤아웃이 완료될때까지 상태관찰
$ kubectl get rs -w


# pod 확인
$ kubectl get pods

 

 

 

728x90
반응형

댓글