블록체인
블록체인

Pod, Deployment 배포 및 삭제하기

목차

Kubernetes(쿠버네티스)

CNCF(Cloud Native Computing Foundation)에서 관리됨

배포 종류

1.
관리형 쿠버네티스
AWS(EKS), GCP(GKE), Azure(AKS)
2.
설치형 쿠버네티스
RANCHER, OpenShift
3.
구성형 쿠버네티스
kubeadm, kubespray, KRIB, kops

웹에서 제공하는 쿠버네티스 환경

플레이 쿠버네티스 : 시간제한 존재, 최대 9개 노드, 직접 구성 필요
쿠버네티스 플레이그라운드 : 구현되어있으므로 바로 사용 가능, 노드 수 제한

쿠버네티스 랩 환경 설치

1. Vagrant 설치
Vagrant : VM 관리 도구
2. VirtualBox 설치
3. VagrantFile 다운로드 및 실행
_Lecture_k8s_starter.kit
sysnet4admin
vagrant up
Shell
복사
4. 4개의 가상머신 설치 확인
5. 마스터 노드에 접속해서 쿠버네티스로 구성되어있는 노드 확인
[root@m-k8s ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION m-k8s Ready control-plane 18m v1.25.0 w1-k8s Ready <none> 13m v1.25.0 w2-k8s Ready <none> 9m18s v1.25.0 w3-k8s Ready <none> 4m46s v1.25.0
JavaScript
복사

Pod, Deployment 배포 방법

kubectl run : 단일 Pod만 배포 가능
kubectl create : Pod, Deployment 배포 가능
kubectl apply : Pod, Deployment 배포 가능 / -f옵션을 이용하여 파일로 설치

Pod란?

컨테이너(애플리케이션)을 배포하는 단위
컨테이너(애플리케이션)의 집합
대부분은 하나의 컨테이너(애플리케이션)가 하나의 파드로 이루어지는 경우가 많음

Pod로 Nginx 배포해보기

1. 마스터노드에서 워커노드에 pod 한 개를 생성하여 애플리케이션을 배포
# nginx pod 한 개 생성 [root@m-k8s ~]# kubectl run nginx --image=nginx pod/nginx created # pod 확인 [root@m-k8s ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 38s # 배포한 pod의 IP확인 [root@m-k8s ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 82s 172.16.103.129 w2-k8s <none> <none> # 확인한 IP에 접속 [root@m-k8s ~]# curl 172.16.103.129 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
JavaScript
복사

외부에 nginx 노출 (nodeport type)

1. svc를 통해서 노드포트에 들어와서 pod를 찾아가도록 설정
# Nginx expose(type : NodePort) [root@m-k8s ~]# kubectl expose pod nginx --type=NodePort --port=80 service/nginx exposed # NodePort확인(외부 노출 포트는 30475) [root@m-k8s ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h27m nginx NodePort 10.104.121.238 <none> 80:30475/TCP 7s # Node 정보 확인(외부에 노출 IP확인) [root@m-k8s ~]# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME m-k8s Ready control-plane 4h29m v1.25.0 192.168.1.10 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7 w1-k8s Ready <none> 4h24m v1.25.0 192.168.1.101 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7 w2-k8s Ready <none> 4h20m v1.25.0 192.168.1.102 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7 w3-k8s Ready <none> 4h15m v1.25.0 192.168.1.103 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7
Shell
복사
2. 접속 확인
현재 pod가 한 개 배포되어 있고 어느 노드에 있는지는 모름
10, 101, 102, 103로 접속하면 다 Nginx 페이지로 접속됨

Deployment란?

파드를 여러개 모아둔 단위
Pods를 삭제해도 정의된 수만큼 다시 배포됨

Deployment로 Nginx 배포해보기

1.
Deployment를 통해 pod 배포
# Nginx deployment 생성 [root@m-k8s ~]# kubectl create deployment deploy-nginx --image=nginx deployment.apps/deploy-nginx created # pod IP 확인(ReplicaSet default 값이 1이기 때문에 pod가 한개만 배포되어 있음) [root@m-k8s ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-nginx-67c78b5cfc-jjjvn 1/1 Running 0 91s 172.16.132.1 w3-k8s <none> <none> nginx 1/1 Running 0 4h21m 172.16.103.129 w2-k8s <none> <none> # pod에 접속 [root@m-k8s ~]# curl 172.16.132.1 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
Shell
복사
2.
pod의 배포 수 늘리기
# pod수 3개로 늘리기 [root@m-k8s ~]# kubectl scale deployment deploy-nginx --replicas=3 deployment.apps/deploy-nginx scaled # 3개로 늘어나있는 pod 확인 [root@m-k8s ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-nginx-67c78b5cfc-jjjvn 1/1 Running 0 5m35s 172.16.132.1 w3-k8s <none> <none> deploy-nginx-67c78b5cfc-jrrh6 1/1 Running 0 25s 172.16.103.130 w2-k8s <none> <none> deploy-nginx-67c78b5cfc-n7x8p 1/1 Running 0 25s 172.16.221.130 w1-k8s <none> <none> nginx 1/1 Running 0 4h25m 172.16.103.129 w2-k8s <none> <none>
Shell
복사

외부에 nginx 노출 (nodeport type)

# Nginx expose(type : NodePort) [root@m-k8s ~]# kubectl expose deployment deploy-nginx --type=NodePort --port=80 service/deploy-nginx exposed # NodePort확인(외부 노출 포트는 30576) [root@m-k8s ~]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE deploy-nginx NodePort 10.99.217.211 <none> 80:30576/TCP 8s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h55m nginx NodePort 10.104.121.238 <none> 80:30475/TCP 28m # Node 정보 확인(외부에 노출 IP확인) [root@m-k8s ~]# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME m-k8s Ready control-plane 4h29m v1.25.0 192.168.1.10 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7 w1-k8s Ready <none> 4h24m v1.25.0 192.168.1.101 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7 w2-k8s Ready <none> 4h20m v1.25.0 192.168.1.102 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7 w3-k8s Ready <none> 4h15m v1.25.0 192.168.1.103 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 containerd://1.6.7
Shell
복사
2. 접속 확인
NodePort Type으로 노출하면 내부의 IP가 노출되기 때문에 로드밸런서를 사용하여 노출해야 함

외부에 nginx 노출(LoadBalancer type)

1. Deployment로 호스트 이름을 출력해주는 애플리케이션 배포
[root@m-k8s ~]# kubectl create deployment chk-hn --image=sysnet4admin/chk-hn deployment.apps/chk-hn created [root@m-k8s ~]# kubectl scale deployment chk-hn --replicas=3 deployment.apps/chk-hn scaled [root@m-k8s ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES chk-hn-7c4c768876-ld8z8 1/1 Running 0 5m56s 172.16.103.131 w2-k8s <none> <none> chk-hn-7c4c768876-m8gbr 1/1 Running 0 6m40s 172.16.221.131 w1-k8s <none> <none> chk-hn-7c4c768876-vzr4b 1/1 Running 0 5m56s 172.16.132.3 w3-k8s <none> <none> deploy-nginx-67c78b5cfc-jjjvn 1/1 Running 0 18h 172.16.132.1 w3-k8s <none> <none> deploy-nginx-67c78b5cfc-jrrh6 1/1 Running 0 18h 172.16.103.130 w2-k8s <none> <none> deploy-nginx-67c78b5cfc-n7x8p 1/1 Running 0 18h 172.16.221.130 w1-k8s <none> <none> nginx 1/1 Running 0 22h 172.16.103.129 w2-k8s <none> <none> [root@m-k8s ~]#
Shell
복사
2. 로드밸런서(metallb) 설치
# 로드밸런서(metallb) 설치 [root@m-k8s ~]# kubectl apply -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml # Nginx expose(type : LoadBalancer) [root@m-k8s ~]# kubectl expose deployment chk-hn --type=LoadBalancer --port=80 service/chk-hn exposed # EXTERNAL-IP가 생성된 것을 확인 # NodePort type을 사용했었을때는 kubectl get nodes를 통해 INTERNETL-IP로 접속 [root@m-k8s ~]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE chk-hn LoadBalancer 10.106.77.149 192.168.1.11 80:32396/TCP 10s deploy-nginx NodePort 10.99.217.211 <none> 80:30576/TCP 17h kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h nginx NodePort 10.104.121.238 <none> 80:30475/TCP 18h [root@m-k8s ~]#
Shell
복사
3.
접속해보기
접속할때마다 Pod이름이 변경됨

배포 삭제하기

SVC 삭제하기
# SVC 삭제하기 [root@m-k8s ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE deploy-nginx NodePort 10.99.217.211 <none> 80:30576/TCP 18h kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h nginx NodePort 10.104.121.238 <none> 80:30475/TCP 19h [root@m-k8s ~]# kubectl delete service deploy-nginx service "deploy-nginx" deleted [root@m-k8s ~]# kubectl delete service nginx service "nginx" deleted [root@m-k8s ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h
Shell
복사
Pod, Deployment 삭제하기
# Pod, Deployment 삭제하기 [root@m-k8s ~]# kubectl get pods NAME READY STATUS RESTARTS AGE chk-hn-7c4c768876-ld8z8 1/1 Running 0 52m chk-hn-7c4c768876-m8gbr 1/1 Running 0 52m chk-hn-7c4c768876-vzr4b 1/1 Running 0 52m deploy-nginx-67c78b5cfc-jjjvn 1/1 Running 0 18h deploy-nginx-67c78b5cfc-jrrh6 1/1 Running 0 18h deploy-nginx-67c78b5cfc-n7x8p 1/1 Running 0 18h nginx 1/1 Running 0 23h [root@m-k8s ~]# kubectl delete deployment chk-hn deploy-nginx deployment.apps "chk-hn" deleted deployment.apps "deploy-nginx" deleted [root@m-k8s ~]# kubectl delete pod nginx pod "nginx" deleted [root@m-k8s ~]# kubectl get pods No resources found in default namespace.
Shell
복사
apply로 설치한 metallb 삭제하기
[root@m-k8s ~]# kubectl delete -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml
Shell
복사