간단한 YAML 매니페스트 생성
첫 번째 YAML 매니페스트를 생성하기 전에, 작업하게 될 주요 Kubernetes 객체에 대해 이해하는 것이 중요합니다. 이러한 객체는 Kubernetes 내에서 애플리케이션을 관리하고 오케스트레이션하는 빌딩 블록입니다.
Kubernetes 객체 이해하기
- Pod: Kubernetes 의 가장 기본적인 단위입니다. Pod 는 하나 이상의 컨테이너를 담을 수 있는 상자와 같습니다. Pod 내의 이러한 컨테이너는 동일한 네트워크와 스토리지를 공유합니다. Pod 를 애플리케이션의 단일 인스턴스로 생각하십시오.
- Deployment: Deployment 는 Pod 를 관리하는 데 사용됩니다. 항상 원하는 수의 Pod 복제본이 실행되도록 보장합니다. Pod 가 실패하면 Deployment 가 자동으로 교체합니다. Deployment 는 또한 롤링 업데이트와 같이 제어된 방식으로 애플리케이션 업데이트를 처리합니다.
- Service: Service 는 Pod 에서 실행 중인 애플리케이션에 액세스할 수 있는 안정적인 방법을 제공합니다. Pod 는 생성 및 삭제될 수 있으므로 IP 주소가 변경될 수 있습니다. Service 는 관리하는 Pod 세트를 항상 가리키는 고정 IP 주소와 DNS 이름을 제공합니다. 이를 통해 애플리케이션의 다른 부분이나 외부 사용자가 개별 Pod IP 를 추적할 필요 없이 애플리케이션에 안정적으로 액세스할 수 있습니다.
이러한 객체 간의 관계를 설명하는 다이어그램은 다음과 같습니다.
graph TD;
A[Deployment] -->|Manages| B[Pods]
B -->|Contains| C[Containers]
B -->|Communicates via| D[Services]
D -->|Exposes| E[External Clients]
이러한 객체를 이해하는 것은 YAML 매니페스트를 사용하여 원하는 상태와 구성을 정의할 것이기 때문에 중요합니다.
YAML 매니페스트 개요
Kubernetes 의 YAML 매니페스트는 생성하거나 관리하려는 Kubernetes 객체를 설명하는 YAML 형식으로 작성된 파일입니다. YAML 은 사람이 읽을 수 있는 데이터 직렬화 언어입니다. Kubernetes 매니페스트에 YAML 을 사용하는 것에는 몇 가지 이점이 있습니다.
- 선언적 관리: YAML 파일에 리소스의 원하는 상태를 설명합니다 (예: "애플리케이션 복제본 3 개를 실행하고 싶습니다"). 그러면 Kubernetes 는 실제 상태가 원하는 상태와 일치하도록 작동합니다. 이를 선언적 관리라고 합니다.
- 버전 관리: YAML 파일은 텍스트 기반이므로 Git 과 같은 버전 관리 시스템에 쉽게 저장할 수 있습니다. 이를 통해 Kubernetes 구성의 변경 사항을 추적하고, 이전 구성으로 롤백하고, 다른 사람과 협업할 수 있습니다.
- 재사용성 및 이식성: YAML 매니페스트를 최소한의 변경으로 다른 환경 (개발, 테스트, 프로덕션) 에서 재사용할 수 있습니다. 이를 통해 배포가 더 일관되고 재현 가능해집니다.
Kubernetes 객체 및 YAML 매니페스트의 기본 사항을 이해했으므로 첫 번째 매니페스트를 만들 준비가 되었습니다.
YAML 매니페스트 생성
먼저 프로젝트 디렉토리로 이동합니다. 홈 디렉토리 (~) 에 project 디렉토리가 있다고 가정합니다. 없는 경우 mkdir project를 사용하여 지금 생성합니다. 그런 다음 cd project를 사용하여 현재 디렉토리를 project로 변경합니다.
cd ~/project
다음으로 Kubernetes 매니페스트를 저장할 새 디렉토리를 만듭니다. k8s-manifests라고 이름을 지정합니다. mkdir 명령을 사용하여 디렉토리를 만들고 cd를 사용하여 해당 디렉토리로 이동합니다.
mkdir -p k8s-manifests
cd k8s-manifests
이제 첫 번째 YAML 매니페스트 파일을 만듭니다. 간단한 NGINX Pod 매니페스트부터 시작하겠습니다. NGINX 는 인기 있는 웹 서버입니다. 단일 NGINX 컨테이너를 실행하는 Pod 를 만들 것입니다. nano 텍스트 편집기를 사용하여 nginx-pod.yaml이라는 파일을 만듭니다.
nano nginx-pod.yaml
nano는 터미널에서 실행되는 간단한 텍스트 편집기입니다. nano가 열리면 다음 내용을 파일에 붙여넣습니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
이 YAML 매니페스트의 각 부분을 이해해 보겠습니다.
apiVersion: v1: 이 객체를 생성하는 데 사용할 Kubernetes API 버전을 지정합니다. v1은 핵심 API 그룹이며 Pod, Service 및 네임스페이스와 같은 기본 객체에 사용됩니다.
kind: Pod: Pod 리소스를 정의하고 있음을 나타냅니다.
metadata:: 이름 및 레이블과 같은 Pod 에 대한 데이터를 포함합니다.
name: nginx-pod: Pod 의 이름을 nginx-pod로 설정합니다. 이것이 Kubernetes 내에서 이 Pod 를 참조하는 방법입니다.
labels:: 레이블은 객체에 첨부되는 키 - 값 쌍입니다. 객체 하위 집합을 구성하고 선택하는 데 사용됩니다. 여기서는 이 Pod 에 app: nginx 레이블을 추가하고 있습니다.
spec:: Pod 의 원하는 상태를 설명합니다.
containers:: Pod 내에서 실행할 컨테이너 목록입니다. 이 경우 컨테이너는 하나뿐입니다.
- name: nginx: 컨테이너의 이름을 nginx로 설정합니다.
image: nginx:latest: 사용할 컨테이너 이미지를 지정합니다. nginx:latest는 Docker Hub 의 NGINX Docker 이미지 최신 버전을 참조합니다.
ports:: 이 컨테이너가 노출할 포트 목록입니다.
- containerPort: 80: 컨테이너가 포트 80 을 노출함을 지정합니다. 포트 80 은 표준 HTTP 포트입니다.
내용을 붙여넣은 후 파일을 저장하고 nano를 종료합니다. 이렇게 하려면 Ctrl+X(종료) 를 누르고 Y(저장 확인) 를 입력한 다음 Enter 키를 눌러 파일 이름을 확인하고 저장합니다.
nginx-pod.yaml 파일을 생성했으므로 Pod 를 생성하기 위해 Kubernetes 클러스터에 적용해야 합니다. 매니페스트가 포함된 파일을 지정하는 -f 플래그와 함께 kubectl apply 명령을 사용합니다.
kubectl apply -f nginx-pod.yaml
이 명령은 매니페스트를 Kubernetes 클러스터로 보내고 Kubernetes 는 정의된 대로 Pod 를 생성합니다. 다음과 유사한 출력이 표시됩니다.
pod/nginx-pod created
Pod 가 생성되어 실행 중인지 확인하려면 kubectl get pods 명령을 사용합니다. 이렇게 하면 기본 네임스페이스의 모든 Pod 가 나열됩니다. kubectl describe pod nginx-pod를 사용하여 nginx-pod에 대한 자세한 정보를 얻을 수도 있습니다. 다음 명령을 실행합니다.
kubectl get pods
kubectl describe pod nginx-pod
kubectl get pods에 대한 예시 출력:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 1m
이 출력은 nginx-pod가 READY (1 개의 컨테이너 중 1 개가 준비됨) 이고 STATUS가 Running임을 보여줍니다. 이는 NGINX Pod 가 성공적으로 생성되어 실행 중임을 의미합니다.
이제 더 복잡한 리소스인 Deployment 에 대한 매니페스트를 만들어 보겠습니다. Deployment 는 Pod 세트를 관리하여 원하는 수의 복제본이 실행되도록 보장합니다. nano를 사용하여 nginx-deployment.yaml이라는 새 파일을 만듭니다.
nano nginx-deployment.yaml
nginx-deployment.yaml에 다음 내용을 붙여넣습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
nginx-pod.yaml 매니페스트와 비교하여 주요 차이점과 새로운 부분을 강조해 보겠습니다.
apiVersion: apps/v1: Deployment 의 경우 apps API 그룹의 일부이며 상위 수준 애플리케이션 관리 리소스를 처리하는 apps/v1 API 버전을 사용합니다.
kind: Deployment: Deployment 리소스를 정의하고 있음을 나타냅니다.
spec:: Deployment 의 spec 섹션은 Deployment 가 Pod 를 관리하는 방법을 정의하므로 더 복잡합니다.
replicas: 3: 이것이 새로운 부분입니다. 실행하려는 Pod 의 복제본 (사본) 3 개를 원한다고 지정합니다. Deployment 는 template에 정의된 기준과 일치하는 Pod 가 항상 3 개 있도록 보장합니다.
selector:: Deployment 가 관리할 Pod 를 식별하는 데 사용되는 선택기입니다.
matchLabels:: 이 Deployment 에서 선택하려면 Pod 가 가져야 하는 레이블을 정의합니다. 여기서는 app: nginx 레이블이 있는 Pod 를 선택합니다.
template:: template은 Deployment 가 새 Pod 를 생성하는 데 사용할 Pod 사양을 정의합니다. 이는 metadata.labels 및 spec.containers를 포함하여 nginx-pod.yaml 예제와 본질적으로 동일한 Pod 정의입니다. 중요: 여기서 template.metadata.labels에 정의된 레이블은 Deployment 가 이러한 Pod 를 관리할 수 있도록 selector.matchLabels와 일치해야 합니다.
nano를 저장하고 종료합니다 (Ctrl+X, Y, Enter).
이제 이 Deployment 매니페스트를 클러스터에 적용합니다.
kubectl apply -f nginx-deployment.yaml
다음과 같은 출력이 표시됩니다.
deployment.apps/nginx-deployment created
Deployment 및 생성된 Pod 를 확인합니다. kubectl get deployments를 사용하여 Deployment 상태를 확인하고 kubectl get pods를 사용하여 Pod 를 확인합니다.
kubectl get deployments
kubectl get pods
예시 출력:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1m
NAME READY STATUS RESTARTS AGE
nginx-deployment-xxx-yyy 1/1 Running 0 1m
nginx-deployment-xxx-zzz 1/1 Running 0 1m
nginx-deployment-xxx-www 1/1 Running 0 1m
kubectl get deployments는 nginx-deployment가 READY 3/3, UP-TO-DATE 3, AVAILABLE 3 임을 보여줍니다. 이는 Deployment 가 성공적으로 3 개의 Pod 를 생성하고 관리하고 있으며 모두 준비되고 사용 가능한 상태임을 의미합니다.
kubectl get pods는 이제 이름이 nginx-deployment-로 시작하는 세 개의 Pod 를 나열합니다. 이것들은 nginx-deployment에 의해 생성되고 관리되는 Pod 입니다.