탕구리's 블로그

[Kubernetes] #3 파드(pod) 설정 및 사용하기 본문

devOps

[Kubernetes] #3 파드(pod) 설정 및 사용하기

탕구리당 2020. 5. 22. 02:21
반응형

** 해당 도서를 구매하며 학습해보며 내용을 정리하는 목적으로 글을 작성하였습니다.

** 문제가 되는 경우 말씀해주시면 조치를 취하도록 하겠습니다. 감사합니다 :)

 

 

파드(Pod)란 무엇인가..?

 

파드란 실제로 마스터와 연결된 노드에서 작업을 수행하는 최소 단위입니다.

"엥?! 무슨 소리? 컨테이너가 최소 단위 아니야?"라고 생각할 수 있지만  파트의 경우 여러 개의 컨테이너를 묶어서 관리하게 되고 쿠버네티스에서는 파드를 작업 수행의 최소 단위로 구분합니다. 파드를 구성하는 컨테이너가 단일인 경우에는 물리적으론 단일 컨테이너가 작업을 수행하는 최소 단위가 될 수 있을 것 같네요.

 

마스터 노드, 워커 노드에 대한 기본적인 작업(join)이 되어 있는 경우 워커노드에 파드를 구동할 수 있는 기본 예제입니다.

파드를 구성하기 위해 사용하는 기본 템플릿 구조와 하위 명령어들에 대해서 알아봅시다.

 

# 기본적으로 파드를 구동하기 위해 생성하는 템플릿 샘플
apiVersion: v1
kind: Pod
metadata:
  name: simple-pod
  labels:
    app: simple-pod
spec:
  containers:
  - name: simple-pod
  image: arisu1000/simple-container-app:latest
  ports: 
  - containerPort: 8080

- apiVersion은 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지에 대한 명세를 진행합니다. 사용하는 apiVersion에 따라 어떤 명령어 수행이 가능한지 판별이 되는 것 같네요. 

 

- kind는 어떤 종류의 Object를 생성할지 명세합니다. 현재 저희는 파드를 구성하기 위한 yaml 템플릿을 제작하고 있으므로 Pod를 작성해 줍니다.

 

- metadata: 흔히 데이터에 대한 정보라고 하죠? 해당 오브젝트의 이름이나 레이블 등을 설정할 수 있습니다. 어디에 사용하는지 아직까지는 정확히 모르겠지만. 뒷부분에 대한 공부를 진행하다 보면 알 수 있을 것 같습니다.

 

- spec: 실제 파드가 어떤 컨테이너를 실행하고 어떤 행동을 할지에 대한 명세가 들어갑니다. 

 

$ kubectl describe pods simple-pod

해당 명령을 통해 파드가 어떤 설정을 통해 설정을 확인해볼 수 있습니다.

 

파드의 생명주기

 

[Conatainers.simple-pod.Status]

1. Pending - 파드가 컨테이너를 생성하는 중

2. Running - 말 그대로 구동 중인 상태

3. Succeeded - 정상적으로 실행 종료가 된 상태

4. Failed - 파드 안 컨테이너 중 정상 종료되지 않은 컨테이너가 존재

5. Unkown - 파드 상태 파악 불가

 

 

[Conditions.Type]

1. Initialized - 초기화 컨테이너가 성공적으로 시작 완료

2. Ready - 파드가 요청을 실행할 수 있고 모든 서비스의 로드밸런싱 풀에 추가되어야 한다는 의미

3. Container Ready - 파드의 모든 컨테이너가 준비 완료된 상태

4. PodScheduled - 파드가 하나의 노드로 스케줄을 완료

5. Unschedulable  - 스케쥴러가 자원의 부족이나 다른 제약으로 지금 당장 파드를 스케줄 할 수가 없는 상태

 

 

kubelet을 통한 컨테이너 진단

 

컨테이너가 실행되고 난 후에는 kubelet이 컨테이너의 상태를 지속적으로 체크합니다.

상태를 나타내는 두 가지의 지표(Probe)가 있습니다.

 

1. livenessProbe 

- 컨테이너가 실행됐는지에 대한 여부를 확인합니다. 진단이 실패하면 kubelet에 의해 지정해둔 정책을 기반으로 명령을 실행합니다. 컨테이너에 livenessProbe에 대해 명시하지 않았다면 default는 Success입니다.

 

2. readnessProbe

- 요청에 대한 응답이 가능한지 체크한다. 응답이 불가능하다고 판단되는 경우 endpoint-controller는 더 이상 해당 파드에 요청이 들어갈 수 없도록 파드에 연결된 모든 서비스를 대상으로 엔드포인트 정보를 제거합니다. 

 

 

위와 같은 두 가지의 probe를 진단하기 위해서 kubelet은 핸들러를 호출합니다.

 

[Handler]

1. ExecAction

- 컨테이너 안에 지정된 명령을 실행하여 상태 판단.

2. TCPSocketAction

 - TCP상태를 확인하고 포트가 열려있는지 확인 후 판단.

3. HTTPGetAction

- HTTP Get 요청에 대한 응답이 가능(status code 200-400)하면 성공으로 진단

 

 

파드에 CPU와 메모리 자원 할당하기

 

하나의 워커 노드에 여러 개의 파드를 실행하게 된다면 파드마다 사용하는 시스템 리소스에 대한 양이 다르고 특정 파드에 노드의 리소스가 몰리는 현상이 발생할 수 있습니다. 자원 부족으로 인해 특정 파드가 리소스 부족으로 인해 성능이 나빠질 수도 있고 자원이 남는 노드에는 리소스가 낭비될 수도 있습니다. 이를 방지하기 위해 파드에서 사용하는 리소스에 대한 최소사양(requests)과 최대 사양(limit)을 설정할 수 있습니다.

 

 

다음 필드를 통해 설정할 수 있습니다.

 

- .spec.containers[].resources.requests.cpu

- .spec.containers[].resources.requests.memory

- .spec.containers[].resources.limits.cpu

- .spec.containers[].resources.limits.memory

 

# 파드에 cpu와 메모리 자원 할당에 대한 테스트를 진행

apiVersion: v1
kind: Pod
metadata:
  name: simple-pod
  labels:
    app: simple-pod
spec:
  containers:
  - name: simple-pod
    image: arisu1000/simple-container-app:latest
    resources:
      requests:
       cpu: 0.1
       memory: 200M
      limits:
       cpu: 0.5
       memory: 1G
    ports:
    - containerPort: 8080

 

cpu 항목에 대해서 살펴보면 할당량이 실수 형태로 설정되어 있습니다. 쿠버네티스에서는 정수 형태(1,2,3)를 통해 해당 파드에서 가용할 수 있는 cpu 코어의 개수를 설정할 수 있지만, 실수 형태(ex 0.1, 0.5)를 통해 하나의 코어에서 몇 퍼센트의 성능을 가용할지도 설정할 수 있습니다. 

 

 

파드에 환경 변수 설정

 

컨테이너에서 환경변수를 사용하기 위한 방법입니다.

 

# 파드 환경설정에 대한 템플릿 샘플

apiVersion: v1
kind: Pod
metadata:
  name: simple-pod
  labels:
    app: simple-pod

spec:
  containers:
  - name: simple-pod
    image: arisu1000/simple-container-app:latest
    resources:
      requests:
       cpu: 0.1
       memory: 200M
      limits:
       cpu: 0.5
       memory: 1G
    ports:
    - containerPort: 8080
    env:
    - name: ENV_TEST
      value: "test_env"
    - name: HOSTNAME
      valueFrom:
         fieldRef:
           fieldPath: metadata.name
    - name: HOSTNAME
      valueFrom:
         resourceFieldRef:
           containerName: simple-pod
           resource: requests.cpu

 

환경 변수를 지정하기 위한 필드 구조는. spec.containers[].env []입니다.

 

1. name: 사용할 환경 변수의 이름을 설정
2. value: 문자열이나 숫자 형식의 값을 설정합니다.
3. valueFrom: 값을 직접 할당하는 것이 아니라 어딘가 다른 곳에서 참조하는 값을 설정합니다.
4. fieldRef: 파드의 현재 설정 내용을 값으로 설정한다.
5. fieldPath: fieldRef에서 어디서 값을 가져올 것인지 지정합니다. 즉, 값을 참조하려는 항목의 위치를 지정합니다.
6.  resourceFieldRef: 컨테이너에 CPU, 메모리 사용량을 어마나 할당했는지에 관한 정보를 가져옵니다.
7. containerName: 환경 변수 설정을 가져올 컨테이너 이름을 설정합니다.
8.  resource: 어떤 자원의 정보를 가져올지 설정합니다.

파드를 재실행하고 env가 제대로 설정되었는지 확인해보자~!

 

$ kubectl exec -it simple-pod sh 

환경변수가 제대로 설정된 것을 확인할 수 있다!

 

 

이번 포스팅에서는 파드에 대한 기본적인 이론과 간단한 실습을 통해 내용을 정리해 보았다.

일단, 신기하다. 그리고 재미있다. 얼른 뒷부분 계속해서 공부해야겠다 :) 

반응형
Comments