소개
이 랩에서는 강력한 컨테이너 오케스트레이션 플랫폼인 Kubernetes 의 아키텍처를 탐구합니다. Kubernetes 클러스터를 구성하는 주요 구성 요소를 살펴보고, 컨테이너화된 애플리케이션을 관리하기 위해 이들이 어떻게 상호 작용하는지 배웁니다. 이 랩은 초보자를 위해 설계되었으며, Kubernetes 아키텍처에 대한 실습 소개를 제공합니다.
이 랩에서는 강력한 컨테이너 오케스트레이션 플랫폼인 Kubernetes 의 아키텍처를 탐구합니다. Kubernetes 클러스터를 구성하는 주요 구성 요소를 살펴보고, 컨테이너화된 애플리케이션을 관리하기 위해 이들이 어떻게 상호 작용하는지 배웁니다. 이 랩은 초보자를 위해 설계되었으며, Kubernetes 아키텍처에 대한 실습 소개를 제공합니다.
Minikube 를 사용하여 Kubernetes 클러스터를 시작하고 제어 평면 구성 요소를 살펴보겠습니다.
먼저, 터미널을 엽니다. 기본적으로 /home/labex/project 디렉토리에 있어야 합니다. 그렇지 않은 경우, 해당 디렉토리로 이동합니다.
cd ~/project
이제 다음 명령으로 Minikube 를 시작합니다.
minikube start
이 명령은 로컬 머신에 단일 노드 Kubernetes 클러스터를 초기화합니다. 완료하는 데 몇 분 정도 걸릴 수 있습니다. 많은 출력이 표시되더라도 걱정하지 마십시오. 이는 정상입니다.
Minikube 가 시작되면 제어 평면 구성 요소를 살펴보겠습니다. 제어 평면은 Kubernetes 의 핵심이며, 클러스터의 전반적인 상태를 관리하는 역할을 합니다. 이러한 구성 요소의 상태를 확인하려면 다음을 실행합니다.
kubectl get componentstatuses
다음과 유사한 출력이 표시됩니다.
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
각 구성 요소가 수행하는 작업을 자세히 살펴보겠습니다.
모든 구성 요소가 "Healthy"로 표시되면 제어 평면이 올바르게 작동하고 있는 것입니다. 오류가 표시되면 minikube delete를 실행한 다음 minikube start를 사용하여 Minikube 를 다시 시작하는 것이 좋습니다.
이제 제어 평면을 살펴보았으니, 노드 구성 요소를 검토해 보겠습니다. Kubernetes 에서 노드는 애플리케이션을 실행하는 작업 머신입니다. 컨테이너 실행이라는 무거운 작업을 수행하는 클러스터의 근육이라고 생각하면 됩니다.
클러스터의 노드를 보려면 다음을 실행합니다.
kubectl get nodes
다음과 유사한 출력이 표시됩니다.
NAME STATUS ROLES AGE VERSION
minikube Ready control plane 10m v1.20.0
이 출력은 "minikube"라는 하나의 노드가 있음을 보여주며, 이는 마스터 (제어 평면) 이자 작업자 노드입니다. 단일 노드 클러스터를 사용하고 있기 때문입니다. 프로덕션 환경에서는 일반적으로 여러 노드가 있으며, 마스터 노드와 작업자 노드가 별도로 존재합니다.
"Ready" 상태는 노드가 정상이며 Pod 를 수락할 준비가 되었음을 의미합니다.
노드에 대한 자세한 정보를 얻으려면 다음을 사용합니다.
kubectl describe node minikube
이 명령은 노드에 대한 풍부한 정보를 제공합니다. 압도적으로 느껴지더라도 걱정하지 마십시오. 몇 가지 주요 섹션을 살펴보겠습니다.
직접적으로 보이지는 않지만 노드에서 실행되는 주요 노드 구성 요소는 다음과 같습니다.
시작하기 전에 Kubernetes 에서 YAML 이 어떻게 작동하는지 이해해 보겠습니다.
Kubernetes 의 YAML 파일은 "코드로서의 인프라 (Infrastructure as Code)" 역할을 합니다.
첫 번째 YAML 파일을 만들어 보겠습니다. simple-pod.yaml을 생성합니다.
nano ~/project/simple-pod.yaml
다음 내용을 추가합니다.
## --- YAML 파일 시작 ---
## 1. Kubernetes 에 사용할 API 버전을 알려줍니다.
apiVersion: v1
## 2. 어떤 종류의 리소스를 생성할지 선언합니다.
kind: Pod
## 3. 이 리소스에 대한 메타데이터를 설정합니다.
metadata:
name: nginx-pod ## Pod 의 이름
labels: ## 레이블은 Pod 를 찾고 구성하는 데 도움이 됩니다.
app: nginx
## 4. Pod 에 포함될 내용을 정의합니다.
spec:
containers: ## Pod 는 하나 이상의 컨테이너를 실행할 수 있습니다.
- name: nginx ## 컨테이너의 이름
image: nginx:latest ## 사용할 컨테이너 이미지
ports: ## 노출할 포트
- containerPort: 80 ## Nginx 는 기본적으로 포트 80 을 사용합니다.
YAML 파일 구조는 트리와 같습니다.
Pod (root)
├── metadata (branch)
│ ├── name (leaf)
│ └── labels (leaf)
└── spec (branch)
└── containers (branch)
└── - name, image, ports (leaves)
Pod 를 생성합니다.
kubectl apply -f simple-pod.yaml ## -f는 파일에서 읽는다는 의미입니다.
이 명령은 다음을 수행합니다.
Pod 생성을 확인합니다.
kubectl get pods
다음과 같은 출력이 표시됩니다.
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 30s
READY 아래의 "1/1"은 Pod 의 컨테이너 중 하나가 준비되었음을 의미합니다. STATUS 아래의 "Running"은 첫 번째 YAML 구성이 작동했음을 의미합니다!
💡 Pro Tips:
- YAML 에서 들여쓰기는 중요합니다. 탭이 아닌 공백을 사용하십시오.
kubectl explain pod를 사용하여 필드 문서를 확인하십시오.- 유지 관리를 위해 항상 주석을 추가하십시오.
Pod 에 대한 자세한 정보를 얻으려면 다음을 사용합니다.
kubectl describe pod nginx-pod
이 명령은 다음을 포함한 많은 정보를 제공합니다.
이 정보는 애플리케이션의 상태를 디버깅하고 이해하는 데 매우 중요합니다.
이제 실행 중인 Pod 가 있으므로, 이를 노출하기 위해 Service 를 생성해 보겠습니다. Kubernetes 에서 Service 는 Pod 의 논리적 집합과 이에 접근하는 정책을 정의하는 추상화입니다. 클러스터 내부 또는 외부에서 애플리케이션을 네트워크에 노출하는 방법이라고 생각하면 됩니다.
프로젝트 디렉토리에 nginx-service.yaml이라는 파일을 생성합니다.
nano ~/project/nginx-service.yaml
파일에 다음 내용을 추가합니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
이 YAML 파일을 자세히 살펴보겠습니다.
selector: 이 설정은 Service 가 트래픽을 보낼 Pod 를 결정합니다. 이 경우, app: nginx 레이블이 있는 모든 Pod 를 선택합니다.ports: 이 설정은 Service 가 사용해야 하는 포트를 지정합니다.type: NodePort: 이는 Service 가 클러스터의 각 노드에서 포트를 통해 접근할 수 있음을 의미합니다.파일을 저장하고 편집기를 종료합니다.
이제 다음을 실행하여 서비스를 생성합니다.
kubectl apply -f nginx-service.yaml
서비스의 상태를 확인하려면 다음을 사용합니다.
kubectl get services
다음과 유사한 출력이 표시됩니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h
nginx-service NodePort 10.110.126.65 <none> 80:30080/TCP 30s
nginx-service 행은 서비스가 생성되었음을 보여줍니다. PORT(S) 아래의 80:30080/TCP는 클러스터 내부의 포트 80 이 노드의 포트 30080 에 매핑되었음을 의미합니다.
서비스에 대한 자세한 정보를 얻으려면 다음을 사용합니다.
kubectl describe service nginx-service
이 명령은 서비스의 유형, IP 주소, 포트 및 엔드포인트에 대한 정보를 제공합니다. 엔드포인트는 Service 가 트래픽을 보내는 Pod 의 IP 주소입니다.
이제 애플리케이션을 실행하는 Pod 와 이를 노출하는 Service 가 있으므로, 애플리케이션에 접근해 보겠습니다. 이 단계에서는 우리가 설정한 모든 구성 요소가 함께 작동하여 애플리케이션에 접근할 수 있도록 하는 방법을 보여줍니다.
먼저, Minikube 가 서비스에 할당한 URL 을 찾아야 합니다.
minikube service nginx-service --url
이 명령은 http://192.168.64.2:30080과 같은 URL 을 출력합니다. IP 주소는 사용자의 컴퓨터에 따라 다를 수 있습니다.
애플리케이션에 접근하려면 URL 다음에 curl 명령을 사용할 수 있습니다.
curl $(minikube service nginx-service --url)
이 명령은 기본 Nginx 환영 페이지 HTML 을 반환해야 합니다. <!DOCTYPE html>로 시작하는 HTML 출력이 표시되면 성공적으로 애플리케이션에 접근한 것입니다!
방금 일어난 일을 자세히 살펴보겠습니다.
이는 Kubernetes 가 기본 인프라를 추상화하여 애플리케이션이 실행되는 특정 머신에 대해 걱정하지 않고 애플리케이션에 집중할 수 있도록 하는 방법을 보여줍니다.
이 랩에서는 Kubernetes 의 주요 구성 요소와 상호 작용을 검토하여 Kubernetes 의 아키텍처를 탐구했습니다. Minikube 를 사용하여 Kubernetes 클러스터를 시작하고, 제어 평면 (Control Plane) 및 노드 구성 요소를 검사하고, 애플리케이션을 실행하기 위한 Pod 를 생성하고, Service 를 사용하여 애플리케이션을 노출하고, 마지막으로 애플리케이션에 접근했습니다.
다음 사항에 대해 배웠습니다.
이 실습 경험은 Kubernetes 아키텍처를 이해하기 위한 견고한 기반을 제공합니다. Kubernetes 는 많은 움직이는 부분으로 구성된 복잡한 시스템이며, 모든 것을 즉시 이해하지 못하는 것은 괜찮습니다. Kubernetes 를 계속 사용하면서 이러한 개념은 더욱 익숙해지고 직관적으로 다가올 것입니다.
Kubernetes 여정의 다음 단계에는 애플리케이션의 여러 복제본을 관리하기 위한 Deployment, 구성을 관리하기 위한 ConfigMap 및 Secret, 데이터 저장을 위한 Persistent Volume 에 대해 배우는 것이 포함될 수 있습니다. 계속 탐구하고 즐거운 Kuberneting 되세요!