클라우드/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를 일일이 설정했어야 했는데
쿠버네티스는 명령어 몇 줄로 간편하게 구현하는 것이 가능하다.
반응형