becool

20210903 (금) deployment, deployment strategies 본문

kubernetes

20210903 (금) deployment, deployment strategies

gusalstm 2021. 9. 3. 17:58
반응형

  Deployment

    ReplicaSet을 포함하는 상위 수준의 컨트롤러

    지정된 갯수의 pod 복제본을 생성하고 유지함

    

  배포전략 (Deployment Strategy) 작성방법

spec:
  strategy:
    type: STRATEGY_TYPE
    STRATEGY_TYPE:
    ~~~

   (Kubernetes에서 지원하는) 배포전략 종류 

     RollingUpdate: 롤링 업데이트 (빠른 롤백이 가능)

       기존 애플리케이션 버전에서 새로운 애플리케이션 버전으로 점진적으로 교체하는 배포 전략

       maxUnavilable : 롤링 업데이트 중 사용할 수 없는 최대 pod의 수 (기본값: 전체 pod의 25%/정수, 비율 지정가능)

       maxSurge: 교체과정에서 pod가 설정한 replicas 보다 초과생성되는 최대 pod의 갯수 (기본값: 전체 pod의 25%)

       minReadySeconds: 롤링 업데이트 시에 pod가 준비되기까지 대시하는 시간 지정(기본값 0초)

     Recreate: 재생성 (롤백 시, 다운타임이 길어짐)

      기존의 pod가 모두 삭제되고 새로운 pod가 생성됨

      모든 pod가 삭제되므로 다운타임이 발생할 수 밖에 없음 

 

    Deployment 롤링 업데이트

    롤링 업데이트 명령어 사용방법

    kubectl set image deployment DEPLOYMENT CONTAINER=IMAGE

    kubectl set image deploymnet -f DEPLOYMENT_FILE CONTAINER=IMAGE

    kubectl set image deployment myapp-deploy myapp=devops2341/go-myweb:v2

   

    롤링 업데이트 (v1 -> v2)
     kubectl set image deployment myapp-deploy myapp=devops2341/go-myweb:v2 

     (deployment 이름 지정/container의 이름 지정=이미지 이름 지정 )
    롤링 업데이트 (v2 -> v3)
     kubectl set image deployment myapp-deploy myapp=devops2341/go-myweb:v3 --record
    롤아웃 히스토리 확인
     kubectl rollout history deployment DEPLOYMENT
      * kubectl에서 --record 옵션 사용시 롤아웃 히스토리 CHANGE CAUSE에 사용 명령어를 기록할 수 있음

 

### rolling update 실습 ####
vagrant@kube-control1:~/work/20210903$ cat myapp-deploy-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  labels:
    app: myapp-deploy
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  minReadySeconds: 20
  replicas: 3

apiVersion: apps/v1
  selector:
    matchLabels:
      app: myapp-deploy
  template:
    metadata:
      labels:
        app: myapp-deploy
    spec:
      containers:
      - name: myapp
        image: devops2341/go-myweb:v1
        ports:
        - containerPort: 8080
          protocol: TCP
vagrant@kube-control1:~/work/20210903$ cat myapp-svc-deploy.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-deploy
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: myapp-deploy
    
vagrant@kube-control1:~/work/20210903$ kubectl get services
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes         ClusterIP      10.96.0.1      <none>           443/TCP        11d
myapp-svc-deploy   LoadBalancer   10.108.41.33   192.168.200.11   80:30000/TCP   58m 
vagrant@kube-control1:~/work/20210903$ kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE   READINESS GATES
myapp-deploy-bd79d5d5c-5lvvb   1/1     Running   0          5m16s   192.168.9.87      kube-node1   <none>           <none>
myapp-deploy-bd79d5d5c-bc2n5   1/1     Running   0          5m16s   192.168.119.139   kube-node3   <none>           <none>
myapp-deploy-bd79d5d5c-xdz9c   1/1     Running   0          5m16s   192.168.233.232   kube-node2   <none>           <none>
vagrant@kube-control1:~/work/20210903$ curl http://192.168.200.11
===Version 1.0===
Hello World!
myapp-deploy-bd79d5d5c-5lvvb

vagrant@kube-control1:~/work/20210903$ kubectl describe pods myapp-deploy-bd79d5d5c-5lvvb
    Image:          devops2341/go-myweb:v1
vagrant@kube-control1:~/work/20210903$ kubectl set image deployment myapp-deploy myapp=devops2341/go-myweb:v2
deployment.apps/myapp-deploy image updated
vagrant@kube-control1:~/work/20210903$ kubectl describe pods myapp-deploy-65bdb76f48-25lzv
    Image:          devops2341/go-myweb:v2
vagrant@kube-control1:~/work/20210903$ kubectl set image deployment myapp-deploy myapp=devops2341/go-myweb:v3 --record
deployment.apps/myapp-deploy image updated
vagrant@kube-control1:~/work/20210903$ kubectl describe pods myapp-deploy-678f76c6d7-2bzff
    Image:          devops2341/go-myweb:v3
    
 vagrant@kube-control1:~/work/20210903$ kubectl rollout history deployment myapp-deploy
deployment.apps/myapp-deploy
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         kubectl set image deployment myapp-deploy myapp=devops2341/go-myweb:v3 --record=true
### kubectl set image 명령어 입력시 --record 옵션을 통해 history에 기록을 남길 수 있다.

vagrant@kube-control1:~/work/20210903$ kubectl rollout undo deployment myapp-deploy --to-revision=2
deployment.apps/myapp-deploy rolled back
#### kubectl rollout undo --to-revison N 으로 이전 상태로 롤백 가능하다.

vagrant@kube-control1:~/work/20210903$ kubectl describe pods myapp-deploy-65bdb76f48-6vpqp
    Image:          devops2341/go-myweb:v2

 

 

 

 

728x90
Comments