[배포] 3.무중단 배포 kubernetes

2. Kubernetes

쿠버네티스는 트래픽이 아래 그림처럼 처리가 된다.

kubernetes-traffic

Ingress는 url을 기준으로 매칭하는 Service로 라우팅을 하는 api gateway이고, Service는 여러개의 Pod로 로드밸런싱을 수행하는 Loadbalancer라고 이해하면 쉽다.

먼저 Kubernets를 사용해보자.

  1. Pod 정보를 포함한 Deployment를 생성한다.

    # my-deploy.yml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deploy
      labels:
        name: app
    spec:
      replicas: 3
      selector:
        matchLabels:
          name: app
      template:
        metadata:
          labels:
            name: app
        spec:
          containers:
            - name: myapp-container
              image: zkdlu/myapp:v1
              ports:
                - containerPort: 8080
    
    $ kubectl create -f my-deploy.yml
    

    Pod는 생성 될 때 가상의 유동 IP를 부여 받지만, 외부에서 Pod로 직접 접근이 불가능 합니다.

    Pod에 접근하기 위해 Service를 생성해줍니다.

  2. Pod로 연결 된 Loadbalancer 타입의 Service를 생성한다.

    # my-service.yml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        name: app
      ports:
        - port: 80
          protocol: TCP
          targetPort: 8080
      type: LoadBalancer
    
    $ kubectl create -f my-service.yml
    

    Service는 selector의 {key}:{value}로 연결할 Pod를 찾는다.

  3. 정상적으로 Service가 생성된 후 Pod와 연결 되었는지 확인한다.

   $ kubectl describe service my-service

정상적으로 연결되었다면 endpoint가 설정되어 있다.

  1. browser를 통해 endpoint로 접속하여 정상적으로 서비스가 동작하는지 확인한다.

Rolling 배포

k8s의 Deployment는 배포를 위해 기본적으로 Rolling 배포를 사용하기 때문에 굉장히 쉽다.

  1. Deployment의 컨테이너 이미지를 변경한다.

    $ kubectl set image deployments/my-deploy myapp-container=zkdlu/myapp:v2
    

    kubectl set image deployments/{ deployments 이름 } { container명 } = { 새로운 이미지 }

Blue/Green 배포

  1. 새 버전의 Pod 정보를 포함한 Deployment를 생성한다.

    # my-deploy2.yml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deploy
      labels:
        name: app2
    spec:
      replicas: 3
      selector:
        matchLabels:
          name: app2
      template:
        metadata:
          labels:
            name: app2
        spec:
          containers:
            - name: myapp-container
              image: zkdlu/myapp:v2
              ports:
                - containerPort: 8080
    
  2. Service의 selector를 새로 만든 Pod로 연결한다.

    # my-service.yml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        name: app2
      ports:
        - port: 80
          protocol: TCP
          targetPort: 8080
      type: LoadBalancer
    
  3. Service 적용하기

    $ kubectl apply -f my-service.yml