다음은 쿠버네티스 스터디 자료를 참고해 정리한 내용입니다.
<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
감사합니다.