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 Set와 deployment 간에 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 |