매직코드
article thumbnail

쿠버네티스 안내서와 패스트캠퍼스 강의를 보고 작성한 포스팅입니다.

 

쿠버네티스의 구조를 다시 한 번 살펴보자면 아래와 같이 컨테이너 < Pod < ReplicaSet < Deployment < Service 순서대로 각각을 감싸고 있다. 이번 실습에서는 Deployment를 생성하고 그 내부에 있는 ReplicaSet이나 Pod를 수정해본다.

 

 

Deployment 만들기

이제는 별다른 설명 없이 코드만 봐도 어떤 느낌인지 감이 오기 시작했다.

# 1. 도커실행
# 2. minikube 시작
minikube start
cd Desktop/kube

# 3. Deployment 생성
vi echo-dep.yml

apiVersion: apps/v1
kind: Deployment
metadata:				# Deployment의 메타데이터
  name: echo-deploy
spec:
  replicas: 4				# 원하는 Pod 개수
  selector:
    matchLabels:
      app: echo
      tier: app
  template:				# Pod 기본정보 설정
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
          
# 4. yml파일 실행
kubectl apply -f echo-dep.yml

# 5. 생성된 pod, replicaset, deployment 확인
kubectl get po,rs,deploy

이제는 어느정도 손에 익게 된 yaml파일 설정하고 확인하기!

deployment만 생성했는데 yaml파일에서 작성해준 설정에 따라 그 안에 들어가는 replicaset과 pod가 자동 생성되었다.

deployment는 어떻게 보면 replicaset과 비슷해보이는데 Pod를 새로운 이미지로 업데이트 할 때 Deployment를 이용하면 손쉽게 업데이트 할 수 있다.

 

# Pod image 업데이트하기
# 1. 새 설정파일 생성
vi echo-dep2.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: echo
      tier: app
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v2	# 이미지 업데이트
          
# 2. yml파일 실행
kubectl apply -f echo-dep2.yml

# 3. 생성된 pod, replicaset, deployment 확인
kubectl get po,rs,deploy

 

 

 

업데이트 하는 과정을 보면 Pod가 한번에 짠! 하고 업데이트가 되는게 아니라 Deployment 안에 업데이트용 ReplicaSet가 생성되고, Pod는 기존 ReplicaSet에서 업데이트용 ReplicaSet으로 순차적으로 이동한다.

그래서 Status를 보면 Terminating, Pending, Running의 상태를 확인할 수 있다.

 

Rolling Update

서비스 중단 없이 애플리케이션을 업데이트 하기 위해서 제공하는 기능이다.

만약 Pod 가 많은 경우에는 Pod를 하나씩 옮기는게 아니라 여러개씩 옮길 수 있도록 설정할 수 있다.

yaml 설정파일에서 selector: 와 template: 사이에 strategy: 를 넣어서 rollingUpdate에 대한 정보를 넣어주면 된다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: echo
      tier: app
------------------추가------------------
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 3
      maxUnavailable: 3
---------------------------------------
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
          livenessProbe:	# 이전 실습에서 배웠던 livenessProbe로 문제가 있는 경우 재시작하도록 설정
            httpGet:
              path: /
              port: 3000

minReadySeconds

새롭게 생성된 pod의 컨테이너가 어떤 것과도 충돌하지 않고 사용할 수 있도록 준비되어야 하는 최소시간을 지정하는 필드이다. 기본값은 0이지만 적당한 시간을 주지 않으면 순단현상이 일어난다.

 

strategy:

  type:

  tpye은 Recreate와 rollingUpdate 중에 하나를 설정하면 된다. 단어에서 알 수 있듯이 Recreate는 Pod가 삭제된 후 재생성되는 것이고, rollingUpdate는 순차적으로 업데이트 되는 기능이다.

  rollingUpdate:

    maxSurge:

    rolling update 를 진행할 때 추가적으로 만들 수 있는 최대 Pod 개수를 의미한다. 정수값으로 넣어줘도 되고, %로 넣어줘도 된다.

    maxUnavailable:

    rolling update 중 사용할 수 없는 Pod의 최대 개수를 의미한다. 

    둘 모두 기본값은 25%이고, 둘 중 하나를 0으로 설정하는 것은 가능하지만 둘 다 0으로 설정할 수는 없다.

 


실습

1. 다음 조건을 만족하는 Deployment를 만드세요

Deployment name : nginx

Deployment Label : app:nginx

Deployment 복제수: 3

Container name: nginx

Container image: nginx:1.14.2

더보기
vi quiz-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          
kubectl apply -f quiz-deployment.yml
kubectl get po,rs,deploy

 

2. 복제 개수를 5로 변경하세요

더보기

yaml파일을 새롭게 만들어서 replicas: 5를 하는 방법도 있지만 명령어로 바로 실행할 수 있다.

kubectl scale deployment/nginx --replicas=5

 

3. 이미지를 nginx:1.19.5로 변경하세요

더보기

이미지 변경 역시 새로운 설정파일을 만들어도 되지만 명령어로 실행해보았다.

kubectl set image deployment/nginx nginx=nginx:1.19.5

kubectl set image deployment/[디플로이먼트이름] [업데이트 할 컨테이너 이름]=[업데이트하는 이미지]


마무리

모든 실습이 끝났을 땐 만들어둔 모든것을 종료 및 삭제한다.

# deployment 삭제
kubectl delete deployment 디플로이먼트이름

# 파일 경로로 삭제
kubectl delete -f yaml파일이름

# 미니큐브 종료(stop), 삭제(delete)
minikube stop
minikube delete

 

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!