[Kubernetes] NodePort 서비스의 동작 확인

6113 단어 kubectlkubernetes

소개



이번에는 Service의 하나인 NodePort의 동작을 확인하고 싶습니다.
지난번 은 ExternalIP 동작을 확인했습니다. 동작적으로 NodePort와 ExternalIP는 매우 비슷하기 때문에 차이를 중심으로 확인하고 싶습니다.

NodePort 설정 및 개요



다음 매니페스트를 만들었습니다.

sampleNodePort.yaml
apiVersion: v1
kind: Service
metadata:
  name: node-port
spec:
  type: NodePort
  ports:
    - name: node-port
      protocol: TCP
      port: 8080
      targetPort: 80
      nodePort: 30001
  selector:
    app: nginx-dep

NodePort는 모든 작업자 노드를 입구로 외부와 통신합니다. 따라서 ExternalIP는 외부와 통신하는 노드의 IP 주소를 매니페스트에 설명했지만 NodePort에는 해당 항목이 없습니다.
대신 통신을 수락할 포트(nodePort)를 지정합니다. 매니페스트에서 지정하지 않으면 기본 "30000-32767"범위에서 자동으로 할당됩니다. 매니페스트로 설정하는 경우에도 이 범위에서 지정합니다.

"port""targetPort"는 ClusterIP와 유사합니다. NodePort는 내부에 ClusterIP를 포함하는 이미지입니다.



NodePort 만들기



이 매니페스트를 apply합니다.
$ kubectl apply -f sampleNodePort.yaml
service/node-port created
$ kubectl get svc -o wide
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE    SELECTOR
cluster-ip    ClusterIP   10.101.47.213    <none>        8080/TCP         3d6h   app=nginx-dep
external-ip   ClusterIP   10.98.225.181    10.20.30.20   8080/TCP         47h    app=nginx-dep
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP          41d    <none>
node-port     NodePort    10.101.179.255   <none>        8080:30001/TCP   13s    app=nginx-dep
$ kubectl describe svc node-port
Name:                     node-port
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"node-port","namespace":"default"},"spec":{"ports":[{"name":"node-...
Selector:                 app=nginx-dep
Type:                     NodePort
IP:                       10.101.179.255
Port:                     node-port  8080/TCP
TargetPort:               80/TCP
NodePort:                 node-port  30001/TCP
Endpoints:                192.168.69.246:80,192.168.79.106:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

동작 확인



외부와의 소통



외부(gateway)에서 소통할 수 있는지 확인합니다.
[gateway ~]$ for i in 1 2 3 4 5 ;do curl -s http://k8s-worker01:30001 | grep pod; sleep 5;done
pod1
pod1
pod1
pod2
pod2
[gateway ~]$ for i in 1 2 3 4 5 ;do curl -s http://k8s-worker02:30001 | grep pod; sleep 5;done
pod1
pod1
pod2
pod1
pod2

2개의 worker 노드(worker01/worker02)의 어느 쪽에서도 소통할 수 있는 것과 밸런싱되고 있는 것을 확인할 수 있네요.

내부 소통



NodePort의 ClusterIP로서의 동작도 확인해 보겠습니다.
테스트용 포드로 다음을 사용합니다.

test_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: centos
      image: centos:latest
      command:
      - sh
      - -c
      args:
      - for i in 1 2 3 4 5 ; do curl -s http://node-port.default.svc.cluster.local:8080 ; sleep 5; done ;exit 0

FQDN에서 지정했지만 ClusterIP와 동일한 규칙입니다. 또한 포트 번호는 "nodePort"가 아니라 "port"를 지정합니다.

[Kubernetes] 클러스터 내 DNS의 동작 확인

이 매니페스트를 적용하고 30초 정도 기다려 로그를 확인합니다.
$ kubectl apply -f test_pod.yaml
pod/test-pod created
$ kubectl logs test-pod | grep pod
pod2
pod1
pod2
pod2
pod1

ClusterIP로서도 제대로 동작하고 있네요.

요약



이번에는 NodePort의 동작을 확인했습니다.
ExternalIP와의 차이는 외부와의 통신의 입구가 되는 노드가 매니페스트로 지정한 노드만(ExternalIP)인가, 전체 노드(NodePort)인가의 차이일까요?
동작적으로는 닮아 있습니다만, ExternalIP는 ClusterIP 그 자체를 외부와 통신할 수 있도록 한 것으로, NodePort는 ClusterIP에 1개 레이어를 씌운 느낌이군요. 그 효과 정도까지는 모르기 때문에, 2개의 차이를 의식하면서 앞으로도 검증하고 싶습니다.

좋은 웹페이지 즐겨찾기