1. 아키텍쳐
1-1. 컴포넌트
쿠버네티스 클러스터는 Control plane(마스터)
과 Node(워커)
로 구성
이미지 출처: https://kubernetes.io/docs/concepts/overview/components/
마스터 노드의 핵심 컴포넌트
- kube-apiserver : 마스터로 전달되는 모든 요청을 받아 드리는 API 서버
- etcd : 클러스터내 모든 메타 정보를 저장하는 서비스
- kube-scheduler : 사용자의 요청에 따라 적절하게 컨테이너를 워커 노드에 배치하는 스케줄러
- kube-controller-manager : 현재 상태와 바라는 상태를 지속적으로 확인하며 특정 이벤트에 따라 특정 동작을 수행하는 컨트롤러
- cloud-controller-manager : 클라우드 플랫폼(AWS, GCP, Azure 등)에 특화된 리소스를 제어하는 클라우드 컨트롤러
워커 노드의 핵심 컴포넌트
- kubelet : 마스터의 명령에 따라 컨테이너의 라이프 사이클을 관리하는 노드 관리자
- kube-proxy : 컨테이너의 네트워킹을 책임지는 프록시, 네트워크 규칙을 유지 관리
- Container Runtime : 실제 컨테이너를 실행하는 컨테이너 실행 환경 (Docker, containerD, CRI-O)
Adds on
- CNI : Container Network Interface 는 k8s 네트워크 환경을 구성. 다양한 플러그인이 존재
- DNS : 쿠버네티스 서비스를 위해 DNS 레코드를 제공. CoreDNS 는Service Discovery 기능을 제공
- 그 외 대시보드, 모니터링, 로깅 등을 위한 플러그인이 있음
1-2. 동작 확인
클러스터 정상배포 확인
kubectl cluster-info
kubectl get nodes
kubectl get namespaces
- 파드 정보 확인 (kube-system 네임스페이스)
kubectl get pod -n kube-system
kubectl-calico node status
kubectl-calico get ippool -o wide
마스터 노드 구성요소 확인
kubectl get pod --all-namespaces
- 마스터 노드에서 실행중인 컨데이너 확인(Container Runtime: Docker)
docker ps
- 동작 중인 컨테이너 정보 확인(컨테이너 런타임(containerd)를 통해)
ps axf | grep /usr/bin/containerd
kubectl describe pod -n kube-system kube-apiserver
kubectl describe pod -n kube-system etcd
워커 노드 구성요소 확인
워커노드에서 입력하여 확인
systemctl status kubelet
pstree
ps afxuwww |grep proxy | grep -v color=auto
iptables -t filter -S
iptables -t nat -S
iptables -t mangle -S
iptables -t raw -S
2. 파드(Pod)
2-1. 파드 란?
파드(Pod)는 컨테이너 애플리케이션의 기본 단위
이며, 파드는 1개 이상의 컨테이너로 구성된 컨테이너의 집합이다.
- Pod 는 1개 이상의 컨테이너를 가질 수 있다
- Pod 내에 실행되는 컨테이너들은 반드시 동일한 노드에 할당되며, 동일한 생명 주기를 갖는다
- 고유의 Pod IP - Pod 는 노드 IP 와 별개로 클러스터 내에서 접근 가능한 고유의 IP를 할당 받는다
- CNI를 통해 다른 노드에 위치한 Pod 도 NAT 없이 Pod IP로 접근 가능하다
- IP공유 - Pod 내에 있는 컨테이너들은 서로 IP를 공유하여, 컨테이너끼리는 localhost 통해 서로 접근, 포트를 이용해 구분한다.
- volume 공유 - Pod 안의 컨테이너들은 동일한 볼륨과 연결이 가능하여 파일 시스템을 기반으로 서로 파일을 주고받을 수 있음
YAML 템플릿
- K8s 모든 리소스는 YAML 형태의 선언형 명령 정의서(declarative description) 로 표현할 수 있다
- —dry-run 과 -o yaml 욥션을 사용하여, Pod 를 실제로 생성하지 않고 템플릿 파일을 만들수 있다
kubectl run myweb --image nginx --dry-run=client -o yaml > myweb.yaml
cat myweb.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: myweb
name: myweb
spec:
containers:
- image: nginx
name: myweb
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
- apiVersion : YAML 파일에서 정의한 해당 오브젝트의 API 버전 정의
- kind : 리소스의 종류
- metadata : 라벨, 이름, 주석(Annotation) 등과 같은 리소스의 부가 정보
- spec : 리소스 생성하기 위한 세부 정보