목차
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 다운로드 및 실행
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
복사