그냥 deployment를 blue-green deployment를 적용시켜봤습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: carts
labels:
name: carts
namespace: sock-shop
spec: # 파드에 생성될 컨테이너 정보
replicas: 1 # 레플리카 1개
selector:
matchLabels:
name: carts # 템플릿에 라벨의 키가 name이고 value가 carts인 컨테이너만 생성하겠다.
template:
metadata:
labels:
name: carts # metadata.labels.name이 carts이고 셀렉터에 매치되므로 생성됩니다.
spec:
containers: # 컨테이너 정보
- name: carts
image: weaveworksdemos/carts:0.4.8
# dockerhum에 이 프로젝트를 만든 사람이 컨테이너를 올려놓았습니다.
env:
- name: JAVA_OPTS # 실행하기에 앞서 JAVA 옵션의 매개변수들 입니다.
value: -Xms64m -Xmx128m -XX:+UseG1GC -Djava.security.egd=file:/dev/urandom -Dspring.zipkin.enabled=false
# -Xms64m :최소 메모리 64m , -Xmx128m: 최대 메모리 128m, -XX:+UseG1GC : 가비지 콜렉션 작동방식 ...
resources:
limits: # 리소스 제한
cpu: 300m
memory: 500Mi
requests: # 최소 요구 사항
cpu: 100m
memory: 200Mi
ports:
- containerPort: 80
securityContext: # 컨테이너내에서 동작하는 프로세스의 uid,gid 설정 , 프로세스에 커널에 대한 접근 권하을 부여
runAsNonRoot: true # 유저지시문
runAsUser: 10001 # uid 지정
capabilities: # 허용할 기능들
drop: # drop
- all
add: # add
- NET_BIND_SERVICE
readOnlyRootFilesystem: true
volumeMounts: # 볼륨 마운트
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir:
medium: Memory
nodeSelector: # 파드가 생성될 노드를 지정
beta.kubernetes.io/os: linux
---
apiVersion: v1
kind: Service # deployments.app/carts의 엔드포인트를 가짐
metadata:
name: carts
annotations:
prometheus.io/scrape: 'true'
labels:
name: carts
namespace: sock-shop
spec:
ports:
# the port that this service should serve on
- port: 80
targetPort: 80
selector: # 연결해줄 deployments = carts
name: carts
apiVersion: apps/v1
kind: Deployment
metadata:
name: carts
labels:
name: carts
namespace: sock-shop
spec: # 파드에 생성될 컨테이너 정보
replicas: 1 # 레플리카 1개
selector:
matchLabels:
name: carts # 템플릿에 라벨의 키가 name이고 value가 carts인 컨테이너만 생성하겠다.
color: blue
template:
metadata:
labels:
name: carts # metadata.labels.name이 carts이고 셀렉터에 매치되므로 생성됩니다.
color: blue
spec:
containers: # 컨테이너 정보
- name: carts
image: weaveworksdemos/carts:0.4.8
# dockerhum에 이 프로젝트를 만든 사람이 컨테이너를 올려놓았습니다.
env:
- name: JAVA_OPTS # 실행하기에 앞서 JAVA 옵션의 매개변수들 입니다.
value: -Xms64m -Xmx128m -XX:+UseG1GC -Djava.security.egd=file:/dev/urandom -Dspring.zipkin.enabled=false
# -Xms64m :최소 메모리 64m , -Xmx128m: 최대 메모리 128m, -XX:+UseG1GC : 가비지 콜렉션 작동방식 ...
resources:
limits: # 리소스 제한
cpu: 300m
memory: 500Mi
requests: # 최소 요구 사항
cpu: 100m
memory: 200Mi
ports:
- containerPort: 80
securityContext: # 컨테이너내에서 동작하는 프로세스의 uid,gid 설정 , 프로세스에 커널에 대한 접근 권하을 부여
runAsNonRoot: true # 유저지시문
runAsUser: 10001 # uid 지정
capabilities: # 허용할 기능들
drop: # drop
- all
add: # add
- NET_BIND_SERVICE
readOnlyRootFilesystem: true
volumeMounts: # 볼륨 마운트
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir:
medium: Memory
nodeSelector: # 파드가 생성될 노드를 지정
beta.kubernetes.io/os: linux
---
# 블루 그린 배포전략
apiVersion: apps/v1 # Green
kind: Deployment
metadata:
name: carts
labels:
name: carts
namespace: sock-shop
spec: # 파드에 생성될 컨테이너 정보
replicas: 1 # 레플리카 1개
selector:
matchLabels:
name: carts # 템플릿에 라벨의 키가 name이고 value가 carts인 컨테이너만 생성하겠다.
color: green
template:
metadata:
labels:
name: carts # metadata.labels.name이 carts이고 셀렉터에 매치되므로 생성됩니다.
color: green
spec:
containers: # 컨테이너 정보
- name: carts
image: weaveworksdemos/carts:latest
# dockerhum에 이 프로젝트를 만든 사람이 컨테이너를 올려놓았습니다.
env:
- name: JAVA_OPTS # 실행하기에 앞서 JAVA 옵션의 매개변수들 입니다.
value: -Xms64m -Xmx128m -XX:+UseG1GC -Djava.security.egd=file:/dev/urandom -Dspring.zipkin.enabled=false
# -Xms64m :최소 메모리 64m , -Xmx128m: 최대 메모리 128m, -XX:+UseG1GC : 가비지 콜렉션 작동방식 ...
resources:
limits: # 리소스 제한
cpu: 300m
memory: 500Mi
requests: # 최소 요구 사항
cpu: 100m
memory: 200Mi
ports:
- containerPort: 80
securityContext: # 컨테이너내에서 동작하는 프로세스의 uid,gid 설정 , 프로세스에 커널에 대한 접근 권하을 부여
runAsNonRoot: true # 유저지시문
runAsUser: 10001 # uid 지정
capabilities: # 허용할 기능들
drop: # drop
- all
add: # add
- NET_BIND_SERVICE
readOnlyRootFilesystem: true
volumeMounts: # 볼륨 마운트
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir:
medium: Memory
nodeSelector: # 파드가 생성될 노드를 지정
beta.kubernetes.io/os: linux
---
apiVersion: v1
kind: Service # deployments.app/carts의 엔드포인트를 가짐
metadata:
name: carts
annotations:
prometheus.io/scrape: 'true'
labels:
name: carts
namespace: sock-shop
spec:
ports:
# the port that this service should serve on
- port: 80
targetPort: 80
selector: # 연결해줄 deployments = carts
name: carts
color: blue
여기서 중요한 점은 기존의 버전외에 최신의 버전 deployment
세트를 생성해주고 service
의 spec.selector.XXX
를 이용하여 이미 생성된 파드를 교체해주는 작업만을 해주면 됩니다.
# sock-shopBlueGreen.yaml
spec:
selector:
color: green
$ kubectl patch service carts -p "$(cat sock-shopBlueGreen.yaml)"