brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Aug 18. 2021

161. GCP 쿠버네티스 배포


<1> cloudshell 로  쿠버네티스 클러스터  만들기

<2> 배포 객체 알아보기

<3> 배포 확장

<4> 순차적 업데이트 하기

<5> 배포  계속 하기 

<6> 롤백 

<7>  카나리 배포

<8> Blue/Green 배포

<9> 개인 정리

<10> 같이 보면 좋을 사이트




<1> cloudshell 로  쿠버네티스 클러스터  만들기


1

 cloudshell  실행


2

인증


인증 설정 참고하기

https://brunch.co.kr/@topasvga/1132


gcloud auth list

.           Credentialed Accounts

ACTIVE  ACCOUNT


To set the active account, run:

    $ gcloud config set account `ACCOUNT`


3

프로젝트 기준이다

프로젝트 확인하자

gcloud config list project

[core]

project = xxxxxx-gcp-01-xxxxxxxxxxxxx


Your active configuration is: [cloudshell-11143]



4

지역 설정하기

gcloud config set compute/zone us-central1-a

Updated property [compute/zone].


5

컨테이너 클러스터 만들기

gcloud container clusters create bootcamp --num-nodes 5 --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"

WARNING: Starting in January 2021, clusters will use the Regular release channel by default when `--cluster-version`, `--release-channel`, `--no-enable-autoupgrade`, and `--no-enable-autorepair` flags are not specified.

WARNING: Starting with version 1.18, clusters will have shielded GKE nodes by default.


NAME      LOCATION       MASTER_VERSION  MASTER_IP        MACHINE_TYPE  NODE_VERSION    NUM_NODES  STATUS

bootcamp  us-central1-a  1.20.8-gke.900  104.198.218.137  e2-medium     1.20.8-gke.900  5          RUNNING


6

단축 명령어와  정보 확인하기


alias k=kubectl

complete -F __start_kubectl k

k get ns,no,po,svc,deploy,rs,ing,ep  


$ k get ns,no,po,svc,deploy,rs,ing,ep

NAME                        STATUS   AGE

namespace/default           Active   5m20s

namespace/kube-node-lease   Active   5m22s

namespace/kube-public       Active   5m22s

namespace/kube-system       Active   5m22s


NAME                                           STATUS   ROLES    AGE     VERSION

node/gke-bootcamp-default-pool-f351b6bf-0dvf   Ready    <none>   4m31s   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-1n4p   Ready    <none>   4m28s   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-61sh   Ready    <none>   4m29s   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-kmg5   Ready    <none>   4m30s   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-l5kg   Ready    <none>   4m30s   v1.20.8-gke.900


NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE

service/kubernetes   ClusterIP   10.116.0.1   <none>        443/TCP   5m20s


NAME                   ENDPOINTS             AGE

endpoints/kubernetes   104.198.218.137:443   5m20s


7

다른 터미널로   모니터링 하기

watch -d 'kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide'

4개 있음.

네임 스페이스

노드

서비스

엔드포인트

NAME                        STATUS   AGE

namespace/default           Active   8m53s

namespace/kube-node-lease   Active   8m55s

namespace/kube-public       Active   8m55s

namespace/kube-system       Active   8m55s


NAME                                           STATUS   ROLES    AGE    VERSION           INTERNAL-IP   EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME 

node/gke-bootcamp-default-pool-f351b6bf-0dvf   Ready    <none>   8m4s   v1.20.8-gke.900   10.128.0.5    35.225.42.121    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3 

node/gke-bootcamp-default-pool-f351b6bf-1n4p   Ready    <none>   8m1s   v1.20.8-gke.900   10.128.0.4    35.226.102.103   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3 

node/gke-bootcamp-default-pool-f351b6bf-61sh   Ready    <none>   8m2s   v1.20.8-gke.900   10.128.0.2    34.123.244.168   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3 

node/gke-bootcamp-default-pool-f351b6bf-kmg5   Ready    <none>   8m3s   v1.20.8-gke.900   10.128.0.3    35.222.108.131   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3 

node/gke-bootcamp-default-pool-f351b6bf-l5kg   Ready    <none>   8m3s   v1.20.8-gke.900   10.128.0.6    34.71.140.207    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3 


NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE     SELECTOR

service/kubernetes   ClusterIP   10.116.0.1   <none>        443/TCP   8m53s   <none>


NAME                   ENDPOINTS             AGE

endpoints/kubernetes   104.198.218.137:443   8m53s



8. pod 상세 정보 보기

k  get pod -o wide




<2> 배포 객체 보기


1

deployment 설명

kubectl explain deployment


2

자세히 보기

kubectl explain deployment --recursive


3

kubectl explain deployment.metadata.name




<3>  배포 하기


1

vi deployments/auth.yaml


2

확인

cat deployments/auth.yaml



3

배포 만들기

kubectl create -f deployments/auth.yaml

deployment.apps/auth created


4

배포 확인


kubectl get deployments

NAME   READY   UP-TO-DATE   AVAILABLE   AGE

auth   0/1     1            0           7s


4

Pod 확인

kubectl get pods

NAME                    READY   STATUS    RESTARTS   AGE

auth-777f7b6c94-shp24   1/1     Running   0          5m52s


5

전체 확인

kubectl get ns,no,po,svc,deploy,rs,ing,ep


7개 있음.

네임 스페이스

노드

pod

서비스

디플로이먼트

리플리카셋

엔드포인트

$ kubectl get ns,no,po,svc,deploy,rs,ing,ep


NAME                        STATUS   AGE

namespace/default           Active   17m

namespace/kube-node-lease   Active   17m

namespace/kube-public       Active   17m

namespace/kube-system       Active   17m


NAME                                           STATUS   ROLES    AGE   VERSION

node/gke-bootcamp-default-pool-f351b6bf-0dvf   Ready    <none>   16m   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-1n4p   Ready    <none>   16m   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-61sh   Ready    <none>   16m   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-kmg5   Ready    <none>   16m   v1.20.8-gke.900

node/gke-bootcamp-default-pool-f351b6bf-l5kg   Ready    <none>   16m   v1.20.8-gke.900


NAME                        READY   STATUS    RESTARTS   AGE

pod/auth-777f7b6c94-shp24   1/1     Running   0          2m52s


NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE

service/kubernetes   ClusterIP   10.116.0.1   <none>        443/TCP   17m


NAME                   READY   UP-TO-DATE   AVAILABLE   AGE

deployment.apps/auth   1/1     1            1           2m52s


NAME                              DESIRED   CURRENT   READY   AGE

replicaset.apps/auth-777f7b6c94   1         1         1       2m52s


NAME                   ENDPOINTS             AGE

endpoints/kubernetes   104.198.218.137:443   17m



6

배포

kubectl create -f services/auth.yaml


변경 모니터링

service/auth    생김

endpoints/kubernetes   생김


NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24   1/1     Running   0          8m41s   10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>


NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR

service/auth         ClusterIP   10.116.8.187   <none>        80/TCP    92s   app=auth

service/kubernetes   ClusterIP   10.116.0.1     <none>        443/TCP   23m   <none>


NAME                   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                       SELECTOR

deployment.apps/auth   1/1     1            1           8m41s   auth         kelseyhightower/auth:1.0.0   app=auth


NAME                              DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                       SELECTOR

replicaset.apps/auth-777f7b6c94   1         1         1       8m41s   auth         kelseyhightower/auth:1.0.0   app=auth,pod-template-hash=777f7b6c94


NAME                   ENDPOINTS             AGE

endpoints/auth         10.112.4.3:80         92s

endpoints/kubernetes   104.198.218.137:443   23m



7

kubectl create -f deployments/hello.yaml

kubectl create -f services/hello.yaml


hello  배포  후 확인 ?

pod/hello-b6 생김

service/hello  생김

deployment.apps/hello   생김

endpoints/hello      생김


NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24   1/1     Running   0          9m38s   10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-b698b846f-kwq2l   1/1     Running   0          29s     10.112.1.4   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kztrr   1/1     Running   0          29s     10.112.4.4   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-b698b846f-qbjhw   1/1     Running   0          29s     10.112.2.7   gke-bootcamp-default-pool-f351b6bf-l5kg   <none>           <none>


NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR

service/auth         ClusterIP   10.116.8.187    <none>        80/TCP    2m29s   app=auth

service/hello        ClusterIP   10.116.12.194   <none>        80/TCP    28s     app=hello

service/kubernetes   ClusterIP   10.116.0.1      <none>        443/TCP   23m     <none>


NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                        SELECTOR    

deployment.apps/auth    1/1     1            1           9m38s   auth         kelseyhightower/auth:1.0.0    app=auth

deployment.apps/hello   3/3     3            3           29s     hello        kelseyhightower/hello:1.0.0   app=hello


NAME                              DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                        SELECTOR

replicaset.apps/auth-777f7b6c94   1         1         1       9m38s   auth         kelseyhightower/auth:1.0.0    app=auth,pod-template-hash=777f7b6c94

replicaset.apps/hello-b698b846f   3         3         3       29s     hello        kelseyhightower/hello:1.0.0   app=hello,pod-template-hash=b698b846f


NAME                   ENDPOINTS                                   AGE

endpoints/auth         10.112.4.3:80                               2m29s

endpoints/hello        10.112.1.4:80,10.112.2.7:80,10.112.4.4:80   28s

endpoints/kubernetes   104.198.218.137:443                         23m



8

front  배포 ?


프런트엔드용 ConfigMap 만듬

외부 IP를 가져와서 프런트엔드와 ip 매칭됨

kubectl create secret generic tls-certs --from-file tls/

kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf

kubectl create -f deployments/frontend.yaml

kubectl create -f services/frontend.yaml

kubectl get services frontend



9

NAME                            READY   STATUS    RESTARTS   AGE    IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24       1/1     Running   0          11m    10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/frontend-6869899d96-cqd9g   1/1     Running   0          76s    10.112.1.5   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kwq2l       1/1     Running   0          2m6s   10.112.1.4   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kztrr       1/1     Running   0          2m6s   10.112.4.4   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-b698b846f-qbjhw       1/1     Running   0          2m6s   10.112.2.7   gke-bootcamp-default-pool-f351b6bf-l5kg   <none>           <none>


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)         AGE    SELECTOR 

service/auth         ClusterIP      10.116.8.187    <none>            80/TCP          4m6s   app=auth 

service/frontend     LoadBalancer   10.116.11.18    104.154.139.226   443:30670/TCP   75s    app=frontend 

service/hello        ClusterIP      10.116.12.194   <none>            80/TCP          2m5s   app=hello 

service/kubernetes   ClusterIP      10.116.0.1      <none>            443/TCP         25m    <none> 


NAME                       READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES                        SELECTOR

deployment.apps/auth       1/1     1            1           11m    auth         kelseyhightower/auth:1.0.0    app=auth

deployment.apps/frontend   1/1     1            1           76s    nginx        nginx:1.9.14                  app=frontend

deployment.apps/hello      3/3     3            3           2m6s   hello        kelseyhightower/hello:1.0.0   app=hello


NAME                                  DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES                        SELECTOR

replicaset.apps/auth-777f7b6c94       1         1         1       11m    auth         kelseyhightower/auth:1.0.0    app=auth,pod-template-hash=777f7b6c94

replicaset.apps/frontend-6869899d96   1         1         1       76s    nginx        nginx:1.9.14                  app=frontend,pod-template-hash=6869899d96

replicaset.apps/hello-b698b846f       3         3         3       2m6s   hello        kelseyhightower/hello:1.0.0   app=hello,pod-template-hash=b698b846f


NAME                   ENDPOINTS                                   AGE

endpoints/auth         10.112.4.3:80                               4m6s 

endpoints/frontend     10.112.1.5:443                              75s



10

curl -ks 

https://<EXTERNAL-IP>


or


스크립트

curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"





<3> 배포 확장


1

설명

kubectl explain deployment.spec.replicas


2

replicas 업데이트  ?

kubectl scale deployment hello --replicas=5


3

kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide                                                                                                                   cs-


NAME                            READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24       1/1     Running   0          15m     10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/frontend-6869899d96-cqd9g   1/1     Running   0          5m49s   10.112.1.5   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kwq2l       1/1     Running   0          6m39s   10.112.1.4   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kztrr       1/1     Running   0          6m39s   10.112.4.4   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-b698b846f-qbjhw       1/1     Running   0          6m39s   10.112.2.7   gke-bootcamp-default-pool-f351b6bf-l5kg   <none>           <none>

pod/hello-b698b846f-vshmf       1/1     Running   0          84s     10.112.0.3   gke-bootcamp-default-pool-f351b6bf-61sh   <none>           <none>

pod/hello-b698b846f-z5kb8       1/1     Running   0          84s     10.112.3.3   gke-bootcamp-default-pool-f351b6bf-0dvf   <none>           <none>


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)         AGE     SELECTOR

service/auth         ClusterIP      10.116.8.187    <none>            80/TCP          8m39s   app=auth 

service/frontend     LoadBalancer   10.116.11.18    104.154.139.226   443:30670/TCP   5m48s   app=frontend

service/hello        ClusterIP      10.116.12.194   <none>            80/TCP          6m38s   app=hello

service/kubernetes   ClusterIP      10.116.0.1      <none>            443/TCP         30m     <none>


NAME                       READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                        SELECTOR

deployment.apps/auth       1/1     1            1           15m     auth         kelseyhightower/auth:1.0.0    app=auth 

deployment.apps/frontend   1/1     1            1           5m49s   nginx        nginx:1.9.14                  app=frontend

deployment.apps/hello      5/5     5            5           6m39s   hello        kelseyhightower/hello:1.0.0   app=hello


NAME                                  DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                        SELECTOR

replicaset.apps/auth-777f7b6c94       1         1         1       15m     auth         kelseyhightower/auth:1.0.0    app=auth,pod-template-hash=777f7b6c94

replicaset.apps/frontend-6869899d96   1         1         1       5m49s   nginx        nginx:1.9.14                  app=frontend,pod-template-hash=6869899d96

replicaset.apps/hello-b698b846f       5         5         5       6m39s   hello        kelseyhightower/hello:1.0.0   app=hello,pod-template-hash=b698b846f

4

pod 증가 확인

kubectl get pods | grep hello- | wc -l

5


5

pod 축소 확인

kubectl get pods | grep hello- | wc -l





<4> 순차적 업데이트 하기


1

이미지 변경

kubectl edit deployment hello


hello 2.0으로


저장 하는 순간 업데이트 배포가 시작 됨


2

replicaset  확인 ?


kubectl get replicaset

NAME                  DESIRED   CURRENT   READY   AGE

auth-777f7b6c94       1         1         1       20m

frontend-6869899d96   1         1         1       10m

hello-7fd855c77d      2         2         1       23s

hello-b698b846f       2         2         2       11m


3

변경 히스토리 확인

kubectl rollout history deployment/hello


deployment.apps/hello

REVISION  CHANGE-CAUSE

1         <none>

2         <none>



4

업데이트 일시 중지

$ kubectl rollout pause deployment/hello

deployment.apps/hello paused


현재 상태 확인

$ kubectl rollout status deployment/hello

deployment "hello" successfully rolled out


pod에서 확인

$ kubectl get pods -o jsonpath --template='{range .items[*]}{.metadata.name}{"\t"}{"\t"}{.spec.containers[0].image}{"\n"}{end}'


auth-777f7b6c94-shp24           kelseyhightower/auth:1.0.0

frontend-6869899d96-cqd9g               nginx:1.9.14

hello-7fd855c77d-5vmrb          kelseyhightower/hello:2.0.0

hello-7fd855c77d-fcnx7          kelseyhightower/hello:2.0.0

hello-7fd855c77d-j22km          kelseyhightower/hello:2.0.0



5

확인2

kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide


NAME                            READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24       1/1     Running   0          22m     10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/frontend-6869899d96-cqd9g   1/1     Running   0          12m     10.112.1.5   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-7fd855c77d-5vmrb      1/1     Running   0          2m53s   10.112.4.5   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-7fd855c77d-fcnx7      1/1     Running   0          2m18s   10.112.0.4   gke-bootcamp-default-pool-f351b6bf-61sh   <none>           <none>

pod/hello-7fd855c77d-j22km      1/1     Running   0          2m35s   10.112.3.4   gke-bootcamp-default-pool-f351b6bf-0dvf   <none>           <none>


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)         AGE   SELECTOR  

service/auth         ClusterIP      10.116.8.187    <none>            80/TCP          15m   app=auth

service/frontend     LoadBalancer   10.116.11.18    104.154.139.226   443:30670/TCP   12m   app=frontend  

service/hello        ClusterIP      10.116.12.194   <none>            80/TCP          13m   app=hello   

service/kubernetes   ClusterIP      10.116.0.1      <none>            443/TCP         37m   <none>   


NAME                       READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR  

deployment.apps/auth       1/1     1            1           22m   auth         kelseyhightower/auth:1.0.0    app=auth

deployment.apps/frontend   1/1     1            1           12m   nginx        nginx:1.9.14                  app=frontend  

deployment.apps/hello      3/3     3            3           13m   hello        kelseyhightower/hello:2.0.0   app=hello   


NAME                                  DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                        SELECTOR

replicaset.apps/auth-777f7b6c94       1         1         1       22m     auth         kelseyhightower/auth:1.0.0    app=auth,pod-template-hash=777f7b6c94

replicaset.apps/frontend-6869899d96   1         1         1       12m     nginx        nginx:1.9.14                  app=frontend,pod-template-hash=6869899d96

replicaset.apps/hello-7fd855c77d      3         3         3       2m53s   hello        kelseyhightower/hello:2.0.0   app=hello,pod-template-hash=7fd855c77d 

replicaset.apps/hello-b698b846f       0         0         0       13m     hello        kelseyhightower/hello:1.0.0   app=hello,pod-template-hash=b698b846f


NAME                   ENDPOINTS                                   AGE




<5> 배포  계속 하기 


1

resume으로 배포 계속 하기

$ kubectl rollout resume deployment/hello

deployment.apps/hello resumed


2

출시 완료 상태 

$ kubectl rollout status deployment/hello

deployment "hello" successfully rolled out




<6> 롤백 


1

undo로 롤백

$ kubectl rollout undo deployment/hello

deployment.apps/hello rolled back


2

롤백 확인1

$ kubectl rollout history deployment/hello

deployment.apps/hello


REVISION  CHANGE-CAUSE

2         <none>

3         <none>



3

롤백 확인2

kubectl get pods -o jsonpath --template='{range .items[*]}{.metadata.name}{"\t"}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

$ kubectl get pods -o jsonpath --template='{range .items[*]}{.metadata.name}{"\t"}{"\t"}{.spec.containers[0].image}{"\n"}{end}'


auth-777f7b6c94-shp24           kelseyhightower/auth:1.0.0

frontend-6869899d96-cqd9g               nginx:1.9.14

hello-7fd855c77d-5vmrb          kelseyhightower/hello:2.0.0

hello-b698b846f-8v45g           kelseyhightower/hello:1.0.0

hello-b698b846f-kdpkg           kelseyhightower/hello:1.0.0

hello-b698b846f-ztr5g           kelseyhightower/hello:1.0.0




<7>  카나리 배포


조금 배포해서 상태 보기 


1

cat deployments/hello-canary.yaml


2

kubectl create -f deployments/hello-canary.yaml


3

카나리 배포 확인

디플로이 먼트 확인 

$ kubectl get deployments


NAME           READY   UP-TO-DATE   AVAILABLE   AGE

auth           1/1     1            1           26m

frontend       1/1     1            1           17m

hello          3/3     3            3           17m

hello-canary   1/1     1            1           47s



4

전체 확인

kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide


NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24           1/1     Running   0          27m     10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/frontend-6869899d96-cqd9g       1/1     Running   0          17m     10.112.1.5   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-8v45g           1/1     Running   0          3m3s    10.112.1.6   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kdpkg           1/1     Running   0          2m48s   10.112.2.8   gke-bootcamp-default-pool-f351b6bf-l5kg   <none>           <none>

pod/hello-b698b846f-ztr5g           1/1     Running   0          2m35s   10.112.4.6   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-canary-67bf66fdc6-wwlt4   1/1     Running   0          82s     10.112.4.7   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)         AGE   SELECTOR

service/auth         ClusterIP      10.116.8.187    <none>            80/TCP          20m   app=auth

service/frontend     LoadBalancer   10.116.11.18    104.154.139.226   443:30670/TCP   17m   app=frontend

service/hello        ClusterIP      10.116.12.194   <none>            80/TCP          18m   app=hello   

service/kubernetes   ClusterIP      10.116.0.1      <none>            443/TCP         41m   <none>   


NAME                           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR

deployment.apps/auth           1/1     1            1           27m   auth         kelseyhightower/auth:1.0.0    app=auth

deployment.apps/frontend       1/1     1            1           17m   nginx        nginx:1.9.14                  app=frontend

deployment.apps/hello          3/3     3            3           18m   hello        kelseyhightower/hello:1.0.0   app=hello

deployment.apps/hello-canary   1/1     1            1           82s   hello        kelseyhightower/hello:2.0.0   app=hello   


NAME                                      DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                        SELECTOR

replicaset.apps/auth-777f7b6c94           1         1         1       27m     auth         kelseyhightower/auth:1.0.0    app=auth,pod-template-hash=777f7b6c94

replicaset.apps/frontend-6869899d96       1         1         1       17m     nginx        nginx:1.9.14                  app=frontend,pod-template-hash=6869899d96

replicaset.apps/hello-7fd855c77d          0         0         0       7m33s   hello        kelseyhightower/hello:2.0.0   app=hello,pod-template-hash=7fd855c77d

replicaset.apps/hello-b698b846f           3         3         3       18m     hello        kelseyhightower/hello:1.0.0   app=hello,pod-template-hash=b698b846f

replicaset.apps/hello-canary-67bf66fdc6   1         1         1       82s     hello        kelseyhightower/hello:2.0.0   app=hello,pod-template-hash=67bf66fdc6  





<8> Blue/Green 배포


2배의 리소스가 필요


1

blue 배포

kubectl apply -f services/hello-blue.yaml


2

새로운 'green' 배포 만들기

Green 에서 버전 라벨과 이미지 경로를 업데이트

3

watch -d 'kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide'

Every 2.0s: kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide                                                                                                                   cs-646454401406-default-default-s8qwv: Tue Aug 17 00:25:19 2021


NAME                        STATUS   AGE

namespace/default           Active   48m

namespace/kube-node-lease   Active   48m

namespace/kube-public       Active   48m

namespace/kube-system       Active   48m


NAME                                           STATUS   ROLES    AGE   VERSION           INTERNAL-IP   EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIMEnode/gke-bootcamp-default-pool-f351b6bf-0dvf   Ready    <none>   47m   v1.20.8-gke.900   10.128.0.5    35.225.42.121    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-1n4p   Ready    <none>   47m   v1.20.8-gke.900   10.128.0.4    35.226.102.103   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-61sh   Ready    <none>   47m   v1.20.8-gke.900   10.128.0.2    34.123.244.168   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-kmg5   Ready    <none>   47m   v1.20.8-gke.900   10.128.0.3    35.222.108.131   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-l5kg   Ready    <none>   47m   v1.20.8-gke.900   10.128.0.6    34.71.140.207    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3


NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24           1/1     Running   0          34m     10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/frontend-6869899d96-cqd9g       1/1     Running   0          24m     10.112.1.5   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-8v45g           1/1     Running   0          9m32s   10.112.1.6   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kdpkg           1/1     Running   0          9m17s   10.112.2.8   gke-bootcamp-default-pool-f351b6bf-l5kg   <none>           <none>

pod/hello-b698b846f-ztr5g           1/1     Running   0          9m4s    10.112.4.6   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-canary-67bf66fdc6-wwlt4   1/1     Running   0          7m51s   10.112.4.7   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)         AGE   SELECTOR

service/auth         ClusterIP      10.116.8.187    <none>            80/TCP          26m   app=auth

service/frontend     LoadBalancer   10.116.11.18    104.154.139.226   443:30670/TCP   24m   app=frontend

service/hello        ClusterIP      10.116.12.194   <none>            80/TCP          24m   app=hello,version=1.0.0

service/kubernetes   ClusterIP      10.116.0.1      <none>            443/TCP         48m   <none>


NAME                           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                        SELECTOR

deployment.apps/auth           1/1     1            1           34m     auth         kelseyhightower/auth:1.0.0    app=auth

deployment.apps/frontend       1/1     1            1           24m     nginx        nginx:1.9.14                  app=frontend

deployment.apps/hello          3/3     3            3           24m     hello        kelseyhightower/hello:1.0.0   app=hello

deployment.apps/hello-canary   1/1     1            1           7m51s   hello        kelseyhightower/hello:2.0.0   app=hello


NAME                                      DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                        SELECTOR

replicaset.apps/auth-777f7b6c94           1         1         1       34m     auth         kelseyhightower/auth:1.0.0    app=auth,pod-template-hash=777f7b6c94

replicaset.apps/frontend-6869899d96       1         1         1       24m     nginx        nginx:1.9.14                  app=frontend,pod-template-hash=6869899d96

replicaset.apps/hello-7fd855c77d          0         0         0       14m     hello        kelseyhightower/hello:2.0.0   app=hello,pod-template-hash=7fd855c77d

replicaset.apps/hello-b698b846f           3         3         3       24m     hello        kelseyhightower/hello:1.0.0   app=hello,pod-template-hash=b698b846f

replicaset.apps/hello-canary-67bf66fdc6   1         1         1       7m51s   hello        kelseyhightower/hello:2.0.0   app=hello,pod-template-hash=67bf66fdc6

4

그린 배포

kubectl create -f deployments/hello-green.yaml

$ kubectl create -f deployments/hello-green.yaml

deployment.apps/hello-green created



6

버전 1.0 확인

$ curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version

{"version":"1.0.0"}



7

새버전으로 업데이트


$ kubectl apply -f services/hello-green.yaml

service/hello configured


버전확인 ?

$ curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version

{"version":"2.0.0"}



8

상태 확인


Every 2.0s: kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide                                                                                                                 


NAME                        STATUS   AGE

namespace/default           Active   52m

namespace/kube-node-lease   Active   52m

namespace/kube-public       Active   52m

namespace/kube-system       Active   52m


NAME                                           STATUS   ROLES    AGE   VERSION           INTERNAL-IP   EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME

node/gke-bootcamp-default-pool-f351b6bf-0dvf   Ready    <none>   51m   v1.20.8-gke.900   10.128.0.5    35.225.42.121    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-1n4p   Ready    <none>   51m   v1.20.8-gke.900   10.128.0.4    35.226.102.103   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-61sh   Ready    <none>   51m   v1.20.8-gke.900   10.128.0.2    34.123.244.168   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-kmg5   Ready    <none>   51m   v1.20.8-gke.900   10.128.0.3    35.222.108.131   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-l5kg   Ready    <none>   51m   v1.20.8-gke.900   10.128.0.6    34.71.140.207    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3


NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24           1/1     Running   0          37m     10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/frontend-6869899d96-cqd9g       1/1     Running   0          27m     10.112.1.5   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-8v45g           1/1     Running   0          13m     10.112.1.6   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kdpkg           1/1     Running   0          13m     10.112.2.8   gke-bootcamp-default-pool-f351b6bf-l5kg   <none>           <none>

pod/hello-b698b846f-ztr5g           1/1     Running   0          12m     10.112.4.6   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-canary-67bf66fdc6-wwlt4   1/1     Running   0          11m     10.112.4.7   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-green-5f9cb59bcf-gv758    1/1     Running   0          2m20s   10.112.3.5   gke-bootcamp-default-pool-f351b6bf-0dvf   <none>           <none>

pod/hello-green-5f9cb59bcf-m2p8n    1/1     Running   0          2m20s   10.112.0.5   gke-bootcamp-default-pool-f351b6bf-61sh   <none>           <none>

pod/hello-green-5f9cb59bcf-vrcgb    1/1     Running   0          2m20s   10.112.1.7   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)         AGE   SELECTOR

service/auth         ClusterIP      10.116.8.187    <none>            80/TCP          30m   app=auth

service/frontend     LoadBalancer   10.116.11.18    104.154.139.226   443:30670/TCP   27m   app=frontend

service/hello        ClusterIP      10.116.12.194   <none>            80/TCP          28m   app=hello,version=2.0.0

service/kubernetes   ClusterIP      10.116.0.1      <none>            443/TCP         52m   <none>


NAME                           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                        SELECTOR

deployment.apps/auth           1/1     1            1           37m     auth         kelseyhightower/auth:1.0.0    app=auth

deployment.apps/frontend       1/1     1            1           27m     nginx        nginx:1.9.14                  app=frontend

deployment.apps/hello          3/3     3            3           28m     hello        kelseyhightower/hello:1.0.0   app=hello

deployment.apps/hello-canary   1/1     1            1           11m     hello        kelseyhightower/hello:2.0.0   app=hello



9

블루로 롤백 


$ kubectl apply -f services/hello-blue.yaml

service/hello configured


$ curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version

{"version":"1.0.0"}



10

kubectl get ns,no,po,svc,deploy,rs,ing,ep -o wide    


NAME                        STATUS   AGE

namespace/default           Active   53m

namespace/kube-node-lease   Active   53m

namespace/kube-public       Active   53m

namespace/kube-system       Active   53m


NAME                                           STATUS   ROLES    AGE   VERSION           INTERNAL-IP   EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME

node/gke-bootcamp-default-pool-f351b6bf-0dvf   Ready    <none>   53m   v1.20.8-gke.900   10.128.0.5    35.225.42.121    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-1n4p   Ready    <none>   52m   v1.20.8-gke.900   10.128.0.4    35.226.102.103   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-61sh   Ready    <none>   52m   v1.20.8-gke.900   10.128.0.2    34.123.244.168   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-kmg5   Ready    <none>   52m   v1.20.8-gke.900   10.128.0.3    35.222.108.131   Container-Optimized OS from Google   5.4.104+         containerd://1.4.3

node/gke-bootcamp-default-pool-f351b6bf-l5kg   Ready    <none>   52m   v1.20.8-gke.900   10.128.0.6    34.71.140.207    Container-Optimized OS from Google   5.4.104+         containerd://1.4.3


NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE                                      NOMINATED NODE   READINESS GATES

pod/auth-777f7b6c94-shp24           1/1     Running   0          39m     10.112.4.3   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/frontend-6869899d96-cqd9g       1/1     Running   0          29m     10.112.1.5   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-8v45g           1/1     Running   0          14m     10.112.1.6   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>

pod/hello-b698b846f-kdpkg           1/1     Running   0          14m     10.112.2.8   gke-bootcamp-default-pool-f351b6bf-l5kg   <none>           <none>

pod/hello-b698b846f-ztr5g           1/1     Running   0          14m     10.112.4.6   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-canary-67bf66fdc6-wwlt4   1/1     Running   0          13m     10.112.4.7   gke-bootcamp-default-pool-f351b6bf-1n4p   <none>           <none>

pod/hello-green-5f9cb59bcf-gv758    1/1     Running   0          3m55s   10.112.3.5   gke-bootcamp-default-pool-f351b6bf-0dvf   <none>           <none>

pod/hello-green-5f9cb59bcf-m2p8n    1/1     Running   0          3m55s   10.112.0.5   gke-bootcamp-default-pool-f351b6bf-61sh   <none>           <none>

pod/hello-green-5f9cb59bcf-vrcgb    1/1     Running   0          3m55s   10.112.1.7   gke-bootcamp-default-pool-f351b6bf-kmg5   <none>           <none>


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)         AGE   SELECTOR

service/auth         ClusterIP      10.116.8.187    <none>            80/TCP          32m   app=auth

service/frontend     LoadBalancer   10.116.11.18    104.154.139.226   443:30670/TCP   29m   app=frontend

service/hello        ClusterIP      10.116.12.194   <none>            80/TCP          30m   app=hello,version=1.0.0

service/kubernetes   ClusterIP      10.116.0.1      <none>            443/TCP         53m   <none>


NAME                           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                        SELECTOR

deployment.apps/auth           1/1     1            1           39m     auth         kelseyhightower/auth:1.0.0    app=auth

deployment.apps/frontend       1/1     1            1           29m     nginx        nginx:1.9.14                  app=frontend

deployment.apps/hello          3/3     3            3           30m     hello        kelseyhightower/hello:1.0.0   app=hello

deployment.apps/hello-canary   1/1     1            1           13m     hello        kelseyhightower/hello:2.0.0   app=hello






<10> 같이 보면 좋을 사이트


https://brunch.co.kr/@topasvga/1800


감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari