본문 바로가기
네트워크/k8s

[k8s] 15. Deployment - 실습

by Lauren X Ming 2021. 2. 14.

Deployment 실습

image

1. Recreate 실습

image

Deployment - Recreate

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  selector:
    matchLabels:
      type: app
  replicas: 2
  strategy:
    type: Recreate
  revisionHistoryLimit: 1
  template:
    metadata:
      labels:
        type: app
    spec:
      containers:
      - name: container
        image: kubetm/app:v1
      terminationGracePeriodSeconds: 10
  • kind는 Deployment
  • selector에 type:app
  • Pod는 2개
  • Recreate 방식으로 배포
  • RevisionHistoryLimit: 1이여서 여러번 배포를 해도 하나의 ReplicaSet만 남음
  • template으로 label에 type:app이 있음
  • 이미지는 v1으로 만들어짐

Service

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    type: app
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080

실습 과정

  1. Deployment - Recreate 생성
  2. 상세에서 ReplicaSet 등 Labels, Pods 개수, images 정보 확인
  3. Labels에 보면 pod-template-hash가 있음 --> Deployment는 여러 ReplicaSet을 만들고, 각 ReplicaSet은 자신의 Pod를 구별하기 위해서 추가적인 라벨과 selector를 붙임
    image
  4. 생성된 파드에서도 template-hash 라벨을 확인
  5. Service 생성 후 Cluster IP 복사 후 마스터 노드에서 다음 커맨드 입력
    image
    while true; do curl 10.105.226.102:8080/version; sleep 1; done
    image
  6. Deployment 편집으로 image를 v1에서 v2로 변경하고 마스터 노드 쉘 보기
    image
  7. ReplicaSet 확인
    image
    기존 파드 v1은 2->0이 되고, v2는 2개가 생성됨
  8. Deployment에서 image v3로 변경하고 ReplicaSet 확인
    ReplicaSet v1은 삭제되고 v2, v3만 남음
    revisionHistoryLimit: 1이기 때문
  9. Deployment에서 image를 v3->v2로 변경하여 롤백 시행해도 되지만 명령어로 롤백 시행
    kubectl rollout undo deployment deployment-1 --to-revision=2
    deployment-1: 롤백할 대상
    --to-revision=2: 2번째로 배포한 대상으로 롤백하겠다
    revison 확인 방법 - 대시보드, 명령어
    image
    kubectl rollout history deployment deployment-1
    image
  10. 롤백 완료
    image

2. RollingUpdate 실습

image

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2
spec:
  selector:
    matchLabels:
      type: app2
  replicas: 2
  strategy:
    type: RollingUpdate
  minReadySeconds: 10
  template:
    metadata:
      labels:
        type: app2
    spec:
      containers:
      - name: container
        image: kubetm/app:v1
      terminationGracePeriodSeconds: 0
  • minReadySeconds: 롤링업데이트를 지켜보기 위해 텀을 주는 명령어

Service

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    type: app2
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080

실습 과정

  1. Deployment 생성
  2. 서비스 생성
  3. 생성한 서비스의 cluster IP를 복사하여 마스터 노드에 다음 명령어 실행
    while true; do curl 10.99.92.141:8080/version; sleep 1; done
  4. Deployment 편집으로 v2로 변경
    image
    Downtime 없이 v1, v2 번갈아가면서 접속되다가 v2로 변경됨

3. Blue/Green 실습

image

ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 2
  selector:
    matchLabels:
      ver: v1
  template:
    metadata:
      name: pod1
      labels:
        ver: v1
    spec:
      containers:
      - name: container
        image: kubetm/app:v1
      terminationGracePeriodSeconds: 0
  • ReplicaSet으로 Selector와 Label은 ver:v1로 설정

Service

apiVersion: v1
kind: Service
metadata:
  name: svc-3
spec:
  selector:
    ver: v1
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  • selector는 ver: v1으로 설정

ReplicaSet2

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica2
spec:
  replicas: 2
  selector:
    matchLabels:
      ver: v2
  template:
    metadata:
      name: pod1
      labels:
        ver: v2
    spec:
      containers:
      - name: container
        image: kubetm/app:v2
      terminationGracePeriodSeconds: 0

실습 과정

  1. ReplicaSet 생성
  2. 서비스 생성
  3. 서비스의 cluster ip를 복사하여 다음 명령어 실행
    while true; do curl 10.104.8.101:8080/version; sleep 1; done
  4. ReplicaSet2 생성
  5. 서비스의 selector에서 ver: v1 --> ver:v2로 변경
    image
    다운타임없이 바로 v2를 호출함
  6. 기존 ReplicaSet은 삭제를 해도 되고, replicas를 0으로 만들면 됨

출처

인프런 - 대세는 쿠버네티스