기존 Pod들을 전체 삭제하고 새로운 Pod들을 만든 후 트래픽을 연결하는 방식
새로운 Pod을 한번에 설정한 갯수만큼 만들어 연결한 후 기존 Pod을 삭제하는 방식
기존 Pod들과 동일한 갯수의 새로운 Pod을 만들어 순간적으로 전체 트래픽을 연결하는 방식
위험이 있는지 확인하고 없다는 판단이 들면 정식 배포하는 방식
apiVersion: apps/v1
kind: Deployment
metadata:
name: dep-1
spec:
selector:
matchLabels:
type: app
replicas: 2
**strategy:
type: Recreate
revisionHistoryLimit: 1 # 과거의 ReplicaSet을 몇개 살려놓을지**
template:
metadata:
labels:
type: app
spec:
containers:
- name: container
image: something
maxSurge
만큼 증가maxUnavailable
만큼 감소apiVersion: apps/v1
kind: Deployment
metadata:
name: dep-2
spec:
selector:
matchLabels:
type: app
replicas: 2
**strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 동시에 생성할 수 있는 Pod의 최대 갯수 (%로도 가능, 기본값: replicas 25%)
maxUnavailable: 1 # 동시에 삭제할 수 있는 Pod의 최대 갯수 (%로도 가능, 기본값: replicas 25%)
minReadySeconds: 10 # 10초 간격으로 생성 및 삭제 반복**
template:
metadata:
labels:
type: app
spec:
containers:
- name: container
image: something
selector
를 새로 만든 Deployment의 라벨로 변경한다.$ kubectl patch svc test-service -p '{"spec": {"selector": {"color": "green"}}}'
replicas
를 0으로 만듬새로운 ReplicaSet은 기존 Pod과 연결되는 상황을 방지하기 위해 기존 라벨 이외에 새로운 라벨(
pod-template-hash: {hash값}
)도 함께 만들어 연결
# blue-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dep-1
spec:
replicas: 2
selector:
matchLabels:
app: test-pod
color: blue
template:
metadata:
labels:
app: test-pod
color: blue
spec:
containers:
- name: test-pod
image: something:0.1 # 구버전
ports:
- containerPort: 8080
# test-service.yaml
apiVersion: v1
kind: Service
metadata:
name: test-service
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: test-pod
color: blue
# green-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dep-1
spec:
replicas: 2
selector:
matchLabels:
app: test-pod
color: green
template:
metadata:
labels:
app: test-pod
color: green
spec:
containers:
- name: test-pod
image: something:0.2 # 신버전
ports:
- containerPort: 8080