이재홍의 언제나 최신 Kubernetes - Unit 6.4 NodePort로 서비스 생성하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

로컬에서 Kubernetes 클러스터 구축하기

이재홍 http://www.pyrasis.com

NodePort로 서비스 생성하기

지금까지 Minikube의 한계로 인해 서비스를 생성할 때 typeClusterIP로 만들고 kubectl port-forward로만 실습을 해보았습니다. 이번에는 Vagrant와 VirtualBox로 구축한 정식 쿠버네티스 클러스터에서 서비스 typeNodePort로 만들어서 실습을 해보겠습니다.

다음 내용을 deployment.yaml 파일로 저장합니다. 이 디플로이먼트는 Nginx 파드를 3개 생성하는데, 모든 워커 노드(worker1, 2, 3)에 1개씩 고르게 생성합니다. affinity 부분이 상당히 복잡해보이지만, 자세히 보면 크게 어려울 것이 없습니다. podAntiAffinity는 이름 그대로 관련성 없음(anti-affinity)이라는 의미로 requiredDuringSchedulingIgnoredDuringExecution(스케쥴링하는 동안 꼭 필요한 조건)과 조합하여 해당 호스트(topologyKey: 'kubernetes.io/hostname')에 파드가 생성되어 있지 않으면 파드를 생성한다는 의미입니다.

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-nginx
  template:
    metadata:
      labels:
        app: hello-nginx
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - hello-nginx
              topologyKey: 'kubernetes.io/hostname'
      containers:
        - name: hello-nginx
          image: nginx:latest
          ports:
            - containerPort: 80

다음 명령을 실행하여 deployment.yaml 파일로 디플로이먼트를 생성합니다.

$ kubectl create -f deployment.yaml
deployment.apps/hello-nginx created

정말 파드가 각 노드에 고르게 생성되었는지 확인해보겠습니다. kubectl get pod 명령은 파드만 출력하는 명령입니다.

$ kubectl get pod -l app=hello-nginx -o wide
NAME                          READY   STATUS    RESTARTS   AGE    IP           NODE      NOMINATED NODE   READINESS GATES
hello-nginx-648486ccd-4shxl   1/1     Running   0          157m   10.244.1.5   worker1   <none>           <none>
hello-nginx-648486ccd-7jb46   1/1     Running   0          153m   10.244.3.5   worker3   <none>           <none>
hello-nginx-648486ccd-qjvkx   1/1     Running   0          153m   10.244.2.5   worker2   <none>           <none>

-l 옵션은 특정 레이블을 가져오겠다는 뜻이고, -o 옵션은 출력 방식을 결정하는데, wide를 설정하여 상세 정보를 출력하도록 했습니다. NODE 부분을 보면 worker1, 2, 3에 고르게 파드가 생성된 것을 볼 수 있습니다.

Nginx 서비스

이번에는 서비스를 생성해보겠습니다. 다음 내용을 service.yaml 파일로 저장합니다.

service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-nginx
spec:
  selector:
    app: hello-nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

이 서비스는 typeNodePort로 설정되어 있습니다. 즉, 각 노드의 포트로 서비스를 노출하겠다는 뜻입니다.

다음 명령을 실행하여 service.yaml 파일로 서비스를 생성합니다.

$ kubectl create -f service.yaml
service/hello-nginx created

이제 서비스의 포트 번호를 조회해보겠습니다. kubectl get service 명령은 서비스만 출력하는 명령입니다.

$ kubectl get service
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
hello-nginx   NodePort    10.108.89.52   <none>        80:31490/TCP   163m
kubernetes    ClusterIP   10.96.0.1      <none>        443/TCP        10h

hello-nginx 서비스의 PORT(S) 부분을 보면 80:31490/TCP라고 나오는데, 80:뒤에 있는 포트가 노드에 열린 포트 번호입니다. 주의할 점은 이 포트 번호가 서비스를 생성할 때 마다, 클러스터 마다 각자 다르게 나온다는 점입니다. 따라서 이 문서와 일치하지 않을 수 있습니다.

웹 브라우저를 열고 다음 URL에 각각 접속하면 Welcome to nginx!가 표시될 것입니다.

  • worker1: http://192.168.56.11:<노드 포트>
  • worker2: http://192.168.56.12:<노드 포트>
  • worker3: http://192.168.56.13:<노드 포트>

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2022-10-22