[배포] 3.무중단 배포 kubernetes
2. Kubernetes
쿠버네티스는 트래픽이 아래 그림처럼 처리가 된다.
Ingress는 url을 기준으로 매칭하는 Service로 라우팅을 하는 api gateway이고, Service는 여러개의 Pod로 로드밸런싱을 수행하는 Loadbalancer라고 이해하면 쉽다.
먼저 Kubernets를 사용해보자.
-
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를 생성해줍니다.
-
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를 찾는다.
-
정상적으로 Service가 생성된 후 Pod와 연결 되었는지 확인한다.
$ kubectl describe service my-service
정상적으로 연결되었다면 endpoint가 설정되어 있다.
- browser를 통해 endpoint로 접속하여 정상적으로 서비스가 동작하는지 확인한다.
Rolling 배포
k8s의 Deployment는 배포를 위해 기본적으로 Rolling 배포를 사용하기 때문에 굉장히 쉽다.
-
Deployment의 컨테이너 이미지를 변경한다.
$ kubectl set image deployments/my-deploy myapp-container=zkdlu/myapp:v2
kubectl set image deployments/{ deployments 이름 } { container명 } = { 새로운 이미지 }
-
끝
Blue/Green 배포
-
새 버전의 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
-
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
-
Service 적용하기
$ kubectl apply -f my-service.yml
-
끝