Pod는 이전 포스트에서도 말했지만, 쿠버네티스의 최소 실행 단위입니다.

아무리 작고 가벼운 프로세스를 실행시켜도 Pod를 통해서 수행됩니다.

쿠버네티스는 Pod를 통해서 가상환경을 제공합니다.

🍡 가상환경 플랫폼 실행단위

  • 가상머신(Virtual Machine) - 인스턴스(Instance)
  • 도커(Docker) - 컨테이너(Container)
  • 쿠버네티스(K8s) - 포드(Pod)

🍯 Pod 특징

Pod는 1개 이상의 컨테이너를 가질 수 있지만, 일반적으로 3개이상은 쓰지 않는다고 합니다.

동일 노드

Pod내에 존재하는 컨테이너는 동일한 노드에서만 할당되며 Pod삭제시 Pod내 모든 컨테이너가 삭제됩니다.

고유 Pod IP

Pod는 노드 IP와는 별개로 클러스터 내에서 접근 가능한 고유IP를 생성 시 자동으로 할당 받습니다.
쿠버네티스에서는 다른 노드에 위치한 Pod라도 고유의 IP를 이용하여 접근할 수 있다는 점이 도커와 차이입니다.

IP 공유

Pod 내부의 컨테이너들은 서로 IP가 공유됩니다. 같은 Pod의 컨테이너끼리는 localhost를 통해 서로 네트워크 접근이 가능하여 포트로 서로 구분합니다.

Volume 공유

Pod 안의 컨테이너들은 동일한 볼륨과 연결이 가능하여 파일 시스템을 기반으로 서로 파일을 주고 받을 수 있습니다.




📜 Pod의 YAML 명세서 템플릿

--dry-run-o yaml 옵션들을 조합하여 템플릿 파일을 생성할 수 있습니다.

Pod을 YAML파일로 생성하겠습니다.

  1. 사용자가 kubectl 명령으로 마스터에 pod정의를 합니다.

  2. 마스터는 YAML 정의의 유효성을 체크 후 특정 노드에 컨테이너를 실행하도록 명령합니다.

  3. 명령을 전달받은 노드(kubelet)는 요청사항에 맞게 컨테이너를 실행시킵니다.




🏷️ 라벨링 시스템

라베링 시스템은 쿠버네티스에서 정말 중요한 메커니즘 중 하나입니다.
특정 리소스를 참조하거나 Pod에 트래픽 전달할 때 활용합니다.

라벨링은 단순 key, value형태의 문자열입니다.

Pod에 라벨링을 한다는 뜻은 metadata property에 key, value 문자열을 추가하는 것 입니다.

라벨 정보 부여

Pod에 라벨을 부여하는 방법은 크게 2가지 있습니다.

1. label 명령

기본 포맷

$ kubectl label pod <NAME> <KEY>=<VALUE>

mynginx pod에 hello=world 라벨 키 값을 부여했습니다.


2. 선언형 명령 (YAML)

두번째 방법으로는
Pod YAML명세서를 작성할 때 metadata property에 직접 라벨을 추가하고 리소스를 생성합니다.

$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
	labels:
    	hello: world
        run: mynginx
    name: mynginx
spec:
	containers:
    - image: nginx
    	name: mynginx
EOF

metadata는 리소스이름 라벨 등의 정보를 나타냅니다.




라벨 정보 확인

리소스에 부여된 라벨을 확인하기 위해 -L 옵션을 사용합니다.

Pod가 가지고 있는 run 키값을 보여줍니다.

특정 라벨이 아닌 전체 라벨은 --show-labels옵션을 사용합니다.


라벨을 이용한 조건 필터링

특정 라벨을 가진 리소스만 필터링 해서 보는 방법은 -l옵션입니다.




🪄 nodeSelector

라벨링 시스템을 이용하여 pod가 특정 노드에 할당 되도록 스케쥴링할 수 있습니다.

기본적으로 사용자가 pod를 생성하면 마스터가 스스로 판단하여 스케줄링합니다.

쿠버네티스는 클러스터링 시스템이라 사용자가 노드를 선택할 필요없이 pod스케줄링을 관리합니다.

하지만, 특정 노드를 명시적으로 선택해서 실행시켜야 할 수도 있습니다.

그림 왼쪽 노드는 디스크가 SSD, 오른쪽은 HDD로 설정됬다면 특정 Pod는 SDD를 사용해야 할 경우가 있을수도 있습니다. 이럴때 nodeSelector라는 property를 사용하여 노드를 선택합니다.

노드에는 기본적으로 설정되어 있는 라벨들이 많이 있습니다.

여기에 master노드에는 disktype=ssd를 부여하고 worker1노드에는 disktype=hdd를 부여하겠습니다.

각각의 노드의 disktype을 확인합니다.

이제 실습해보기 위해 새로운 Pod YAML명세서에 nodeSelector property를 추가합니다.
들여쓰기 주의하세용!

명세서로 생성해줍니다.

-o wide옵션으로 해당 pod가 어느 노드에서 실행되는 지 확인 가능합니다.

동일한 라벨의 노드가 두개 이상일 경우 쿠버네티스가 리소스사용량 등을 확인해서 최적의 노드로 선택합니다.


방금 만든 node-selector.yaml을 수정해보겠습니다.

ssd -> hdd로 변경해줍니다.

pod를 지우고 다시 생성했을 때 worker1로 스케쥴링 된것을 확인할 수 있습니다.




05.12 수정

0개의 댓글