일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 티스토리챌린지
- heapq
- BFS
- DP
- 파이썬
- 알고리즘
- programmers
- 하둡
- Apache Spark
- docker
- 문자열
- 아파치 카프카
- 분산
- 분산처리
- 리트코드
- apache kafka
- leetcode
- 프로그래머스
- Apache Hadoop
- 아파치 스파크
- Python
- 우선순위큐
- String
- 코딩테스트
- 오블완
- 카프카
- 이진탐색
- 도커
- 그래프
- 아파치 하둡
- Today
- Total
래원
[Kubernetes] Kubernetes 기본 오브젝트 - Pod 본문
이번 글에서는 Kubernetes의 기본 오브젝트인 Pod에 대해 정리하려고 한다.
목차는 다음과 같다.
1. Kubernetes Cluster
2. 기본 오브젝트 - Pod
2-1. Pod - Container
2-2. Pod - Label
2-3. Pod - Node Schedule
3. 마무리
1. Kubernetes Cluster
Pod에 대해 알아보기 전에 Kubernetes 클러스터에 대해 먼저 알아보자
Kubernetes를 통해 클러스터를 구성하게 되면 위 그림과 같이 구성된다.
크게 Control plane이라 불리는 마스터 역할의 노드와 일반 노드들로 이루어져있다.
Control plane은 클러스터를 관리하는 핵심 구성 요소로, 여러 가지 주요 컴포넌트로 이루어져 있다.
- API Server: 클러스터의 중심으로, Kubernetes의 모든 요청을 처리하는 역할을 한다.
kubectl과 같은 클라이언트가 API 서버와 상호작용하며, 클러스터의 상태를 관리한다. - Controller Manager: 클러스터의 상태를 원하는 상태로 유지하는 컨트롤러들을 실행하는 역할을 한다.
노드 컨트롤러, 레플리케이션 컨트롤러 등이 포함된다. - Scheduler: 새롭게 생성된 Pod가 클러스터 내 적절한 노드에 배치되도록 스케줄링하는 역할을 한다.
- etcd: 클러스터의 모든 상태 정보를 저장하는 key-value 저장소로, 높은 가용성과 일관성을 유지해야 한다.
일반 노드들은 실제로 애플리케이션 컨테이너가 실행되는 곳으로 아래와 같은 주요 컴포넌트들로 구성된다.
- Kubelet: 노드에서 실행되며, API 서버와 통신하여 Pod의 상태를 관리하는 역할을 한다.
- Kube Proxy: 네트워크 프록시로서, 클러스터 내부에서 원활한 서비스 통신을 가능하게 한다.
- Container Runtime: 컨테이너를 실행하는 런타임 환경으로, 대표적으로 Docker, containerd, CRI-O 등이 사용된다.
2. 기본 오브젝트 - Pod
Pod는 Kubernetes에서 배포할 수 있는 가장 작은 오브젝트이며 기본 배포 단위이다.
여기에는 하나 이상의 컨테이너를 포함할 수 있다. 일반적으로 애플리케이션의 실행 단위로 사용되며 단일 컨테이너 또는 다중 컨테이너 애플리케이션을 실행할 수 있다.
좀 더 자세히 알아보자.
2-1. Pod - Container
앞서 설명했듯이 Pod안에는 여러 컨테이너가 있을 수 있다.
이 때, 컨테이너들은 포트를 가지고 있고, 한 컨테이너가 포트를 하나 이상 가질 수 있지만, Pod 내 컨테이너끼리는 포트가 겹치면 안된다.
컨테이너끼리는 이 포트를 통해 접속이 가능하다.
이러한 Pod가 생성되면 고유의 IP 주소가 Pod에 할당되지만, Pod에 문제가 생겨 재생성이 되거나 Pod를 지우고 새로 생성하면 IP 주소는 변경이 된다.
이렇게 생성된 IP는 Kubernetes 클러스터내에서만 접근이 가능하며, Kubernetes 클러스터 외부에서는 접속이 불가능하다.
외부에서 Pod에 접근하게 하려면 Service라는 오브젝트를 사용해야한다. 이는 추후 포스팅할 예정이다.
이러한 Pod를 구성하는 yaml은 다음과 같이 구성할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: <pod-name>
spec:
containers:
- name: <container-name>
image: <image-name>
ports:
- containerPort: 8000
- name: <container-name>
image: <image-name>
ports:
- containerPort: 8080
2-2. Pod - Label
Kubernetes 클러스터를 운영하다보면 Pod를 포함해 많은 오브젝트들이 생겨날 수 있다.
이러한 오브젝트들을 분류하고, 또 분류된 오브젝트들만 연결하기 위해 Label이란 것을 사용할 수 있다.
Label은 Pod를 제외한 다른 오브젝트에서도 사용할 수 있지만, Pod에서 많이 사용된다.
Label은 key/value로 구성되며, 여러 개의 label을 달 수 있다.
yaml은 다음과 같이 구성할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: <pod-name>
labels:
key: value
key1: value1
spec:
containers:
- name: <container-name>
image: <image-name>
다음과 같이 명령어로도 구성할 수 있다.
kubectl run <pod-name> --image=<image-name> --labels=key=value,key1=value1
2-3. Pod - Node Schedule
이제 이러한 Pod들은 어떤 Node에 올라가게 되는지 알아보자.
두 가지 방법이 있다. 1. 직접 선택하는 방법, 2. Kubernetes가 선택하는 방법
직접 선택하는 방법은 각 노드에 Label을 만들고 Pod를 만들 때 yaml 파일에서 Node를 지정하는 방법이다.
yaml 파일은 다음과 같이 구성할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: <pod-name>
spec:
nodeSelector:
hostname: sn01
containers:
- name: <container-name>
image: <image-name>
Kubernetes가 선택하는 방법은 스케줄러가 판단하여 노드를 결정한다.
각 노드에는 CPU와 메모리같은 자원량이 있다. 이 때, 스케줄러가 판단하여 최대한 자원량이 여유있는 곳에 파드를 배치해준다.
3. 마무리
이번 글에서는 Kubernetes 기본 오브젝트인 Pod에 대해 정리하였다.
다음에는 Service와 Volume과 같은 다른 기본 오브젝트에 대해서도 정리할 예정이다.
'Docker 및 Kubernetes > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubernetes Dashboard 설정 (0) | 2025.01.23 |
---|---|
[Kubernetes] Kubernetes 설치 (0) | 2025.01.23 |
[Kubernetes] Kubernetes란? (0) | 2025.01.22 |