brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 04. 2021

쿠버1탄-15. Cluser IP, 블루 그린 배포

다음은 쿠버네티스 스터디 자료를 참고해  정리한 내용입니다.


<1> 실습1 - Cluster IP를 위한 디플로이먼트 생성과 확인

<2> 테스트 pod생성과 Cluster로 접속, 테스트

<3> 서비스 생성

<4> 실습2 - Blue,Green 배포 해보자

<5> 서비스 확인

<6> 삭제 

<7> 정리

<8> 다음 과정



<1> 실습1- Cluster IP를 위한 디플로이먼트 생성과 확인


서비스가 3가지가 있다.

Cluster IP

NodePort 

Load Balancer 


Cluser IP Service

클러스터내 접근 가능

외부로 노출은 안된다.

따로 지정하지 않으면 기본으로 Cluser IP 로 설정된다.

Cluster로 접속해 연결한다.


구조

사용자 --------- 클러스터 IP --- Pod 1 , Pod2 

같은 쿠버네티스 클러스터에서만 접속 가능하다.

외부에서는 접속이 불가능하다.


동작

node1 PodA  에서   node2 PodB 접속하기?


node1 PodA   ------- kube-proxy----- node2 PodB Pod 1 , Pod2 

                     DNAT  동작



1

접속,정리

ssh -i ~/.ssh/id_rsa ubuntu@api.seo.cndk.k8s


kubectl delete deploy,svc,pods --all


2

다른 터미널에서 모니터링

watch -d 'kubectl get pods,svc,ep -o wide'


3

테스트 ?

Master node에 테스트용 Pod를 하나 생성

서비스를 만들고 접속 테스트 진행


4

cat << EOF > pod.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: deploy-cndk

spec:

  replicas: 3

  selector:

    matchLabels:

      app: deploy-websrv

  template:

    metadata:

      labels:

        app: deploy-websrv

    spec:

      containers:

      - name: cndk-websrv

        image: gcr.io/google-samples/kubernetes-bootcamp:v1

        ports:

        - containerPort: 8080

EOF
  

// 8080으로 접속해야 한다~~



5

pod 생성

kubectl apply -f pod.yaml


pod ip확인

kubectl get pod -o wide -l app=deploy-websrv |awk 'NR>1 {print $6}'

100.97.177.74

100.99.79.136

100.97.177.73

// 3개 생긴다.


6

pod 이름 확인

kubectl get pod -l app=deploy-websrv -o=name

pod/deploy-cndk-6cbc8c75db-492md

pod/deploy-cndk-6cbc8c75db-kwbw2

pod/deploy-cndk-6cbc8c75db-wb9m9


7

각 pod IP로 8080으로 접속하기


for pod in $(kubectl get pod -o wide -l app=deploy-websrv |awk 'NR>1 {print $6}'); do curl -s $pod:8080; done


Hello Kubernetes bootcamp! | Running on: deploy-cndk-6cbc8c75db-492md | v=1

Hello Kubernetes bootcamp! | Running on: deploy-cndk-6cbc8c75db-kwbw2 | v=1

Hello Kubernetes bootcamp! | Running on: deploy-cndk-6cbc8c75db-wb9m9 | v=1





<2>  테스트 pod생성과 Cluster로 접속, 테스트


마스터 노드에 테스트 pod 1개 생성하자

테스트 pod에서 테스트하자~


1

kubectl get nodes

NAME                                               STATUS   ROLES                  AGE   VERSION

ip-172-20-45-22.ap-northeast-1.compute.internal    Ready    node                   29h   v1.20.8

ip-172-20-46-120.ap-northeast-1.compute.internal   Ready    control-plane,master   29h   v1.20.8

ip-172-20-49-16.ap-northeast-1.compute.internal    Ready    node                   29h   v1.20.8



2

테스트 pod 1개 생성 

//  nodeName: ip-172-20-46-120.ap-northeast-1.compute.internal  <- master 노드 이름으로 변경하세요~


cat << EOF > podnet.yaml

apiVersion: v1

kind: Pod

metadata:

  name: netshoot-pod

spec:

  nodeName: ip-172-20-46-120.ap-northeast-1.compute.internal

  containers:

  - name: netshoot-pod

    image: nicolaka/netshoot

    command: ["tail"]

    args: ["-f", "/dev/null"]

EOF



kubectl apply -f podnet.yaml


4

test pod로 접속

kubectl exec -it netshoot-pod -- zsh

Welcome to Netshoot! (github.com/nicolaka/netshoot)


5

test pod에서 다른 pod로 접속 확인

curl 100.97.177.74:8080


 netshoot-pod : curl 100.97.177.74:8080

Hello Kubernetes bootcamp! | Running on: deploy-cndk-6cbc8c75db-82whl | v=1




<3>  서비스 생성


1

cat << EOF >  svc-clusterip.yaml

apiVersion: v1

kind: Service

metadata:

  name: svc-clusterip

spec:

  ports:

    - name: svc-webport

      port: 9000

      targetPort: 8080

  selector:

    app: deploy-websrv

  type: ClusterIP

EOF


// 9000 : 다른 Pod들이 서비스로  접속 할때 사용하는 포트

// 8080 :  pod로 접속 할때 사용하는 포트

// selector:

    app: deploy-websrv

디플로이 셀렉터를 사용한다.


2

kubectl apply -f svc-clusterip.yaml

service/svc-clusterip created


3

kubectl get svc

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

kubernetes      ClusterIP   100.64.0.1       <none>        443/TCP    29h

svc-clusterip   ClusterIP   100.71.181.203   <none>        9000/TCP   24s



4

kubectl get service svc-clusterip

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

svc-clusterip   ClusterIP   100.67.80.131   <none>        9000/TCP   112s


kubectl get service svc-clusterip -o jsonpath='{.spec.clusterIP}' ; echo



5

엔트포인트 확인

kubectl get endpoints svc-clusterip

NAME            ENDPOINTS                                                  AGE

svc-clusterip   100.97.177.66:8080,100.97.177.67:8080,100.99.79.131:8080   109s


6

master, slave등 모든 node에서 서비스 IP로 접속 가능함을 확인


curl -s <SVC IP>:9000

curl -s  100.67.80.131:9000

// 외부에서는 9000 포트로 접속한다.

Hello Kubernetes bootcamp! | Running on: deploy-cndk-6cbc8c75db-88wrw | v=1


7

netshoot-pod 접속해 확인

kubectl exec -it netshoot-pod -- zsh


svc=100.67.80.131 

while true; do curl -s --connect-timeout 1 $SVC:9000 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 3; done

// 3초 마다 테스트


8

이 서비스의 장점을 알아보자?


pod 1개 삭제 ?

kubectl delete pod deploy-cndk-6cbc8c75db-82whl


kubectl get pod

NAME                           READY   STATUS    RESTARTS   AGE

deploy-cndk-6cbc8c75db-82whl   1/1     Running   0          29m

deploy-cndk-6cbc8c75db-88wrw   1/1     Running   0          29m

deploy-cndk-6cbc8c75db-jc6g7   1/1     Running   0          29m

netshoot-pod                   1/1     Running   0          22m


kubectl delete pod deploy-cndk-6cbc8c75db-82whl

pod "deploy-cndk-6cbc8c75db-82whl" deleted


kubectl get pod

NAME                           READY   STATUS    RESTARTS   AGE

deploy-cndk-6cbc8c75db-88wrw   1/1     Running   0          29m

deploy-cndk-6cbc8c75db-jc6g7   1/1     Running   0          29m

deploy-cndk-6cbc8c75db-lk59c   1/1     Running   0          44s

netshoot-pod                   1/1     Running   0          23m


// 서비스 계속 된다.   

//  netshoot-pod 에서 while 문의로 모니터링중

// pod 가 새로 1개 생성된다.  

Pod  Endpoint  ip가 변경된다. watch -d 'kubectl get pods,svc,ep -o wide' 모니터링중

pod  장애가 발생  되더라도 자동으로  EP IP 를 변경해준다.


9

log 확인

kubectl logs -l app=deploy-websrv -f

Kubernetes Bootcamp App Started At: 2021-07-04T03:44:09.937Z | Running On:  deploy-cndk-6cbc8c75db-492md


10

삭제

kubectl delete deploy,svc,pods --all





<4> 실습2 Blue,Green 배포 해보자


환경

디플로이먼트 2개 생성


1

cat << EOF >  nginx11.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: deploy-nginx11

spec:

  replicas: 3

  selector:

    matchLabels:

      app: deploy-nginx11

  template:

    metadata:

      labels:

        app: deploy-nginx11

    spec:

      containers:

      - name: deploy-nginx11

        image: nginx:1.11

EOF



cat << EOF >  nginx12.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: deploy-nginx12

spec:

  replicas: 3

  selector:

    matchLabels:

      app: deploy-nginx12

  template:

    metadata:

      labels:

        app: deploy-nginx12

    spec:

      containers:

      - name: deploy-nginx12

        image: nginx:1.12

EOF


2

kubectl apply -f nginx11.yaml

kubectl apply -f nginx12.yaml


3

index.html 변경

for pod in $(kubectl get pod -l app=deploy-nginx11 |awk 'NR>1 {print $1}'); do kubectl exec $pod -- /bin/sh -c "hostname > /usr/share/nginx/html/index.html; echo 'nginx:v1.11 END' >> /usr/share/nginx/html/index.html"; done


4

index.html 변경

for pod in $(kubectl get pod -l app=deploy-nginx12 |awk 'NR>1 {print $1}'); do kubectl exec $pod -- /bin/sh -c "hostname > /usr/share/nginx/html/index.html; echo 'nginx:v1.12 END' >> /usr/share/nginx/html/index.html"; done



4

11버전 확인

for podIP in $(kubectl get pod -o wide -l app=deploy-nginx11 |awk 'NR>1 {print $6}'); do curl -s $podIP; done


deploy-nginx11-656d5495b7-5c5vz

nginx:v1.11 END

deploy-nginx11-656d5495b7-ckxml

nginx:v1.11 END

deploy-nginx11-656d5495b7-zl26d

nginx:v1.11 END



5

12버전 확인

for podIP in $(kubectl get pod -o wide -l app=deploy-nginx12 |awk 'NR>1 {print $6}'); do curl -s $podIP; done


deploy-nginx12-58b56876c4-9c858

nginx:v1.12 END

deploy-nginx12-58b56876c4-jnc9j

nginx:v1.12 END

deploy-nginx12-58b56876c4-zw446

nginx:v1.12 END





<5> 서비스 확인 과 확인


1

서비스 생성?


cat << EOF > svc-nginx.yaml

apiVersion: v1

kind: Service

metadata:

  name: svc-nginx

spec:

  ports:

    - name: svc-nginx

      port: 9000

      targetPort: 80

  selector:

    app: deploy-nginx11

EOF


셀렉터가 지금은 11이다.

3대 이다.

pod/deploy-nginx11-656d5495b7-njwx9   1/1     Running   0          3m24s

pod/deploy-nginx11-656d5495b7-nln9h   1/1     Running   0          3m24s

pod/deploy-nginx11-656d5495b7-tc9x6   1/1     Running   0          3m24s

pod/deploy-nginx12-58b56876c4-9h9d8   1/1     Running   0          3m21s

pod/deploy-nginx12-58b56876c4-htsbh   1/1     Running   0          3m21s

pod/deploy-nginx12-58b56876c4-l8tv6   1/1     Running   0          3m21s



2

kubectl apply -f svc-nginx.yaml


// 서비스 생성시  엔드포인트도 같이 생긴다.

서비스

service/svc-nginx    ClusterIP   100.67.139.74   <none>        9000/TCP   60s   app=deploy-nginx11


엔드포인트

endpoints/svc-nginx    100.97.177.78:80,100.97.177.79:80,100.99.79.141:80   68s


3

kubectl get service svc-nginx

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

svc-nginx   ClusterIP   100.67.139.74   <none>        9000/TCP   103s


서비스 

kubectl get service svc-nginx -o jsonpath='{.spec.clusterIP}' ; echo

100.67.139.74



4

Endpoint  확인 ?

kubectl get endpoints svc-nginx

NAME        ENDPOINTS                                            AGE

svc-nginx   100.97.177.78:80,100.97.177.79:80,100.99.79.141:80   5m27s



5

curl -s <SVC IP>:9000

curl -s  100.67.139.74:9000

deploy-nginx11-656d5495b7-zl26d

nginx:v1.11 END

//11 버전이다.



6

실시간 로그 확인

kubectl logs -l 'app in (deploy-nginx11,deploy-nginx12)' -f --max-log-requests 8

100.127.206.64 - - [04/Jul/2021:10:04:47 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.68.0" "-"

100.127.206.64 - - [04/Jul/2021:10:04:31 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.68.0" "-"

100.127.206.64 - - [04/Jul/2021:10:12:58 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.68.0" "-"

100.127.206.64 - - [04/Jul/2021:10:04:47 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.68.0" "-"

100.127.206.64 - - [04/Jul/2021:10:04:31 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.68.0" "-"

100.127.206.64 - - [04/Jul/2021:10:04:47 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.68.0" "-"

100.127.206.64 - - [04/Jul/2021:10:04:31 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.68.0" "-"




7

maste node에서  모니터링하자

SVC=100.67.139.74

for i in {1..100}; do curl -s $SVC:9000 ; done | sort | uniq -c | sort -nr

while true; do curl -s --connect-timeout 1 $SVC:9000 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done

nginx:v1.11 END

--------------

2021-07-04 12:58:51

deploy-nginx11-656d5495b7-blqbt

nginx:v1.11 END

--------------

2021-07-04 12:58:52

deploy-nginx11-656d5495b7-g258h

nginx:v1.11 END

--------------

2021-07-04 12:58:54

deploy-nginx11-656d5495b7-khlkd

nginx:v1.11 END




8

Blue/ Green 배포 해보자!!!


kubectl get svc svc-nginx -o yaml | sed -e "s/app: deploy-nginx11/app: deploy-nginx12/" | kubectl apply -f -

// index.html의 내용을 변경하는것이다!!

service/svc-nginx configured


9

별도 모니터링 중인 터미널에서 확인?


SVC=100.67.139.74

for i in {1..100}; do curl -s $SVC:9000 ; done | sort | uniq -c | sort -nr

while true; do curl -s --connect-timeout 1 $SVC:9000 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done


// 모니터링 터미널에서  12로 변경 되었다!!


021-07-04 12:59:22

deploy-nginx12-58b56876c4-xm492

nginx:v1.12 END

--------------

2021-07-04 12:59:23

deploy-nginx12-58b56876c4-mxpds

nginx:v1.12 END

--------------

2021-07-04 12:59:24

deploy-nginx12-58b56876c4-8hdhg

nginx:v1.12 END

--------------

2021-07-04 12:59:25

deploy-nginx12-58b56876c4-mxpds

nginx:v1.12 END

--------------

2021-07-04 12:59:26

deploy-nginx12-58b56876c4-8hdhg




10

롤백1

kubectl get svc svc-nginx -o yaml | sed -e "s/app: deploy-nginx12/app: deploy-nginx11/" | kubectl apply -f -


롤백2

kubectl get svc svc-nginx -o yaml | sed -e "s/app: deploy-nginx11/app: deploy-nginx12/" | kubectl apply -f -



11

기존 11 버전  삭제  또는  리플리카 0

kubectl scale deployment deploy-nginx11 --replicas=0




<6>  전부 삭제


kubectl delete deploy,svc --all




<7> 정리


Cluser IP Service

쿠버네티스 내부에서 Pod를 접근할때 사용한다.





<8> 다음 과정


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



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



감사합니다.

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