kubernetes 프로젝트 #1
Source: Dev.to
개요
Kubernetes에서 단일 컨테이너화된 웹 앱을 실행하고 브라우저에서 접근합니다:
흐름: Browser → Service → Pod → Container
이 연습을 통해 다음을 배웁니다:
- Pod가 무엇인지
- Kubernetes가 존재하는 이유
- 트래픽이 컨테이너에 도달하는 방식
- Kubernetes 네트워킹이 Docker와 다른 점
이를 이해하면 다른 많은 Kubernetes 개념이 명확해집니다.
사전 요구 사항
- Minikube(로컬 Kubernetes) 설치
kubectl설치- Docker 설치
Minikube 시작:
minikube start
노드가 준비되었는지 확인:
kubectl get nodes
예상 출력
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane ... ...
Kubernetes는 항상 워크로드를 노드에서 실행하므로 노드가 하나 이상 있어야 합니다.
Pod 생성
pod.yaml 파일을 만듭니다:
apiVersion: v1
kind: Pod
metadata:
name: hello-pod
labels:
app: hello
spec:
containers:
- name: hello-container
image: nginx
ports:
- containerPort: 80
매니페스트 적용:
kubectl apply -f pod.yaml
Pod가 실행 중인지 확인:
kubectl get pods
Pod의 상세 정보(할당된 IP, 컨테이너 상태, 이벤트 등)를 보려면 설명합니다:
kubectl describe pod hello-pod
핵심 포인트
- Pod는 Kubernetes가 실행하는 가장 작은 단위이며(하나 이상의 컨테이너를 포함할 수 있음)
- Pod는 고유한 IP 주소를 받지만 그 IP는 안정적이지 않습니다.
Service로 Pod 노출
service.yaml 파일을 만듭니다:
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
type: NodePort
selector:
app: hello
ports:
- port: 80
targetPort: 80
nodePort: 30007
Service 적용:
kubectl apply -f service.yaml
Service 확인:
kubectl get svc
Service는 안정적인 엔드포인트(NodePort)를 제공하며, Pod의 IP가 바뀌어도 트래픽을 해당 Pod로 전달합니다.
애플리케이션 접근
Minikube의 IP 주소를 가져옵니다:
minikube ip
브라우저를 열고 다음 주소로 이동합니다:
http://<minikube-ip>:30007
기본 Nginx 환영 페이지가 표시됩니다:
Welcome to nginx!
이는 웹 앱이 Kubernetes에서 실행 중이며 클러스터 외부에서도 접근 가능함을 확인시켜 줍니다.
정리
Pod 삭제:
kubectl delete pod hello-pod
삭제됐는지 확인:
kubectl get pods
Pod가 사라지면, Pod만으로는 프로덕션에 적합하지 않음을 알 수 있습니다—실패 시 자동 복구되지 않기 때문입니다.
핵심 개념 요약
| Concept | Description |
|---|---|
| Pod | 배포 가능한 가장 작은 단위; 하나 이상의 컨테이너를 포함할 수 있음. |
| Service | Pod에 접근하기 위한 안정적인 네트워킹(IP/Port)을 제공함. |
| NodePort | 각 노드의 고정 포트에 Service를 노출시켜 외부 접근을 가능하게 함. |
| Labels | Service(및 기타 컨트롤러)가 Pod를 선택하도록 하는 키/값 쌍. |
| Deployment | ReplicaSet을 관리; Pod가 죽으면 자동으로 재생성함. |
Pod, Service, Labels를 이해하면 프로덕션 환경에서 Pod 수명 주기와 스케일링을 담당하는 Deployment를 활용하는 기반이 됩니다.