IT 끄적장

#7 YAML 디스크립터로 POD 생성하기 본문

Kubernetes

#7 YAML 디스크립터로 POD 생성하기

kyunghoon_dev 2021. 2. 17. 10:21

 

파드를 포함한 다른 쿠버네티스 리소스는 일반적으로 쿠버네티스 REST API 엔드포인트에 JSON 혹은 

YAML 매니페스트를 전송해 생성한다.

 

kubectl run 명령처럼 다른 간다한 방법으로 리소스를 만들 수 있지만, 제한된 속성 집합만 설정할 수 있다.

그리고 YAML 파일에 모든 쿠버네티스 오브젝트를 정의하면 버전 관리 시스템에 넣는 것이 가능해져, 그에 따른 모든 이점을 누릴 수 있다.

 

 

Pod를 구성하는 주요 부분 소개

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - image: nginx
    name: my-nginx
    ports:
    - containerPort: 8080
      protocol: TCP

 

파드 정의는 몇 부분으로 구성된다. 먼저 yaml에서 사용하는 쿠버네티스 api 버전과 yaml이 설명하는 리소스 유형이 있다.

 

이어서 거의 모든 쿠버네티스 리소스가 갖고 있는 세 가지 중요한 부분이 있다.

 

  • metadata: 이름, 네임스페이스, 레이블 및 파드에 관한 기타 정보를 포함한다.
  • spec: 파드 컨테이너, 볼륨, 기타 데이터 등 파드 자체에 관한 실제 명세를 가진다.
  • status: 파드 상태, 각 컨테이너 설명과 상태, 파드 내부 ip, 기타 기본 정보 등 현재 실행 중인 파드에 관한 현재 정보를 포함한다.

위의 yaml을 살펴보면 이 정의는 API v1 버전을 준수한다. 정의하는 리소스 유형은 파드이며 이름은 my-app이다.

파드는 nginx 이미지 기반 단일 컨테이너로 구성된다. 그리고 컨테이너 이름을 my-nginx라 지정하고 8080에서 연결을 기다리는 것을 의미한다.

 

컨테이너 포트 지정

포트 정의 안에서 포트를 지정해둔 것은 단지 정보에 불과하다.

이를 생략해도 다른 클라이언트에서 포트를 통해 파드에 연결할 수 있는 여부에 영향을 미치지 않는다.

컨테이너가 0.0.0.0 주소에 열어 둔 포트를 통해 접속을 허용할 겨우 접속을 허용할 경우 스펙에 포트를 명시적으로 나열하지 않아도 다른 파드에서 항상 해당 파드에 접속할 수 있다.

 

그러나 포트를 명시적으로 정의한다면, 클러스터를 사용하는 모든 사람이 파드에서 노출한 포트를 바르게 볼 수 있다.

또한 포트를 명시적으로 정의하면 포트에 이름을 지정해 편리하게 사용할 수 있다.

 

 

kubectl create 명령으로 파드 만들기

 

위의 파드를 정의한 yaml 파일을 testPod.yaml 로 저장 후, pod를 생성하기 위해서 kubectl create 명령어를 이용한다.

 

kubectl create -f testPod.yaml

 

다음과 같이 my-app이라는 파드가 생성된다.

 

현재 실행중인 파드의 전체 정의를 가지고 오기 위해서는 

 

kubectl get pod my-app -o yaml 명령어를 사용한다.

 

다음과 같이 생성한 파드의 전체 정의를 yaml로 확인할 수 있다.

 

파드에 요청 보내기

파드가 지금 실행 중이다. 그렇다면 어떻게 외부에서 파드에 접속을 할 수 있을까?

서비스라는 리소스를 통해 접속할 수 있지만, 이번 포스팅에서는 로컬 네트워크 포트를 파드의 포트로 포워딩하여 접속해본다.

 

kubectl port-forward my-app 8888:8080

 

위의 명령은 머신의 로컬 포트 8888을 my-app파드의 8080포트로 향하게 한다.