본문 바로가기

DevOps/쿠버네티스(Kubernetes)

[CKA] Kubernetes Deployment

Kubernetes Deployment


POD, 복제본 세트 및 기타 쿠버네티스 개념은 잊어버리고 프로덕션 환경에서 애플리케이션을 구현하는 방법에 대해 알아보자.
예를 들어 프로덕션 환경에 배포해야 하는 웹 서버가 있다고 가정해 보자. 실행되는 웹 서버의 인스턴스는 하나만 필요하지 않을것이다.
또한, 도커 레지스트리에서 새로운 버전의 애플리케이션 빌드를 사용할 수 있게 될 때마다 Docker 인스턴스를 원활하게 업그레이드 하고싶다. 그러나 인스턴스를 업그레이드할 때 모든 인스턴스를 한 번에 업그레이드하지는 않을 것이다. 이로 인해 애플리케이션에 액세스하는 사용자에게 영향을 줄 수 있으므로 차례차례로 애플리케이션을 업그레이드한다. 이러한 업그레이드를 롤링 업데이트(Rolling Update)라고 한다.


수행한 업그레이드 중 하나에서 예기치 않은 오류가 발생하여 최근에 수행된 변경 내용을 롤백할 수 있도록 최근 변경 내용을 실행 취소하라는 메시지가 표시되었다고 가정하자. 예를들어 기본 웹 서버 버전 업그레이드, 환경 확장 및 리소스 할당 수정 등과 같이 환경을 여러 번 변경하고자 한다고 가정해 보면, 명령이 실행된 후 즉시 각 변경 사항을 적용하지 않으려면 환경에 일시 중지를 적용하고, 변경한 다음 다시 시작하여 모든 변경 사항이 롤아웃되도록 해야 한다.

 

 

이러한 모든 기능은 kubernetes 배포 환경에서 사용할 수 있다. 지금까지 이 과정은 웹 애플리케이션과 같은 애플리케이션의 단일 인스턴스를 배포하는 POD에 대한 설명이다. 이 경우에는 각 컨테이너는 POD에 캡슐화된다. 이러한 여러 POD는 Controller 또는 Replica Set의 복제를 사용하여 배포된다. 그런 다음 계층에서 더 높은 수준의 있는 Kubernetes 객체인 Deployment가 제공된다.

Deployment는 롤링 업데이트를 사용하여 기본 인스턴스를 원활하게 업그레이드하고, 변경 내용을 실행 취소하며, 필요에 따라 변경 내용을 일시 중지 및 재개할 수 있는 기능을 제공한다.

deployment-definition.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
    type: front-end
spec:
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
  replicas: 3
  selector:
    matchLabels:
      type: front-end


그럼 어떻게 Deployment를 생성해야 할까? 이전 구성 요소와 마찬가지로 먼저 배포 정의 파일을 생성한다. 배포 정의 파일의 내용은 kind를 제외하고 Replica Set 정의 파일과 유사하다.
apps/v1인 apiVersion, 이름과 레이블이 있는 metadata, template, replicas 및 selector가 있는 spec이 있다. template 내부에는 pod 가 정의되어 있다.

$ kubectl create -f deployment-definition.yml

파일이 준비되면 kubectl create 명령을 실행하고 배포 정의 파일을 지정한다.

$ kubectl get deployments
NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
myapp-deployment 3         3         3            3           21s

그런 다음 kubectl get deployments 명령을 실행하여 새로 생성된 배포를 확인한다. deployment는 자동으로 Replica Set을 생성한다.

$ kubectl get replicaset
NAME                             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
myapp-deployment-437648264b58     3         3         3            3           21s

따라서 kubectl get replcaset 명령을 실행하면 deployment 이름의 새 Replica Set이 표시된다. Replica Set이 궁극적으로 Pod를 만든다.

$ kubectl get pods
NAME                                  READY      STATUS    RESTARTS    AGE
myapp-deployment-437648264b58-dsjkd1   1/1       Running      0         2m
myapp-deployment-437648264b58-qdnkd2   1/1       Running      0         2m
myapp-deployment-437648264b58-ro38dw   1/1       Running      0         2m


그래서 만약 kubectl get pods 명령을 실행한다면. deployment 이름과 Replica Set이 있는 Pod를 볼 수 있다.


지금까지는 Replica Setdeployment 간에 deployment라는 새로운 쿠버네티스 개체가 생성되었다는 사실을 제외하고는 큰 차이가 없다. 생성된 모든 개체를 한 번에 확인하려면 kubectl get all 명령을 실행한다. 이 경우 deployment가 생성된 다음 deployment의 일부로 생성된 Replica Set 뒤에 세개의 Pod가 있음을 확인할 수 있다.







출처:
https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/learn/lecture/14295508#overview


'DevOps > 쿠버네티스(Kubernetes)' 카테고리의 다른 글

[CKA] Kubernetes Namespace  (1) 2022.09.29
[CKA] Kubernetes Services  (0) 2022.09.24
[CKA] Kubernetes Replication Controller/ReplicaSets  (0) 2022.09.14
[CKA] Kubernetes Pod 와 YAML 파일  (0) 2022.09.03
[CKA] Kubernetes Pod  (0) 2022.09.03