이재홍의 언제나 최신 Kubernetes - Unit 4.2 Nginx 디플로이먼트와 서비스의 구조 살펴보기

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

Nginx YAML 설정 파일 작성하기

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

Nginx 디플로이먼트와 서비스의 구조 살펴보기

디플로이먼트와 서비스를 YAML 파일로 작성하여 Nginx 웹 서버를 실행해보았습니다. 이번에는 디플로이먼트와 서비스의 구조를 알아보겠습니다.

쿠버네티스는 매니페스트 파일(설정파일)이 다소 복잡하여 익숙해지는데 시간이 조금 걸립니다. 하지만, 핵심만 이해하면 크게 어렵지 않습니다.

먼저 쿠버네티스 매니페스트 파일의 필수 구성요소는 apiVersion, kind, metadata, spec입니다.

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-nginx
  template:
    metadata:
      labels:
        app: hello-nginx
    spec:
      containers:
        - name: hello-nginx
          image: nginx:latest
          ports:
            - containerPort: 80
  • .apiVersion: 현재 리소스의 API 버전입니다. 이 버전은 시간이 지남에 따라 계속 바뀝니다(예: v1, v1beta1 등). 여기서는 apps/v1를 지정합니다.
  • .kind: 현재 리소스의 종류를 지정합니다. 여기서는 디플로이먼트를 작성하므로 Deployment를 지정합니다.
  • .metadata: 현재 오브젝트의 이름과 각종 설정 정보가 들어갑니다. 나중에 metadata는 리소스에 따라 중요하게 사용되기도 하므로 눈여겨 보는게 좋습니다.
  • .spec: 현재 오브젝트의 원하는 상태를 정의하는 부분입니다. 여기서는 디플로이먼트의 각종 설정값들이 들어갑니다.

디플로이먼트의 metadata에서는 name에 디플로이먼트의 이름을 지정합니다. 여기서 지정한 이름은 kubectl get all 명령을 실행했을 때 pod 부분에 나오게 됩니다(pod는 name 뒤에 랜덤값이 붙습니다).

metadata:
  name: hello-nginx

spec에는 오브젝트의 원하는 상태를 정의한다고 했습니다. 즉, 쿠버네티스는 spec에 정의된 대로 디플로이먼트를 유지합니다. 예를 들어 replicas가 1이면 pod을 1개만 유지하고, 10이면 10개를 유지합니다. 만약 pod 10개 중 2개가 중단(terminate)되었다면, 10개를 맞추기 위해 다시 2개를 생성합니다.

아래 설정은 실제로는 레플리카셋(replicaset)과 파드(pod)의 설정을 모두 담고 있습니다.

spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-nginx
  template:
    metadata:
      labels:
        app: hello-nginx
    spec:
      containers:
        - name: hello-nginx
          image: nginx:latest
          ports:
            - containerPort: 80
  • .spec.replicas: 레플리카셋에서 파드를 몇 개 유지할지 설정합니다. 여기서는 1로 설정해서 1개만 유지합니다.
  • .spec.selector: 디플로이먼트가 관리할 파드를 찾는 방법을 정의합니다. 여기서는 matchLabelsapp: hello-nginx로 설정했으므로 키가 app, 값이 hello-nginx로 정확히 일치하는 파드를 찾습니다.
  • .spec.template: 여기서부터 파드 설정입니다.
    • metadata: labels에 키-값을 설정하여 디플로이먼트가 찾을 수 있도록 합니다. 여기서는 app: hello-nginx를 설정했습니다.
    • spec: 파드의 spec입니다. 파드에는 컨테이너가 여러 개 들어갈 수 있어서 containers로 되어있고, 그 아래에는 -를 사용하여 배열(Array)로 값을 설정합니다.
      • containers: name에는 컨테이너의 이름을 설정합니다. 여기서는 hello-nginx로 설정했지만 셀렉터와는 상관이 없습니다. image에는 컨테이너를 실행할 Docker 이미지를 설정합니다. <이미지>:<태그> 형식이며 여기서는 nginx:latest를 설정했습니다. 마지막으로 ports 아래에 배열 형태로 containerPort를 설정합니다. containerPort는 컨테이너에서 개방할 포트 번호를 뜻합니다. 여기서는 Nginx 웹 서버의 HTTP 포트인 80을 설정했습니다.

그림 4-2 Nginx 디플로이먼트

이제 서비스를 살펴볼 차례입니다. 서비스는 파드를 쿠버네티스 네트워크나 외부에 노출할 때 사용한다고 했는데, 여기서는 ClusterIP를 사용하여 쿠버네티스 네트워크에만 노출하도록 하겠습니다. 외부에 노출하는 방법은 뒤에서 설명하겠습니다.

service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-nginx
spec:
  selector:
    app: hello-nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP
  • .apiVersion: 현재 리소스의 API 버전입니다. 이 버전은 시간이 지남에 따라 계속 바뀝니다(예: v1, v1beta1 등). 여기서는 v1를 지정합니다.
  • .kind: 현재 리소스의 종류를 지정합니다. 여기서는 서비스를 작성하므로 Service를 지정합니다.
  • .metadata: 현재 오브젝트의 이름과 각종 설정 정보가 들어갑니다.
  • .spec: 현재 오브젝트의 원하는 상태를 정의하는 부분입니다. 여기서는 서비스의 각종 설정값들이 들어갑니다.

서비스의 metadata에서는 name에 서비스의 이름을 지정합니다. 여기서 지정한 이름은 kubectl get all 명령을 실행했을 때 service 부분에 나오게 됩니다.

metadata:
  name: hello-nginx

서비스의 spec 부분입니다. 여기서는 selectorports 부분이 중요합니다.

spec:
  selector:
    app: hello-nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP
  • .spec.selector: 서비스가 트래픽을 전달할 파드를 선택합니다. 여기서는 app: hello-nginx을 설정했으므로 키가 app, 값이 hello-nginx인 파드를 찾습니다.
  • .spec.ports: 서비스의 포트 설정이며 -를 사용하여 배열(Array)로 값을 설정합니다. protocol은 서비스가 처리할 프로토콜이며 여기서는 HTTP만 처리하므로 TCP로 설정합니다. port는 서비스가 개방할 포트입니다. 여기서는 80을 설정했습니다. targetPort는 파드에 열려 있는 포트를 의미합니다. 따라서 80을 설정합니다.
  • .spec.type: 서비스의 type은 여러 가지가 있지만 여기서는 ClusterIP를 설정하여 쿠버네티스 네트워크 안에서만 포트를 노출하도록 합니다.

그림 4-3 Nginx 서비스


저작권 안내

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

Published

2022-10-22