[kubernetes] Blue-Green deployment

박원균·2021년 11월 14일
0

Kubernetes

목록 보기
15/24
post-thumbnail

sock-shop

그냥 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

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인 컨테이너만 생성하겠다.
      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세트를 생성해주고 servicespec.selector.XXX를 이용하여 이미 생성된 파드를 교체해주는 작업만을 해주면 됩니다.

# sock-shopBlueGreen.yaml
spec:
  selector:
    color: green

$ kubectl patch service carts -p "$(cat sock-shopBlueGreen.yaml)"

profile
함바라기

0개의 댓글