- Control Plane (Master Node)
- api-server: kubectl 및 클러스터 요청을 처리하는 엔드포인트
- etcd: 클러스터 상태 저장 (key-value 스토어)
- scheduler: pod를 적절한 노드에 배치
- controller manager: 상태를 원하는 상태로 유지 (replicaSet, node controller 등)
- Worker Node
- kubelet: 각 노드에서 pod 컨테이너 실행 관리
- kube proxy: 서비스/네트워크 라우팅 처리
- container runtime: 컨테이너 실행 엔진 (containerd, CRI-O 등)
- Cluster Add-ons
- CoreDNS: 서비스 이름을 DNS로 변환
- Ingress Controller: 외부 트래픽을 내부 서비스로 라우팅
- Metrics Server: 자원 사용량 수집 (HPA용)
- Pod: k8s에서 가장 작은 배포 단위
- 하나 이상의 컨테이너와 고유한 네트워크 IP 주소, 그리고 컨테이너를 실행하기 위해 필요한 설정들을 포함
- 모든 Pod는 하나의 Worker Node에서만 일시적으로 실행됨
- Pod 내 모든 컨테이너는 동일한 네트워크 네임스페이스 및 볼륨을 공유
- kubelet은 각 노드에서 Pod의 상태를 관리하고, Pod에 정의된 컨테이너가 실행될 수 있도록 CRI-O에 지시
- ReplicaSet: 동일한 Pod의 복제본 개수를 항상 명시된 수만큼 유지하도록 관리
- ReplicaSet은 직접 생성되기보다는 Deployment에 의해 간접적으로 관리
- ReplicaSet 정의에 포함된 selector는 Label을 기반으로 관리할 Pod를 식별하여 관리
- Deployment: Pod와 ReplicaSet의 버전·배포·롤백 관리
- 새로운 버전의 애플리케이션을 배포할 때 기존 Pod를 한꺼번에 종료하지 않고 단계적으로 롤링 업데이트
- 배포 이력을 기록하여 문제 발생 시에 이전 버전의 ReplicaSet으로 롤백 지원
- Deployment는 하위 ReplicaSet를 관리하여 노드 장애 발생 시 ReplicaSet를 통해 복구
kubectl scale을 통해 Pod의 복제본 개수를 관리 가능
- Service: Pod 집합에 고정된 접근 경로 제공 (ClusterIP, NodePort, LoadBalancer)
- Pod의 IP 주소가 바뀌더라도 Service는 항상 동일한 IP 주소와 DNS 네임을 유지하므로 이를 통해 Pod 접근 가능
- Service로 연결된 Pod로 들어오는 트래픽을 자동으로 로드 밸런싱하여 부하 분산
- Service 정의에 포함된 selector는 특정 label을 가진 Pod에 트래픽을 전달할지 결정
- Ingress: HTTP/HTTPS 기반 외부 트래픽 라우팅 규칙
- 외부에서 들어오는 트래픽을 클러스터 내부의 특정 서비스로 연결. URL이나 호스트 네임을 기반으로 트래픽을 분기
- 여러 서비스에 대해 단일 IP 주소로 접근할 수 있도록 해줌 ex) pocj8ur4in.co.kr/api -> api-service
- HTTPS를 위한 SSL/TLS 인증서를 관리하고, 암호화된 트래픽을 복호화하여 클러스터 내부의 서비스로 잔달
- Ingress API 오브젝트 규칙을 실제 적용하여 트래픽을 라우팅하는 Ingress Controller가 클러스터에 배포되어야 함
- Namespace: 클러스터 리소스 격리 및 논리적 구분
- ResourceQuota를 통해 특정 네임스페이스가 사용할 수 있는 CPU, 메모리, Pod 최대 개수 제한 가능
- api-server, etcd와 같은 시스템 컴포넌트가 실행되는 kube-system의 리소스는 직접 수정하지 않는 것을 권장
- ConfigMap: 환경변수·설정 값을 평문으로 관리
- 애플리케이션의 민감하지 않은 설정 정보를 관리하여 여러 환경에 대해 배포 가능
envFrom 필드나 ConfigMap 볼륨 마운트를 통해 ConfigMap을 Pod의 환경 변수로 주입
- Secret: 민감한 정보를 Base64 인코딩하여 관리
- 애플리케이션의 민감한 설정 정보를 안전하게 별도의 객체로 분리하여 관리
env 필드 내 valueFrom이나 Secret 볼륨 마운트를 통해 Secret을 Pod의 환경 변수로 주입
- Volume: Pod 내 컨테이너가 공유하는 스토리지
- 컨테이너의 수명 주기와 별개로 데이터를 저장하며, Pod 내의 모든 컨테이너가 해당 데이터에 접근할 수 있도록 함
- Pod 내 여러 컨테이너는 동일한 Volume을 마운트하여 데이터를 공유
- emptyDir, hostPath, configMap, secret, pv/pvc 등 다양한 유형의 Volume 지원
- PersistentVolume, PersistentVolumeClaim: 영속성 확보를 위한 스토리지 리소스
- PV는 k8s 클러스터에서 프로비저닝되거나 외부 스토리지 시스템에 의해 생성
- PVC는 사용자가 PV에 할당받기를 요청하는 리소스 (필요한 스토리지의 용량과 접근 모드를 명시하여 생성)
- 소비자-공급자 모델처럼 동작하여 스토리지의 실제 구현 방식에 의존하지 않고 스토리지 요청 가능
- Resource Requests, Limits: CPU·메모리 사용량 요청 및 제한 설정
- Pod가 스케줄링될 때 필요한 최소한|최대한의 CPU와 메모리 양을 스케줄러에 알림
- Probe: 컨테이너 상태 점검 및 트래픽 수용 여부 제어
- Liveness: 컨테이너가 정상적으로 동작하는지 HTTP 요청, TCP 소켓, 명령어 실행을 통해 확인하고 실패 시 재시작함
- Readiness: 컨테이너가 사용자 트래픽을 처리할 준비가 되었는지 확인하여 실패 시 Service의 엔드포인트에서 제외
- Horizontal Pod Autoscaler (HPA): 부하에 따라 Pod 수 자동 조정
- Deployment 또는 ReplicaSet과 같은 워크로드 컨트롤러를 감시하여 Pod의 복제본 수를 동적 조절
- CPU 사용량, 메모리 사용량, 사용자 정의 메트릭을 통해 Pod의 부하를 모니터링하여 Scale-In 혹은 Scale-Out
- Label, Selector: 리소스 분류 및 선택을 위한 key-value 메타데이터
- enviroment, version, app, tier와 같은 Label은 리소스 식별 및 특정 그룹 분류를 위해 쓰임
- Selector는 특정 Label을 가진 리소스를 식별 및 필터링에 활용되는 도구
- Annotation: 리소스에 추가 정보 메타데이터 저장
- Label과 달리 리소스를 식별하거나 그룹화를 위해 쓰인느 것이 아닌 도구에 의해 사용되거나 사용자가 참조하는 부가 정보 저장
- 애플리케이션 배포: 코드 작성 → 컨테이너 이미지 빌드 → 레지스트리 푸시
- Deployment YAML 파일을 작성한 후
kubectl apply로 클러스터에 적용
- Controller Manager가 ReplicaSet 생성하고 Scheduler가 Pod를 배치
- 서비스 노출: Service (LoadBalancer, NodePort 등) 또는 Ingress 생성
- 모니터링 및 스케일링: Metrics Server가 자원 사용량 수집
- HPA 규칙에 따라 Pod의 개수를 자동으로 조정
- manifest: 모든 k8s 리소스는 선언적인 .yaml 파일로 정의
- kubectl: 클러스터 리소스를 관리하는 명령줄 도구
- Label, Selector: 리소스 그룹화 및 선택을 위한 key-value 메타데이터
- Pod 네트워크: CNI 플러그인을 통한 Pod 간 통신
- Service: 동적 Pod에 고정된 IP 및 DNS 네임 제공
- ClusterIP: 클러스터 내부용
- NodePort: 모든 노드 포트를 통한 외부 접근
- LoadBalancer: 클라우드 로드밸런서 연동
- Ingress: HTTP/HTTPS 기반 외부 트래픽 라우팅 규칙
- Volume: Pod 내 컨테이너가 공유하는 스토리지
- PV (PersistentVolume): 클러스터의 영속적인 스토리지 리소스
- PVC (PersistentVolumeClaim): 사용자가 PV를 할당받기 위한 요청
- RBAC (Role-Based Access Control): 사용자 및 그룹에 대한 접근 권한 제어
- Secret: 민감한 정보를 Base64 인코딩으로 관리
- Network Policy: Pod 간 네트워크 통신 규칙 정의
- 로깅 및 모니터링: Prometheus, Grafana, EFK 스택 활용
- 롤링 업데이트 및 롤백: Deployment를 통한 무중단 배포 및 복구
- 상태 접검: Liveness Probe (컨테이너 재시작 여부 결정), Readiness Probe (트래픽 수용 여부 제어)
- Helm: Kubenetes 애플리케이션 패키지 매니저