쿠버네티스에서는 외부에서 쿠버네티스 클러스터에 접속하는 방법을 서비스라고합니다. 서비스를 소비를 위한 도움을 제공한다 는 관점으로 바라본다면 쿠버네티스가 외부에서 쿠버네티스 클러스터에 접속하기 위한 서비스를 제공한다고 볼 수 있습니다.
가장 간단하게 연결하는 노드포트
노드포트 서비스를 설정하면, 모든 워커노드의 특정 포트를 열고, 이를 통해 오는 모든 요청을 노드포트 서비스로 전달하게 됩니다. 노드포트 서비스는 해당 태스크를 처리 할 수 있는 파드로 요청을 전달하게 됩니다.
노드포트 서비스로 외부에서 접속하기
디플로이먼트 파드를 생성하겠습니다.
ubuntu@master001:~$ k create deployment np-pods --image=sysnet4admin/echo-hname
deployment.apps/np-pods created
ubuntu@master001:~$
create를 사용하여 노드포트 서비스를 생성하겠습니다. 오브젝트 스펙은 다음과 같습니다.
apiVersion: v1
kind: Service
metadata:
name: np-svc
spec:
selector:
app: np-pods
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
type: NodePort
ubuntu@master001:~$ k create -f nodeport.yaml
service/np-svc created
ubuntu@master001:~$
오브젝트 스펙을 살펴보면, kind가 service로 변경되었고 spec에 컨테이너 정보가 없습니다. 대신 접속에 필요한 protocol, port, targetPort, nodePort가 추가되었습니다.

노드포트 서비스로 생성한 np-svc 서비스를 확인합니다.
ubuntu@master001:~$ k get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16d
np-svc NodePort 10.108.158.226 <none> 80:30000/TCP 7m18s
ubuntu@master001:~$
노드포트의 포트번호가 30000으로 지정되었습니다.
워커노드의 ip를 확인하고, 접속하여 내용을 확인해보겠습니다.
ubuntu@master001:~$ k get no -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master001 Ready control-plane 16d v1.27.4 10.0.140.82 <none> Ubuntu 20.04.6 LTS 5.15.0-1036-aws containerd://1.6.16
slave001 Ready <none> 16d v1.27.4 10.0.142.128 <none> Ubuntu 20.04.6 LTS 5.15.0-1040-aws containerd://1.6.16
slave002 Ready <none> 16d v1.27.4 10.0.131.50 <none> Ubuntu 20.04.6 LTS 5.15.0-1036-aws containerd://1.6.16
ubuntu@master001:~$ curl 10.0.140.82:30000
np-pods-7d77fcf75b-p76wp
ubuntu@master001:~$ curl 10.0.142.128:30000
np-pods-7d77fcf75b-p76wp
ubuntu@master001:~$ curl 10.0.131.50:30000
np-pods-7d77fcf75b-p76wp
ubuntu@master001:~$ k get po
NAME READY STATUS RESTARTS AGE
np-pods-7d77fcf75b-p76wp 1/1 Running 0 12m
ubuntu@master001:~$
3개 노드의 모든 30000포트에대해서 1개의 파드이름이 출력됩니다. 해당파드이름은, 이전에 노드포트 서비스로 생성한 파드입니다.
부하분산 테스트하기
디플로이먼트로 생성된 파드 1개에 접속중에 파드가 3개로 증가하는경우 부하가 분산되는지 (로드밸런싱) 확인해보겠습니다.
마스터노드에서 명령을 실행합니다. 해당 명령은 반복적으로 워커노드1에 접속하여 파드이름을 화면에 표시합니다.
#!/bin/bash
i=0
while true; do
i=$((i + 1))
echo -n "$i "
curl -s "<http://10.0.142.128:30000>" | tr -d '\\n'
echo "\\n"
sleep 1
done
ubuntu@master001:~$ chmod +x load.sh
ubuntu@master001:~$ ./load.sh
1 np-pods-7d77fcf75b-p76wp\\n
2 np-pods-7d77fcf75b-p76wp\\n
3 np-pods-7d77fcf75b-p76wp\\n
4 np-pods-7d77fcf75b-p76wp\\n
5 np-pods-7d77fcf75b-p76wp\\n
6 np-pods-7d77fcf75b-p76wp\\n
7 np-pods-7d77fcf75b-p76wp\\n
8 np-pods-7d77fcf75b-p76wp\\n
9 np-pods-7d77fcf75b-p76wp\\n
10 np-pods-7d77fcf75b-p76wp\\n
11 np-pods-7d77fcf75b-p76wp\\n
12 np-pods-7d77fcf75b-p76wp\\n
13 np-pods-7d77fcf75b-p76wp\\n
14 np-pods-7d77fcf75b-p76wp\\n
15 np-pods-7d77fcf75b-p76wp\\n
16 np-pods-7d77fcf75b-p76wp\\n
17 np-pods-7d77fcf75b-p76wp\\n
마스터노드 터미널을 하나 더 띄운 후 스케일을 실행하여 파드를 증가시킵니다.
ubuntu@master001:~$ k scale deployment np-pods --replicas=3
deployment.apps/np-pods scaled
93 np-pods-7d77fcf75b-p76wp\\n
94 np-pods-7d77fcf75b-b6gk4\\n
95 np-pods-7d77fcf75b-p76wp\\n
96 np-pods-7d77fcf75b-p76wp\\n
97 np-pods-7d77fcf75b-b6gk4\\n
98 np-pods-7d77fcf75b-25kbq\\n
99 np-pods-7d77fcf75b-25kbq\\n
배포된 파드 3개가 돌아가면서 표시됩니다. 즉,부하 분산(로드 밸런싱)이 제대로 되는것을 확인할 수 있습니다.
expose로 노드포트 서비스 생성하기
오브젝트 스펙이 아닌 expose명령어로도 노드포트 서비스를 생성 할 수 있습니다.
expose명령어를 사용하여 서비스로 내보낼 디플로이먼트를 지정한 후 타입을 NodePort로 지정합니다. 서비스가 파드로 보내줄 연결 포트도 지정해줍니다.
ubuntu@master001:~$ k expose deployment np-pods --type=NodePort --name=np-svc-v2 --port=80
service/np-svc-v2 exposed
ubuntu@master001:~$
생성된 서비스를 확인합니다. expose사용시에 30000~32767에서 임의로 포트가 지정됩니다.
'Infra > Kubernetes' 카테고리의 다른 글
| K8s from scratch - 6. 인그레스 (0) | 2023.10.25 |
|---|---|
| K8s from scratch - 4. 노드 유지관리 및 보수 (0) | 2023.10.25 |
| K8s from scratch - 3. 파드 생성 및 삭제, Self-Healing (0) | 2023.10.25 |
| K8s from scratch - 2. 쿠버네티스 구성 요소 (0) | 2023.10.25 |
| K8s from scratch - 1. AWS 에서 쿠버네티스 환경 구축하기 (0) | 2023.10.25 |