Deployment
Deployment
왜 Deployment?
- 애플리케이션을 운영한다고 했을 때, 롤백이나 업데이트를 할 일이 생긴다.
- 이 경우 운영되고 있는 애플리케이션을 모두 종료했다가 다시 배포하는 과정은 서비스가 중단될 수 있으므로 좋지 않으며, 수동으로 하기에 번거롭다.
- 이러한
Rolling Updates,Undo Changes,Pause,Resume Changes등을 기능을 갖추고 있으며, 이를 위해ReplicaSet을 컨트롤하는 컨트롤러가Deployment이다.
예시: 업데이트
replicas: 3 가정
- 새로운
ReplicaSet생성 - 새로운
ReplicaSet에 업데이트 된Pod1개 생성 - 기존
ReplicaSet에Pod1개 줄임 - 위 과정 추가로 2회 반복
- 기존
ReplicaSet은replicas: 0인 상태로 유지된다. (롤백을 위해)
예시: 롤백
replicas: 3 가정
- 돌아가기를 원하는 시점의
ReplicaSet의replicas가 늘어난다. - 롤백되기를 원하는 시점의
ReplicaSet에Pod1개 생성 - 기존
ReplicaSet에Pod1개 줄임 - 위 과정 추가로 2회 반복
정보
롤백을 위해 replicas: 0으로 유지되고 있는 ReplicaSet들은 Deployment의 revisionHistoryLimit로 최대 갯수를 관리할 수 있다. (기본 10개)
YAML
# deployment-definition.yaml
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
apiVersion:apps/v1kind:Deployment- 나머지는
ReplicaSet과 정확히 같다. Deployment를 생성하였을 때, 정의된 요소와 맞는ReplicaSet을 자동으로 생성한다.- 이에
ReplicaSet을 yaml로 정의해서 생성하는 경우는 거의 없고,Deployment를 생성해서ReplicaSet이 자동으로 생성되게 한다.
- 이에
정보
어떤 Deployment가 어떤 ReplicaSet을 관리할지에 대한 정보는 내부적으로 ReplicaSet의 메타데이터인 ownerReferences 데이터로 구별된다. (쿠버네티스의 모든 "상위 컨트롤러 -> 하위 리소스" 관계는 ownerReferences 데이터로 구별된다 즉,Pod가 어떤 ReplicaSet에 관리되는지도 마찬가지)
kubectl create -f deployment-definition.yaml
Deployment생성
kubectl get deployment
- 생성된
Deployment확인
kubectl get replicaset
Deployment생성으로 인해 생성된ReplicaSet확인
Deployment로 Pod 수정하기
Pod는 거의 불변
- 이미 생성된 Pod는 다음 4가지를 제외하고 스펙을 수정할 수 없다:
spec.containers[*].imagespec.initContainers[*].imagespec.activeDeadlineSecondsspec.tolerations
- 즉, 거의 불변에 가깝다.
kubectl edit pod <pod-name>으로 변경 불가한 스펙을 수정할 시, 저장했을 때 에러가 발생한다.- 수정하기 위해서는,
Pod의 yaml를 추출하고, 수정한 뒤, 기존Pod를delete하고, 다시 수정한 yaml 파일로create해야한다. (apply로 수정 불가)
Deployment는 수정 가능
Deployment는Pod템플릿을 포함하고 있고,Deployment스펙을 수정하여 반영하면 자동으로Pod를 재생성한다. (Rolling 방식으로 재생성)kubectl edit deployment <deployment-name>으로Pod의template부분을 수정하면 변경한Pod스펙으로 롤아웃한다.- 물론, yaml 추출 후 수정하고
apply도 가능
레퍼런스
- https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
- https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/
- https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/
- https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/
- Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests (Mumshad)