[k8s] Pod란 (1)

pipi·2023년 6월 27일
2

인프라

목록 보기
6/12

0. 📌 NAT 기술이란?

공인 IP는 한정적이다. 그렇기에 하나의 공인 IP안에 사설 IP를 여러개 둔다.
사설 IP 여러개 -> 공인 IP 1개에 연결하고, 실제로는 공인 IP끼리만 통신하는 것으로 보이는 거다.

사설 IP 여러개 -> 공인 IP 1개에 연결하려면? NAT 기술, 포트포워딩이 필요하다

1. 📌 Pod

  • Pod은 1~3개의 컨테이너 포함 가능. 보통 1개가 기본
  • Node > pod > 컨테이너
  • Pod은 Node IP와 별개로, 클러스터 내부에서 접근 가능한 고유의 IP를 할당받음.
    • 다른 Node에 위치한 Pod끼리 통신할 때, 포트포워딩(NAT)이 필요하지 않음. 왜? 자기 고유 IP가 있으니까!
    • 만약 Pod가 고유 IP를 할당받지 못했다면, pod은 node로 포트포워딩해서, node끼리 통신하는 과정이 중간에 있을 것이다.
  • pod 내부에 있는 컨테이너들은 어떻게 통신할까?
    • 생각해보자. pod는 고유 IP가 있다. 그러나 pod 내부 컨테이너들은 IP를 공유한다(고유 IP X).
    • localhost(127.0.0.1)를 통해 서로 통신하며, 포트번호로 구분한다.

1.1 Pod을 만들기 위한 YAML 파일 생성

쿠버네티스 모든 리소스(node, pod)들은 yaml파일로 생성가능하다. 한번 만들어보자.

apiVersion: v1
kind: Pod #리소스 타입
metadata:
  labels:
    run: mynginx # label 정보, 뒤에 나옴
  name: mynginx
spec:
  containers: # 컨테이너 정의. 여기선 niginx 1개만
  - image: nginx
    name: mynginx
  restartPolicy: Never

kubectl apply -f mynginx.yaml : yaml파일로 pod생성

2. 📌 라벨링 시스템

2.1 라벨 추가

특정 리소스에 명령을 전달하거나, 정보를 확인하고 싶을 때, 라벨링 시스템 이용.
yaml파일에 labels에 저장되어있으며, 명령어로 따로 추가 가능

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

kubectl label pod mynginx hello=world : label 따로 추가하기 위한 명령어
kubectl get pod mynginx -o yaml : 특정 pod yaml파일 조회 명령어 (label에 hello 라벨이 추가된 것을 확인)

kubectl run <NAME> --image <IMAGE> 으로 실행할때, 이때 run=<NAME>이란 label이 자동으로 추가됨

2.2 라벨 정보 확인

kubectl get pod mynginx -L run : 키 run에 대한 값 표시

NAME      READY   STATUS    RESTARTS   AGE   LABELS
mynginx   1/1     Running   0          22m   mynginx

kubectl get pod mynginx --show-labels : 모든 라벨 정보 표시

NAME      READY   STATUS    RESTARTS   AGE   LABELS
mynginx   1/1     Running   0          23m   hello=world,run=mynginx

kubectl get pod -l run : key가 run인 Pod들 출력
kubectl get pod -l run=mynginx : key가 run이고 value가 mynginx인 Pod 출력

2.3 nodeSelector -> 특정 노드에 pod 할당

실습하면서 Pod를 생성할 때, 왜 어떤 Node에 Pod를 배치할 건지 명시적으로 안알려주지? 궁금했었다.
쿠버네티스는 어떤 노드 위에서 실행할지 판단하여 스케줄링한다. 자기 알아서 하는거다!
그러나, 명시적으로 노드를 선택할 수도 있다. if) a 노드 -> ssd, b 노드 -> hdd, 특정 pod는 hdd를 쓸것이다!

  1. kubectl get node --show-labels : node들의 label 확인, 현재는 마스터, 워커 2개만 존재
# NAME     STATUS   ROLES    AGE   VERSION        LABELS
# master   Ready    master   14d   v1.18.6+k3s1   beta.kubernetes.io/...
# worker   Ready    <none>   14d   v1.18.6+k3s1   beta.kubernetes.io/...
  1. 특정 worker node에 pod를 위치시키고 싶다. 조건은 type이 hdd인 worker node이다.
  2. kubectl label pod worker type=hdd : worker에 label type=hdd를 추가한다.
  3. pod의 yaml을 수정한다. - nodeSelector 부분 추가.
    apiVersion: v1
    kind: Pod
    metadata:
      name: node-selector
    spec:
      containers: 
      - name: nginx
        image: nginx
      nodeSelector:
        disktype: ssd
  4. kubectl apply -f mypod.yaml : pod를 생성하자. 원하는 worker노드에 배정될 것이다.
  5. kubectl get pod mypod -o wide : pod(컨테이너) 상세 조회 -> worker 노드에 배정된 걸 확인하자

if ) 같은 라벨이 2개 이상 -> 노드 상태(리소스 사용량)을 확인해, 최적으로 쿠버네티스가 선택


이외에도 훨씬 다양한 pod관련 속성이 있다. 너무 많아서 2편으로 이어서 하겠다.

0개의 댓글

관련 채용 정보