[kubernetes] 배포를 통한 쿠버네티스 체험

DaeHoon·2022년 8월 27일
0

kubernetes

목록 보기
2/6

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 ~]# kubectl run nginx --image=nginx
pod/nginx created
  • kubectl run nginx --image=nginx 명령어를 통해 nginx 파드를 생성한다.
[root@m-k8s ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          8s
[root@m-k8s ~]# kubectl get pod -o wide
  • kubectl get pod 명령어로 생성이 되었는지 확인한다.
[root@m-k8s ~]# kubectl get pod -o wide
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 ~]# curl 172.16.221.131
<!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 ~]# kubectl expose pod nginx --type=NodePort --port=80
service/nginx exposed
[root@m-k8s ~]# kubectl get service
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 ~]# kubectl get nodes -o wide
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 ~]# kubectl create deployment deploy-nginx --image=nginx
deployment.apps/deploy-nginx created
[root@m-k8s ~]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
deploy-nginx-8458f6dbbb-2jpbr   1/1     Running   0          14s
nginx                      
  • 'kubectl create deployment' 명령어를 이용해 디플로이먼트를 배포한다.
  • kubectl get pods 명령어로 디플로이먼트가 생성되었나 확인. 맨 마지막 값은 디플로이먼트를 구분하기 위해 랜덤으로 생성되는 값이다.
[root@m-k8s ~]# kubectl get pods -o wide
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 ~]# 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>

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 ~]# ls
anaconda-ks.cfg  _Lecture_k8s_starter.kit

[root@m-k8s ~]# kubectl apply -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml
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 ~]# 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
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 ~]# kubectl expose deployment chk-hn --type=LoadBalancer --port=80
service/chk-hn exposed

[root@m-k8s ~]# kubectl get services
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 ~]# kubectl get pods -o wide
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>
  • 워커 노드 3번에 존재

2.5 배포한 것들 삭제하기

삭제

[root@m-k8s ~]# kubectl delete service chk-hn
service "chk-hn" deleted

[root@m-k8s ~]# kubectl get services
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 ~]# kubectl delete service nginx
service "nginx" deleted

[root@m-k8s ~]# kubectl get services
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)

profile
평범한 백엔드 개발자

0개의 댓글