2.1 배포를 통해 확인하는 파드(Pod)
애플리케이션(NGINX) 배포
- 마스터 노드(m-k8s)에서 워커 노드들에 엔진엑스 애플리케이션을 설치하도록 명령을 보낸다.
- 애플리케이션을 배포하는 쿠버네티스의 단위는 Pod라는 단위
파드(Pod)란?
- 컨테이너들의 집합. -> 하나의 일을 하기 위해 묶여진 컨테이너들의 집합.
- 볼륨: 데이터를 저장
- 대부분은 단일 컨테이너 (하나의 도커가 하나의 파드)로 이루어짐
파드 배포 실습
- 터미너스를 키고 m-k8s에 접속한다. (환경 구성은 본 강의 1.2, 1.3 MAC OS X는 1.2, 8.006을 참고)
1. nginx 배포
[root@m-k8s ~]
pod/nginx created
- kubectl run nginx --image=nginx 명령어를 통해 nginx 파드를 생성한다.
[root@m-k8s ~]
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 8s
[root@m-k8s ~]
- kubectl get pod 명령어로 생성이 되었는지 확인한다.
[root@m-k8s ~]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 32s 172.16.221.131 w1-k8s <none> <none>
[root@m-k8s ~]
<!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>
- kubectl get pod -o wide로 생성한 파드의 아이피를 확인한다.
- curl 명령어로 해당 아이피로 명령을 보내보면 홈페이지에서 처음 나오는 메시지를 확인할 수 있다.
2.2 파드를 외부에서도 접속하게 하는 서비스(Service)
배포한 파드가 외부에서 접근 안되는 것을 확인
- 터미널에서 ping, crul 명령어로 접근을 시도했지만 응답이 없는 상태
현재 쿠버네티스 상태
- 쿠너베티스 클러스터 밖으로 나가려면 문을 통과해야 한다. 그래야 외부와 접근이 가능.
서비스 영역에 배포한 파드를 연결
- 서비스에서 노드 포트(NodePort)에 접속해 파드가 위치한 곳에 접근한다. 그리고 각 노드 포드들이 통신을 하면서 파드들이 위치한 곳을 찾아가는 구조. \
- 파드에 직접 연결되는 구조가 아니다.
서비스 실습
[root@m-k8s ~]
service/nginx exposed
[root@m-k8s ~]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d2h
nginx NodePort 10.107.2.22 <none> 80:32235/TCP 19s
- kubectl expose pod nginx --type=NodePort --port=80을 통해 서비스를 배포한다.
- kubectl get service를 사용하여 보면 NodePort 타입, 밖으로 32235 포트가 노출 되어 있는 것을 확인할 수 있다.
[root@m-k8s ~]
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
m-k8s Ready control-plane,master 6d2h v1.20.2 192.168.1.10 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://19.3.14
w1-k8s Ready <none> 6d2h v1.20.2 192.168.1.101 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://19.3.14
w2-k8s Ready <none> 6d2h v1.20.2 192.168.1.102 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://19.3.14
w3-k8s Ready <none> 6d1h v1.20.2 192.168.1.103 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://19.3.14
- kubectl get nodes -o wide 명령어로 가상환경에서 돌고 있는 노드들의 아이피 정보를 가져온다.
- 이후 크롬에서 192.168.1.101:32235로 접속해 본다.
curl 192.168.1.101:32235
<!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>
- 터미널에서 curl 명령어를 이용해서도 접근이 가능하다.
만약 파드가 죽게 되면?
- 파드가 여러 개 있을 수 있도록 준비한 단위인 디플로이먼트 개념이 나옴.
2.3 파드와 디플로이먼트(Deployment)의 차이
- 워커 노드의 파드를 디플로이먼트라는 단위로 묶었다.
디플로이먼트 배포 방법
- kubectl run -> 파드 배포 가능, 디플로이먼트 배포 불가능
- kubectl create -> 파드 배포 가능, 디플로이먼트 배포 가능
- kubectl apply -> 파드 배포 가능, 디플로이먼트 배포 가능 + 파일 필요
- create, apply를 이용을 하여 디플로이먼트를 배포한다.
실습 1
[root@m-k8s ~]
deployment.apps/deploy-nginx created
[root@m-k8s ~]
NAME READY STATUS RESTARTS AGE
deploy-nginx-8458f6dbbb-2jpbr 1/1 Running 0 14s
nginx
- 'kubectl create deployment' 명령어를 이용해 디플로이먼트를 배포한다.
- kubectl get pods 명령어로 디플로이먼트가 생성되었나 확인. 맨 마지막 값은 디플로이먼트를 구분하기 위해 랜덤으로 생성되는 값이다.
[root@m-k8s ~]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-8458f6dbbb-2jpbr 1/1 Running 0 44s 172.16.103.129 w2-k8s <none> <none>
nginx 1/1 Running 0 51m 172.16.221.131 w1-k8s <none> <none>
[root@m-k8s ~]
<!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>
ReplicaSet
- 디플로이먼트는 여러 개의 팟의 단위라고 했는데, 위의 실습에서 배포된 파드는 하나만 존재.
- ReplicaSet은 디플로이먼트로 배포할 파드의 수를 정해준다. (default = 1)
실습 2
[root@m-k8s ~]# kubectl scale deployment deploy-nginx --replicas=3
deployment.apps/deploy-nginx scaled
[root@m-k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-8458f6dbbb-2jpbr 1/1 Running 0 7m37s
deploy-nginx-8458f6dbbb-6dr7m 1/1 Running 0 92s
deploy-nginx-8458f6dbbb-lkg88 1/1 Running 0 92s
nginx 1/1 Running 0 58m
- 'kubectl scale' 명령어로 디플로이먼트의 스케일을 늘려준다. replicas=3으로 replica를 3으로 지정한다.
- 파드가 2개 더 늘어난 것을 확인할 수 있다.
2.4.외부로 노출하는 더 좋은 방법인 로드밸런서(LoadBalancer)
디플로이먼트를 NodePort로 배포하면?
- 사용자들에게 노드의 IP를 직접 알려줘야 하므로 보안적인 측면에서 위험 (대문의 비밀번호를 알려주는 느낌)
- 이를 해결하기 위해 로드밸런서 타입으로 배포를 한다.
- 엔진엑스 화면만으로는 어디로 접속되는지 확인하기 어려워 chk-hn이라는 이미지를 배포한다.
노드포트보다 로드밸런서가 좋은 점
- 노드의 IP를 알려줘야하는 부담이 없다.
- 가야할 경로를 최적화하여 보낼 수 있다. (구현 필요)
실습
[root@m-k8s ~]
anaconda-ks.cfg _Lecture_k8s_starter.kit
[root@m-k8s ~]
namespace/metallb-system created
podsecuritypolicy.policy/speaker created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
daemonset.apps/speaker created
deployment.apps/controller created
configmap/config created
- yaml 파일로 설정되어 있는 MetalLb를 실행하여 설치한다.
[root@m-k8s ~]
deployment.apps/chk-hn created
[root@m-k8s ~]
deployment.apps/chk-hn scaled
[root@m-k8s ~]
NAME READY STATUS RESTARTS AGE
chk-hn-595c5b45-cspxz 1/1 Running 0 34s
chk-hn-595c5b45-tbq7x 0/1 ContainerCreating 0 7s
chk-hn-595c5b45-v4xpg 0/1 ContainerCreating 0 7s
chk-hn-797f894699-lwxhs 0/1 Terminating 0 87s
deploy-nginx-8458f6dbbb-2jpbr 1/1 Running 0 46m
deploy-nginx-8458f6dbbb-6dr7m 1/1 Running 0 40m
deploy-nginx-8458f6dbbb-lkg88 1/1 Running 0 40m
nginx 1/1 Running 0 97m
- chk-hn 이라는 이미지를 설치하고 scale을 늘려준다.
[root@m-k8s ~]
service/chk-hn exposed
[root@m-k8s ~]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
chk-hn LoadBalancer 10.111.240.197 192.168.1.11 80:31011/TCP 7s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d3h
nginx NodePort 10.107.2.22 <none> 80:32235/TCP 77m
- 로드밸런서 타입으로 서비스를 배포한다.
- 'kubectl get services' 명령어를 입력하면 chk-hn 서비스의 외부 노출 IP가 192.168.1.11로 지정되어 있다.
[root@m-k8s ~]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
chk-hn-595c5b45-cspxz 1/1 Running 0 5m30s 172.16.103.131 w2-k8s <none> <none>
chk-hn-595c5b45-tbq7x 1/1 Running 0 5m3s 172.16.132.3 w3-k8s <none> <none>
chk-hn-595c5b45-v4xpg 1/1 Running 0 5m3s 172.16.221.133 w1-k8s <none> <none>
deploy-nginx-8458f6dbbb-2jpbr 1/1 Running 0 51m 172.16.103.129 w2-k8s <none> <none>
deploy-nginx-8458f6dbbb-6dr7m 1/1 Running 0 45m 172.16.221.132 w1-k8s <none> <none>
deploy-nginx-8458f6dbbb-lkg88 1/1 Running 0 45m 172.16.132.1 w3-k8s <none> <none>
nginx 1/1 Running 0 102m 172.16.221.131 w1-k8s <none> <none>
2.5 배포한 것들 삭제하기
삭제
[root@m-k8s ~]
service "chk-hn" deleted
[root@m-k8s ~]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d3h
nginx NodePort 10.107.2.22 <none> 80:32235/TCP 85m
[root@m-k8s ~]
service "nginx" deleted
[root@m-k8s ~]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d3h
- 기존에 만들었던 서비스가 삭제가 됐다.
- kubernetes ClusterIP 10.96.0.1은 기본적으로 쿠버네티스에 존재하는 서비스
[root@m-k8s ~]# kubectl delete deployment chk-hn
deployment.apps "chk-hn" deleted
[root@m-k8s ~]# kubectl delete deployment deploy-nginx
deployment.apps "deploy-nginx" deleted
[root@m-k8s ~]# kubectl delete pod nginx
pod "nginx" deleted
[root@m-k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
chk-hn-595c5b45-v4xpg 0/1 Terminating 0 14m
deploy-nginx-8458f6dbbb-lkg88 0/1 Terminating 0 55m
[root@m-k8s ~]# kubectl get pods
No resources found in default namespace.
- 마찬가지로 배포한 디플로이먼트와 팟도 삭제해준다.
- 이후 get pods 명령어로 보면 배포된 것들의 상태가 Terminating으로 변경된 것을 볼 수 있다.
[root@m-k8s ~]# kubectl delete -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml
namespace "metallb-system" deleted
podsecuritypolicy.policy "speaker" deleted
serviceaccount "controller" deleted
serviceaccount "speaker" deleted
clusterrole.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrole.rbac.authorization.k8s.io "metallb-system:speaker" deleted
role.rbac.authorization.k8s.io "config-watcher" deleted
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:speaker" deleted
rolebinding.rbac.authorization.k8s.io "config-watcher" deleted
daemonset.apps "speaker" deleted
deployment.apps "controller" deleted
configmap "config" deleted
- yaml 파일로 배포했던 metallb도 삭제 한다.
강의: 쉽게 시작하는 쿠버네티스(v1.20)