유데미/ckad

Recap - Pods with YAML

study_recode 2025. 1. 29. 01:29

쿠버네티스는 객체(Pod, ReplicaSet, Deployment, Service 등)를 생성하기 위해 YAML 파일을 입력으로 사용합니다. 모든 YAML 구성 파일은 공통적인 구조를 따르며, 항상 다음과 같은 4가지 최상위 필드를 포함해야 합니다:

  1. apiVersion: 사용할 쿠버네티스 API 버전
  2. kind: 생성하려는 객체의 유형
  3. metadata: 객체에 대한 메타데이터(이름, 라벨 등)
  4. spec: 객체의 구체적인 사양

1. apiVersion

  • 이 필드는 사용할 쿠버네티스 API 버전을 지정합니다.
  • 예: v1 (Pod를 생성할 때 주로 사용)
  • 다른 값으로는 apps/v1, extensions/v1beta 등이 있으며, 이는 이후 강의에서 다룹니다.

2. kind

  • 생성하려는 객체의 유형을 지정합니다.
  • 예: Pod, ReplicaSet, Deployment, Service 등
  • 이번 강의에서는 Pod를 생성하므로 kind: Pod로 설정합니다.

3. metadata

  • 객체에 대한 메타데이터를 정의합니다.
  • 주요 속성:
    • name: Pod 이름 (예: my-app-pod)
    • labels: 라벨(key-value 형식)로 객체를 식별 가능하게 설정 (예: app: my-app)
  • 들여쓰기 규칙:
    • 하위 속성(name, labels)은 부모(metadata)보다 오른쪽으로 들여쓰기 되어야 합니다.
    • 동일한 계층에 있는 속성들은 같은 수준으로 들여쓰기 해야 합니다.

라벨은 특히 많은 Pod가 있을 때 유용합니다. 예를 들어, 프론트엔드와 백엔드 애플리케이션을 실행하는 여러 Pod가 있을 경우, 각각에 적절한 라벨(frontend, backend)을 추가하면 나중에 쉽게 필터링할 수 있습니다.

4. spec

  • 객체의 구체적인 사양을 정의하는 섹션입니다.
  • Pod의 경우:
    • containers: 컨테이너 목록(배열 형식)
      • 배열 항목은 대시(-)로 시작하며 각 항목은 딕셔너리 형태입니다.
      • 주요 속성:
        • name: 컨테이너 이름
        • image: 사용할 Docker 이미지 (예: nginx)

Pod 생성 과정 요약

  1. YAML 파일 작성:
apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
  labels:
    app: my-app
spec:
  containers:
  - name: nginx-container
    image: nginx

 

작성한 YAML 파일(pod-definition.yaml)을 사용해 Pod 생성:

kubectl create -f pod-definition.yaml

 

생성된 Pod 확인:

kubectl get pods

 

Pod 상세 정보 확인:

kubectl describe pod <pod-name>


YAML 파일을 작성하기 위해 사용할 수 있는 텍스트 편집기는 다양합니다. 대표적인 옵션은 다음과 같습니다:

  • PyCharm: YAML 지원이 뛰어나며 Kubernetes 플러그인을 통해 유효성 검사와 구문 강조 기능을 제공합니다.
  • Visual Studio Code: 무료로 사용할 수 있으며, YAML 확장 프로그램을 설치할 수 있습니다.
  • Notepad++, Atom, 또는 기본 텍스트 편집기(예: 메모장).

PyCharm을 사용하려면 JetBrains 웹사이트에서 다운로드할 수 있습니다. 커뮤니티 버전은 무료이며 YAML 작업에 충분합니다. PyCharm은 Kubernetes 플러그인을 통해 코딩 경험을 향상시킬 수 있습니다.

2. YAML 파일 생성

새 프로젝트 폴더(예: "Pod")를 만들고, pod-definition.yaml이라는 새 파일을 생성합니다. 아래는 예제 구조입니다:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80

필드 설명:

  • apiVersion: API 버전을 지정합니다 (예: v1).
  • kind: Kubernetes 리소스 유형을 정의합니다 (예: Pod).
  • metadata: Pod의 이름과 라벨 등의 메타데이터를 포함합니다.
  • spec: Pod의 원하는 상태를 설명합니다.
    • containers: Pod 안에 포함될 컨테이너 목록입니다.
      • name: 컨테이너 이름.
      • image: 사용할 Docker 이미지 (예: nginx:latest).
      • ports: 컨테이너에서 노출할 포트를 지정합니다.

3. YAML 파일 유효성 검사

PyCharm을 사용하는 경우, Kubernetes 플러그인을 설치하면 YAML 구문이 자동으로 검증됩니다. 또는, yamllint와 같은 도구나 Kubernetes CLI 명령어를 사용하여 오류를 확인할 수 있습니다.

4. Pod 배포

YAML 파일이 준비되면 다음 명령어를 사용하여 Kubernetes 클러스터에 배포합니다:

kubectl apply -f pod-definition.yaml
kubectl get pods

추가 팁

  • kubectl --dry-run=client -o yaml 명령어를 사용해 YAML 템플릿을 빠르게 생성할 수 있습니다.
  • PyCharm의 Kubernetes 관련 기능(예: 미리 정의된 템플릿 kpod, kdeployment)이나 Helm 차트 지원을 활용해보세요.
  • YAML 파일은 들여쓰기가 매우 중요하므로 항상 올바르게 작성해야 합니다.

Kubernetes 정의 파일은 네 가지 최상위 속성을 가지고 있습니다. 이 속성들은 API 버전, kind, metadata, 그리고 spec입니다.

1. API 버전

먼저 apiVersion을 지정합니다. Pod의 경우 API 버전은 v1이 됩니다.

2. Kind

kind는 리소스 유형을 나타냅니다. 여기서는 Pod를 생성하므로 kind Pod로 설정합니다.

3. Metadata

metadata는 객체 또는 딕셔너리 형태로 작성됩니다. 여기에는 Pod의 이름과 라벨 등의 정보를 포함합니다.

  • 이름 설정: name 속성에 Pod 이름을 지정합니다. 예를 들어, myapp-pod로 설정합니다.
  • 라벨 설정: labels는 딕셔너리 형태로 작성되며, 애플리케이션 이름 등을 지정할 수 있습니다.

들여쓰기는 YAML에서 매우 중요하며, 각 하위 항목은 상위 항목보다 한 단계 더 들여써야 합니다. PyCharm에서는 들여쓰기를 자동으로 처리하거나, 탭 또는 공백을 사용해 수동으로 정렬할 수 있습니다.

YAML 파일의 구조

Kubernetes 정의 파일은 네 가지 최상위(root) 속성을 포함합니다:
  • apiVersion: API 버전을 지정합니다. Pod의 경우 v1을 사용합니다.
  • kind: 리소스 유형을 정의합니다. 여기서는 Pod를 설정합니다.
  • metadata: Pod의 이름과 라벨 등의 메타데이터를 포함합니다.
    • name: Pod의 이름 (예: myapp-pod).
    • labels: 키-값 쌍으로 라벨을 정의하여 나중에 리소스를 그룹화하거나 필터링할 수 있습니다.
  • spec: Pod의 동작을 정의하며, 컨테이너 정보를 포함합니다.

YAML 파일 작성

다음은 Pod를 생성하기 위한 YAML 파일 예제입니다:
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: MyApp
spec:
  containers:
  - name: nginx-container
    image: nginx

구조 설명

  1. 최상위 속성 (apiVersion, kind, metadata, spec)은 동일한 들여쓰기를 가져야 합니다.
  2. metadata의 하위 속성:
    • name labels는 같은 수준의 들여쓰기를 가져야 하며, 각각 Pod의 이름과 라벨 정보를 포함합니다.
  3. spec 섹션:
    • containers: 배열(리스트) 형태로 작성되며, 각 항목은 대시(-)로 시작합니다.
    • 컨테이너 항목에는 이름(name)과 이미지(image)가 포함됩니다.

추가 팁

  • 라벨(labels)은 원하는 만큼 추가할 수 있습니다. 예를 들어:
labels:
  app: MyApp
  cost-center: Amer
  location: North America

 

여러 컨테이너를 추가하려면 다음과 같이 작성할 수 있습니다:

spec:
  containers:
  - name: nginx-container
    image: nginx
  - name: backend-container
    image: redis

Pod의 실제 예시

apiVersion: v1
kind: Pod
metadata:
  name: frontend-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
  1. 웹 애플리케이션 Pod
    • 웹 애플리케이션 Pod는 프론트엔드 컨테이너와 백엔드 컨테이너로 구성될 수 있습니다.
      • 프론트엔드 컨테이너: 정적 파일을 제공하고 사용자 상호작용을 처리합니다.
      • 백엔드 컨테이너: 데이터베이스 쿼리와 기타 비즈니스 로직을 처리합니다.
  2. 마이크로서비스 애플리케이션
    • 마이크로서비스 애플리케이션은 여러 개의 Pod로 구성될 수 있으며, 각 Pod는 서로 다른 마이크로서비스를 실행합니다.
      • 예:
        • 사용자 인증 서비스용 Pod
        • 제품 카탈로그 서비스용 Pod
        • 주문 처리 서비스용 Pod
  3. 배치 처리 애플리케이션
    • 배치 처리 애플리케이션은 각 배치 작업마다 하나의 Pod를 가질 수 있습니다.
      • 예:
        • 일일 보고서를 생성하는 Pod
        • 고객 데이터를 처리하는 Pod
        • 오래된 데이터를 정리하는 Pod

Kubelet의 역할

Kubelet은 Pods가 스케줄링된 노드에서 실행되도록 보장하는 역할을 합니다. 주요 작업은 다음과 같습니다:

  • 노드에서 실행 중인 Pods를 모니터링합니다.
  • Pods를 위해 컨테이너를 생성하고 시작합니다.
  • 컨테이너에 CPU, 메모리, 네트워크 액세스 등 필요한 리소스를 제공합니다.
  • 실패한 컨테이너를 재시작합니다.
  • Pods의 상태를 Kubernetes API 서버에 보고합니다.

Pod를 사용하는 이점

  1. 격리(Isolation)
    • Pods는 애플리케이션을 서로 격리할 수 있는 방법을 제공합니다. 이를 통해 한 애플리케이션의 문제가 다른 애플리케이션에 영향을 미치는 것을 방지할 수 있습니다.
  2. 이식성(Portability)
    • Pods는 한 노드에서 다른 노드로 쉽게 이동할 수 있습니다. 이는 노드 간 부하를 균형 있게 분산하거나 다른 환경으로 Pods를 이동할 때 유용합니다.
  3. 확장성(Scalability)
    • Pods는 쉽게 확장(스케일 업/다운)할 수 있습니다. 이는 수요 변화에 대응하는 데 유용합니다.
  4. 관리 용이성(Manageability)
    • Pods는 관리하기 쉽습니다. Kubernetes API는 Pods 생성, 시작, 중지, 삭제 등의 다양한 관리 작업을 지원합니다.

 

 

https://www.youtube.com/watch?v=AAJ6FTqIVMY

https://aws.plainenglish.io/understanding-pods-nodes-and-the-kubelet-in-kubernetes-417fc8278d40

 

Understanding Pods, Nodes and the Kubelet in Kubernetes

In Kubernetes, a pod is a single or a group of containers that are tightly coupled and scheduled together on the same machine. Pods share…

aws.plainenglish.io

 

'유데미 > ckad' 카테고리의 다른 글

Recap - Pods  (0) 2025.01.29
Recap - Kubernetes Architecture  (0) 2025.01.29
Certification Details  (0) 2025.01.29