쿠버네티스에 Nginx 배포하기 (Deployment / Pod)

Proxmox에 구축한 Kubernetes에 첫 응용프로그램을 배포했다. 배포한 응용프로그램은 깡통 Nginx로서 디플로이먼트(Deployment)로 배포했다. 쿠버네티스에서 응용프로그램을 배포하는 가장 일반적인 방법이 디플로이먼트를 생성해 배포하는 것이다.

디플로이먼트란

쿠버네티스에서 응용프로그램 배포의 최소단위는 컨테이너(container)가 포함된 POD인 것이 일반적이다. 그리고 POD는 1개 이상의 컨테이너를 포함하는 관리단위다. 그리고 쿠버네티스가 POD를 관리하는데 필요한 정보를 포함하는 배포단위가 바로 디플로이먼트다. 디플로이먼트는 확장자가 yaml 인 파일에 정의가 되고 정의된 yaml 파일을 kubectl 명령을 통해 POD로 빌드하여 워커노드에 배포된다.

쿠버네티스에서 디플로이먼트는 Stateless 상태의 응용프로그램을 배포하는데 사용된다. 여기서 Stateless란 일단 생성하여 배포된 뒤 다음번 배포 때 까지 변화가 없는 즉 데이터를 파일로 저장하거나 파일에서 변경된 정보를 읽어 동작할 필요가 없는 응용프로그램을 말한다.

NginX 디플로이먼트 파일 작성

디플로이먼트는 yaml 파일로 작성된다. Nginx를 노드에 배포하기 위해 작성되는 최소한의 디플로이먼트는 다음과 같이 작성될 수 있다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-server
  labels:
    app: server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: server
  template:
    metadata:
      name: nginx-server
      labels:
        app: server
    spec:
      containers:
        - name: server
          image: nginx:1.23.3
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: server
spec:
  selector:
    app: server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service-node
  labels:
    app: server
spec:
  selector:
    app: server
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080

이 yaml 파일은 모두 세 영역으로 분리되어 있다. “—” 로 구분된 세 영역이다. 그리고 각 영역은 kind : 에서 선언한 유형(종류)에 대한 정의다.

첫 번째 영역은 Deployment 유형의 정의다. 디플로이먼트의 이름과 라벨, 그리고 스펙으로 정의된다. 스펙에는 생성하여 배포할 Nginx .POD의 개수 (replicas)를 포함하는 POD 관리에 대한 정보를 포함하고 있다. 그리고 사용할 Nginx의 컨테이너 이미지를 어디에서 다운로드 받는지도 정의되어 있다. ( containers: 와 image: ) 별도의 컨테이너 레지스트리를 지정하지 않을 경우 인터넷의 Docker Hub에서 image: 에 선안한 컨테이너 이미지를 다운로드 받아 배포하게 된다.

“—” 으로 구분된 두 번째 영역은 Service에 대한 정의다. 이 영역에는 POD 내 Nginx가 사용할 네트워크에 대한 선언이다. TCP/80을 사용한다고 선언되어 있다.

마찬가지로 “—“로 구분된 마지막 세 번째 영역은 두 번재 영역의 서비스와 연결될 노드, 즉 POD가 실행되는 워커노드의 어떤 포트와 연결될 것인가가 선언되어 있다. (nodePort)

이 파일을 적당한 이름으로 저장한다. 여기에서는 first-deployment-nginx.yaml 로 저장한다.

kubectl 명령으로 POD생성 및 배포

kubectl 명령은 마스터 노드에서 실행해도 되지만 Windows PC에 kubectl을 설치하고 first-deployment-nginx.yaml 파일도 PC에 저장한 다음 다음의 명령을 통해 POD를 빌드해 배포한다.

$ kubectl create -f first-deployment-nginx.yaml

이 명령을 실행하면 다음과 같이 Deployment와 Service, Service Node가 생성된다.

배포된 디플로이먼트를 확인한다.

$ kubectl get deployment

다음과 같이 배포된 디플로이먼트가 보인다.

배포된 POD도 확인할 수 있다.

$ kubectl get pod

다음과 같이 방금 생성한 Nginx POD가 보인다.

생성한 서비스 네트워크도 조회할 수 있다.

$ kubectl get service

다음과 같이 생성된 네트워크 서비스가 조회된다.

각각의 명령으로 따로 따로 보기 귀찮다면 한번에 조회도 가능하다.

$ kubectl get deploy,pod,svc,ep

디플로이먼트 이름과 POD 정보 서비스 정보가 모두 조회된다.

Nginx 접속 확인

마지막으로 배포된 Nginx에 접속이 되는지 시험해야 한다. 아무리 배포에 성공했어도 실제 접속이 되지 않으면 의미가 없다. 실제 접속은 바로 앞의 화면에서 NodePort가 가리키는 포트로 접속해야 한다. 즉 워커노드에 할당된 IP의 30080 포트로 웹 브라우저로 접속하면 접속이 되어야 한다.

이 테스트를 진행하는 Proxmox 노드에는 클러스터 구성을 위해 172.16.1.0/24 대역의 IP가 할당되어 있고 쿠버네티스 노드들은 10.0.1.0/24 대역의 IP가 할당되어 있다. 그래서 위 화면에서 nginx-service-node의 IP가 10.0.1.130 IP가 사용되고 있는 것이다.

다만 이 대역은 노드 외부에서는 접속할 수 없는 Proxmox 및 쿠버네티스 노드 간 전용 네트워크이며 실제 노드에 접속은 192.168.219.0/24 대역이 사용되고 있다. 워커노드의 경우 192.168.219.11과 13이다. 따라서 웹 브라우저에서 https://192.168.219.11:30080 으로 접속하면 다음과 같이 Nginx에 접속이 된다.

깡통 Nginx이지만 의외로 쉽게 안정적으로 배포되고 동작하는 것을 확인할 수 있었다.

#쿠버네티스 #첫POD배포

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다