공대생 정리노트

3장 : 파드 본문

Kubernetes/Kubernetes in ACTION

3장 : 파드

woojinger 2020. 12. 30. 00:41

쿠버네티스 인 액션을 읽고 공부한 것 요약

파드 소개

쿠버네티스는 컨테이너를 개별적으로 배포하기 보다는 컨테이너를 가진 파드를 배포하고 운영.

컨테이너는 단일 프로세스를 실행하는 것으로 목적으로 설계. Ex) 개별 프로세스가 실패하는 경우 자동으로 재시작하는 매커니즘 포함해야 한다.

그래서 컨테이너를 함께 묶고 하나의 단위로 관리하는 구조가 파드이다.

쿠버네티스는 파드 안에 있는 모든 컨테이너가 자체 네임스페이스가 아닌 동일한 리눅스 네임스페이스를 공유하도록 도커를 설정한다.

파드의 모든 컨테이너는 동일한 네트워크 네임스페이스와 UTS(UNIX Timesharing System Namespace) 네임스페이스 안에서 실행되기 때문에, 모든 컨테이너는 같은 호스트 이름과 네트워크 인터페이스를 공유한다.

  • 파드 안의 컨테이너과 동일한 네트워크 네임스페이스에서 실행되기 때문에 동일한 IP 주소와 포트 공간 공유
  • 클러스터의 모든 파드는 하나의 플랫한 공유 네트워크 주소 공간에 상주하므로 모든 파드는 다른 파드의 IP 주소를 사용해 접근하는 것이 가능.
  • 파드는 논리적 호스트로서 컨테이너가 아닌 환경에서의 물리적 호스트 혹흔 VM과 매우 유사하게 동작한다.

YAML 또는 JSON 디스크립터로 파드 생성

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

레이블을 이용한 파드 구성

레이블 : 파드와 모든 다른 쿠버네티스 리소스를 조직화할 수 있는 기능. 리소스에 첨부하느 키-값 쌍.

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-v2
  labels :
    creation_method: manual
    env: prod
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

레이블 셀렉터를 이용한 파드 부분 집합 나열

레이블 셀렉터는 특정 레이블로 태그된 파드의 부분 집합을 선택해 원하는 작업 수행

  • 특정한 키를 포함하거나 포함하지 않는 레이블
  • 특정한 키와 값을 가진 레이블
  • 특정한 키를 갖고 있지만, 다른 값을 가진 레이블
kubectl get po -l creation_method=manual

creation_method 레이블 값이 manual인 pod 리스트를 갖고 온다.

레이블과 셀렉터를 이용해 파드 스케줄링 제한

kubectl label node gke-kubia-85f6-node-0rrx gpu=true

gpu=true 레이블을 노드에 추가한다.

gpu를 필요로 하는 새로운 파드를 배포해야 한다고 가정해보자.  스케줄러가 GPU를 제공하는 노드를 선택하도록 요청하려면 YAML에 노드 셀렉터를 추가해야 한다.

apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  nodeSelector: // 쿠버네티스에 gpu=true 레이블을 포함한 노드에 이 파드를 배포하도록 지시
    gpu: "true"
  containers:
  - image: luksa/kubia
    name: kubia

파드에 어노테이션 달기

kubia-manual 파드에 어노테이션 추가하기

kubectl annotate pod kubia-manual mycompany.com/someannotations="foo bar"

mycompany.com/someannotation 어노테이션을 foo bar라는 값과 함께 추가

네임스페이스를 사용한 리소스 그룹화

각 오브젝트는 여러 레이블을 가질 수 있기 때문에, 오브젝트 그룹은 서로 겹칠 수 있다.

오브젝트를 겹치지 않는 그룹으로 분할하기 위해서 오브젝트를 네임 스페이스로 그룹화한다. 여기서 네임스페이스는 리눅스 네임스페이스가 아니다.

리소스를 프로덕션, 개발, QA 환경 혹은 원하는 다른 방법으로 나누어 사용할 수 있다. 리소스 이름은 네임스페이스 안에서만 고유하면 되서 서로 다른 두 네임스페이스는 동일한 이름의 리소스를 가질 수 있다.

노드 리소스와 같은 global 리소스는 네임스페이스에 얽매이지 않는다.

kubectl get ns // 클러스터에 있는 모든 네임스페이스 나열

 

kubectl get po --namespace kube-system // kube-system 네임스페이스에 속해 있는 파드를 나열

네임스페이스를 사용하면 오브젝트를 별도 그룹으로 분리해 특정한 네임스페이스 안에 속한 리소스를 대상으로 작업할 수 있게 해주지만, 실행 중인 오브젝트에 대한 격리는 제공하지 않는다.

네임스페이스에서 네트워크 격리를 제공하는지는 쿠버네티스와 함께 배포하는 네트워킹 솔루션에 따라 다르다.

파드 중지와 제거

kubectl delete po kubia-gpu

kubia-gpu 파드를 이름으로 삭제.

kubectl delete po -l creation_method=manual

creation_method=manual 레이블을 가진 파드 제거

kubectl delete ns custom-namespace

파드를 포함한 custom-namespace 네임스페이스 전체를 삭제

kubectl delete po --all

현재 네임스페이스에 있는 모든 파드를 삭제

 

Comments