Replication Controller
의 새로운 버전으로 Label Selector
를 통해 노드 상의 여러 Pod의 생성/복제/삭제 등의 라이프 사이클을 관리한다.
Kubernetes에서 어플리케이션 단위를 관리하는 Controller이며 Kubernetes의 최소 유닛인 Pod에 대한 기준 스펙을 정의한 object 이다.
Kubernetes에서는 각 Object를 독립적으로 생성하기 보단 Deployment를 통해서 생성하는 것을 권장하고 있으며, Pod와 ReplicaSet의 기준 정보를 지정할 수 있다.
이러한 Deployment는
즉, 개념적으로 Deployment = ReplicaSet + Pod + history이며 ReplicaSet을 만드는 것보다 더 윗 단계의 선언(추상표현)이다.
Deployment는 위에서 보았듯이 Deployment 안에 ReplicaSet과 Pod를 담을 수 있는 구조로 되어 있다.
apiVersion: apps/v1beta1
kind: Deployment
metadata:
# Deployment 객체의 Unique한 명칭
name: deployment-example
spec:
# Deployment label selector for pod
selector:
matchLabels:
app: nginx
# 3 Pods should exist at all times.
replicas: 3
template:
metadata:
labels:
# Pod의 라벨
app: nginx
spec:
containers:
- name: nginx
# Run this image
image: nginx:1.10
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx-container
image: nginx
imagePullPolicy: Always
ports:
- containerPort: 80
kubectl apply -f /lab/deployment/nginx-deployment.yaml --record=true
root@master:/k8s/metallb# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
curl 1 1 1 1 110m
my-nginx-deployment 2 2 2 2 15s
root@master:/k8s/metallb# kubectl get rs
NAME DESIRED CURRENT READY AGE
curl-5cc7b478b6 1 1 1 111m
my-nginx-deployment-6877c7847d 2 2 2 65s
root@master:/k8s/metallb# kubectl get pod
NAME READY STATUS RESTARTS AGE
curl-5cc7b478b6-vwtmj 1/1 Running 2 111m
my-nginx-deployment-6877c7847d-j6nml 1/1 Running 0 71s
my-nginx-deployment-6877c7847d-wr7c9 1/1 Running 0 71s
status
Desired
: displays the desired number of replicas of the application, which you defined when you create the Deployment (desire state)
Current
: displays how many replicas are currently running
Up-to-date
: displays the number of replicas that have been updated to achieve the desired state
Available
: displays how many replicas of the application are available to your users
Age
: displays the amount of time that the application has been running.
장애가 발생한 상황을 가정하여 Pod 한개를 삭제
root@master:/k8s/metallb# kubectl get pod
NAME READY STATUS RESTARTS AGE
curl-5cc7b478b6-vwtmj 1/1 Running 2 111m
my-nginx-deployment-6877c7847d-j6nml 1/1 Running 0 71s
my-nginx-deployment-6877c7847d-wr7c9 1/1 Running 0 71s
root@master:/k8s/metallb# kubectl delete pod my-nginx-deployment-6877c7847d-j6nml
pod "my-nginx-deployment-6877c7847d-j6nml" deleted
root@master:/k8s/metallb# kubectl get pod
NAME READY STATUS RESTARTS AGE
curl-5cc7b478b6-vwtmj 1/1 Running 2 114m
my-nginx-deployment-6877c7847d-7pm2c 1/1 Running 0 5s
my-nginx-deployment-6877c7847d-j6nml 0/1 Terminating 0 4m4s
my-nginx-deployment-6877c7847d-wr7c9 1/1 Running 0 4m4s
삭제를 하자마자 Deployment 에서 선언한 replicas에 의해 신규로 1개의 pod가 생성되었음을 알 수 있다.
ReplicaSet의 replicas의 숫자를 2에서 4로 변경
spec:
progressDeadlineSeconds: 600
replicas: 4
결과확인 시
root@master:/k8s/metallb# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-deployment-6877c7847d-9vwwj 1/1 Running 0 22s
my-nginx-deployment-6877c7847d-gqp2g 1/1 Running 0 22s
my-nginx-deployment-6877c7847d-nx9zq 1/1 Running 0 22s
my-nginx-deployment-6877c7847d-sqg22 1/1 Running 0 22s
이미지를 다른 버전으로 업데이트하고 이전 버전의 이미지로 돌리는 과정을 실습한다.
Pod의 이미지를 nginx:latest에서 nginx:1.9.1로 변경한다.
변경에 대한 이력을 기록하기 위해 annotations
에 change-cause
를 추가할 수 있다. 이것은 추후에 이력 조회시 변경내용으로 조회되는 항목이다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
annotations:
kubernetes.io/change-cause: "set image nginx 1.9.1"
spec:
selector:
matchLabels:
run: my-nginx
replicas: 4
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx-container
image: nginx:1.9.1
imagePullPolicy: Always
ports:
- containerPort: 80
kubectl apply -f /lab/deployment/nginx-deployment.yml
root@master:/k8s/metallb# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
curl 1 1 1 1 110m
my-nginx-deployment 2 2 2 2 15s
root@master:/k8s/metallb# kubectl get rs
NAME DESIRED CURRENT READY AGE
curl-5cc7b478b6 1 1 1 111m
my-nginx-deployment-6877c7847d 2 2 2 65s
root@master:/k8s/metallb# kubectl get pod
NAME READY STATUS RESTARTS AGE
curl-5cc7b478b6-vwtmj 1/1 Running 2 111m
my-nginx-deployment-6877c7847d-j6nml 1/1 Running 0 71s
my-nginx-deployment-6877c7847d-wr7c9 1/1 Running 0 71s
kubectl rollout undo deployment.v1.apps/my-nginx-deployment --to-revision=1
Deployment는 하위의 ReplicaSet과 Pod를 관리하는 리소스이다. 따라서 Deployment를 삭제하면 하위의 ReplicaSet과 Pod가 함께 삭제된다.
# kubectl delete deployment my-nginx-deployment
deployment.extensions "my-nginx-deployment" deleted
# kubectl get rs
No resources found.
# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-deployment-6877c7847d-sm4cs 0/1 Terminating 0 2m35s
my-nginx-deployment-6877c7847d-zbqxk 0/1 Terminating 0 2m38s
my-nginx-deployment-6877c7847d-zxhlq 0/1 Terminating 0 2m38s