brunch

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

by Master Seo

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


<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를 하나 생성

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

10 cluster ip.png


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



감사합니다.

keyword
매거진의 이전글쿠버1탄-13.도메인 없이 KOPS로 AWS에쿠버네티스