[Kubernetes]ExternalIP 동작 확인

5532 단어 kubectlkubernetes

소개



"ClusterIP의 동작 확인"에서는 ClusterIP가 클러스터 내에서만 통신하는 서비스라고 가정했습니다. 그러나 ClusterIP에는 ExteralIP를 구성할 수 있으며 이를 구성하여 클러스터 외부의 노드와 통신할 수 있습니다.
이번에는이 ExternalIP의 동작을 확인하고 싶습니다.

설정



ExternalIP는 매니페스트 유형으로 설정하지 않습니다. type은 ClusterIP입니다. 다소 어렵습니다.
작성한 매니페스트는 다음과 같습니다. ClusterIP 매니페스트에 'spec.externalIPs'를 추가합니다.

sampleExternalIP.yaml
apiVersion: v1
kind: Service
metadata:
  name: external-ip
spec:
  type: ClusterIP
  externalIPs:
    - 10.20.30.20
  ports:
    - name: cluster-port
      protocol: TCP
      port: 8080
      targetPort: 80
  selector:
    app: nginx-dep

설정할 IP 주소는 클러스터를 구성하는 노드의 IP 주소입니다. 모든 것을 지정할 필요는 없습니다. 여기서는 worker01만 지정합니다.
$ kubectl get node -o wide
NAME           STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
k8s-master     Ready    master   39d   v1.17.3   10.20.30.10   <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://19.3.6
k8s-worker01   Ready    <none>   39d   v1.17.3   10.20.30.20   <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://19.3.6
k8s-worker02   Ready    <none>   39d   v1.17.3   10.20.30.30   <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://19.3.6

ExternalIP 만들기



이 매니페스트를 적용하여 만든 서비스를 확인합니다.
$ kubectl apply -f sampleExternalIP.yaml
service/external-ip created
$ kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
cluster-ip    ClusterIP   10.101.47.213   <none>        8080/TCP   31h
external-ip   ClusterIP   10.98.225.181   10.20.30.20   8080/TCP   7s
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP    39d
$ kubectl describe svc external-ip
Name:              external-ip
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"external-ip","namespace":"default"},"spec":{"externalIPs":["10.20...
Selector:          app=nginx-dep
Type:              ClusterIP
IP:                10.98.225.181
External IPs:      10.20.30.20
Port:              cluster-port  8080/TCP
TargetPort:        80/TCP
Endpoints:         192.168.69.236:80,192.168.79.92:80
Session Affinity:  None
Events:            <none>

동작 확인



클러스터에는 이전 작성한 Pod(Deployment)가 있습니다. 이 Pod에 대해 외부로부터의 소통을 확인합니다.
$ kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
nginx-6c4975c9f5-v5ljf   1/1     Running   1          31h   192.168.69.236   k8s-worker02   <none>           <none>
nginx-6c4975c9f5-x4bwq   1/1     Running   1          31h   192.168.79.92    k8s-worker01   <none>           <none>

검증에 사용하는 클러스터는 PC의 VertualBOX로 구축됩니다. 클러스터를 구성하는 VM 외에도 Gateway가 되는 VM도 있으므로 여기에서 HTTP 요청을 보내 소통을 확인합니다.
검증 환경은 여기를 참조해 주세요.


[gateway ~]$ for i in 1 2 3 4 5 ;do curl -s http://10.20.30.20:8080 | grep pod; sleep 5; done
pod1
pod1
pod1
pod2
pod2

소통의 확인과 밸런싱되고 있는 것을 알 수 있군요.
또한 ExternalIP를 설정한 노드는 worker01(10.20.30.20)뿐이지만 worker02에 배포된 Pod1에도 밸런싱되어 있음을 알 수 있습니다.

ExternalIP로 설정하고 "없음"worker02 (10.20.30.30)에서 소통할 수 없다는 것을 확인합니다.
[gateway ~]$ for i in 1 2 3 4 5 ;do curl -s http://10.20.30.30:8080 | grep pod; sleep 5; done
[gateway ~]$

Error가 나오는 것은 아니기 때문에 이해하기 어렵습니다만, 아무것도 응답이 없고 프롬프트가 돌아옵니다.

요약



이번에는 ExternalIP의 동작을 확인했습니다. 이것만이라면 NodePort와 같아 보이지만 NodePort의 동작을 확인할 때 차이를 확인하고 싶습니다.

좋은 웹페이지 즐겨찾기