클라우드/Kubernetes

[쿠버네티스] 노드포트 / 클러스터 내부 접속 / 부하분산

세브웁스 2022. 10. 25. 11:14
반응형

이론

노드포트란?

  • 외부에서 쿠버네티스 클러스터로 접속하는 가장 쉬운 방법
  • 모든 워커 노드의 특정 포트를 열고 모든 요청을 노드포트 서비스로 전달
  • Object Spec 방법 / expose 명령어 2가지 방법이 존재
  • kubectl create -f (yaml파일)
  • kubectl expose deployment (파드 이름) --type=NodePort --name=이름 --port=포트

실습

외부에서 접속하기 

디플로이먼트로 파드 생성 

[root@m-k8s ~]# kubectl create deployment np-pods --image=sysnet4admin/echo-hname
deployment.apps/np-pods created

노드포트 서비스 생성 (yaml 파일 이용)

[root@m-k8s ~]# kubectl create -f ~/_Book_k8sInfra/ch3/3.3.1/nodeport.yaml
service/np-svc created

 

노드포트 서비스로 생성한 np-svc 서비스 확인 & 워커 노드 IP 확인

[root@m-k8s ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        11d
np-svc       NodePort    10.97.254.242   <none>        80:30000/TCP   62s

[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    master   11d   v1.18.4   192.168.1.10    <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1
w1-k8s   Ready    <none>   11d   v1.18.4   192.168.1.101   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1
w2-k8s   Ready    <none>   11d   v1.18.4   192.168.1.102   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1
w3-k8s   Ready    <none>   11d   v1.18.4   192.168.1.103   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1

 

호스트 노트북에서 웹 브라우저로 접속되는지 확인 (102,103은 사진 생략)


부하 분산 테스트

 

현재 접속한 호스트의 이름 출력 (결과 :  1가지 호스트 이름만 나옴)

PS C:\HashiCorp\_Book_k8sInfra-main\ch3\3.1.3> $i=0; while($true)
{
 % { $i++; write-host -NoNewLine "&i &_" }
  (Invoke-RestMethod "http://192.168.1.101:30000")-replace '\n', " "
}

# 결과 :  1가지 이름만 나옴

 

파드를 3개로 증가시킴

[root@m-k8s ~]# kubectl scale deployment np-pods --replicas=3
deployment.apps/np-pods scaled

[root@m-k8s ~]# kubectl get pods
NAME                       READY   STATUS              RESTARTS   AGE
np-pods-5767d54d4b-pthcm   1/1     Running             0          6s
np-pods-5767d54d4b-qc98k   1/1     Running             0          15m
np-pods-5767d54d4b-vkjjr   0/1     ContainerCreating   0          6s

다시 현재 접속한 호스트의 이름 출력 (결과 : 3가지 호스트 이름이 나옴)

PS C:\HashiCorp\_Book_k8sInfra-main\ch3\3.1.3> $i=0; while($true)
{
 % { $i++; write-host -NoNewLine "&i &_" }
  (Invoke-RestMethod "http://192.168.1.101:30000")-replace '\n', " "
}

# 결과 :  3가지 이름 나옴

expose로 노드포트 서비스 생성

 

서비스로 내보낼 디플로이먼트 지정 (타입은 NodePort) & 생성된 서비스 확인

[root@m-k8s ~]# kubectl expose deployment np-pods --type=NodePort --name=np-svc-v2 --port=80 service/np-svc-v2 exposed

[root@m-k8s ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        11d
np-svc       NodePort    10.97.254.242   <none>        80:30000/TCP   18m
np-svc-v2    NodePort    10.105.2.214    <none>        80:30053/TCP   14s

 

웹 브라우저로 접속 (포트는 무작위 필자는 30053)

 

디플로이먼트 및 서비스 삭제

[root@m-k8s ~]# kubectl delete deployment np-pods
deployment.apps "np-pods" deleted

[root@m-k8s ~]# kubectl delete services np-svc
service "np-svc" deleted

[root@m-k8s ~]# kubectl delete services np-svc-v2
service "np-svc-v2" deleted

자동으로 부하분산..?

기존에는 분산에 대한 여러 정책을 설정하며 ip를 일일이 설정했어야 했는데

쿠버네티스는 명령어 몇 줄로 간편하게 구현하는 것이 가능하다.

반응형