직접 하나하나 수동으로 설치하면 시간도 오래 걸리고 실수도 많아짐 → kubeadm이 이를 해결
실습에서는 VirtualBox + Ubuntu를 주로 사용
kubeadm → 클러스터 부트스트랩kubelet → 클러스터 내에서 Pod 관리kubectl → 클러스터 제어 명령어 (CLI)sudo kubeadm init --pod-network-cidr=10.244.0.0/16
kubeadm join 명령어는 워커 노드에서 사용할 것mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl이 클러스터와 통신하도록 kubeconfig 설정
Kubernetes는 Pod 간 통신을 위해 별도의 CNI 필요
주로 사용하는 CNI:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubeadm join ... 명령어 사용kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>
kubectl get nodes
Ready 상태로 나타나야 정상| 구성 요소 | 역할 설명 |
|---|---|
| kubeadm | 설치 자동화 도구 (TLS, API Server 설정 등 포함) |
| kubelet | 각 노드에서 Pod 상태 모니터링 및 관리 |
| kubectl | 사용자 CLI 툴, 명령어로 클러스터 제어 |
| containerd | 컨테이너 런타임 (Docker 대체로 사용) |
| CNI 플러그인 | Pod 간 네트워크 통신 담당 (flannel, calico 등) |
kubeadm init, join, pod network 설치는 출제 빈도 높음kubeadm은 Kubernetes 설치를 간편하게 해주는 매우 유용한 도구kubeadm 설치 후 control-plane을 고가용성(HA)으로 확장하려면 어떤 구성과 설정이 필요할까?
좋아, 그럼 **Q1. kubeadm 설치 후 control-plane을 고가용성(HA)으로 확장하려면 어떤 구성과 설정이 필요할까?**에 대해 독립적으로 정확하고 심화된 설명을 해줄게.
고가용성 클러스터는 단일 master node에 장애가 발생했을 때 전체 클러스터가 마비되지 않도록, 다중 control plane node와 etcd 복제, 그리고 로드밸런서를 이용해 무중단 운영을 가능하게 하는 구조.
+------------------------+
| LoadBalancer | <== kube-apiserver endpoint
+-----------+------------+
|
+--------+--------+
| |
+--+--+ +---+--+
|M1 | | M2 | ... 추가 M3도 가능
+----+ +------+
| etcd | | etcd |
+------+ +------+
| |
+---+---+ +---+---+
|Worker| |Worker|
+-------+ +------+
6443 포트를 사용kubeconfig는 로드밸런서 IP\:PORT를 endpoint로 설정해야 함예시 (HAProxy 설정):
frontend kubernetes
bind *:6443
default_backend apiserver
backend apiserver
balance roundrobin
server master1 192.168.1.10:6443 check
server master2 192.168.1.11:6443 check
server master3 192.168.1.12:6443 check
initial-cluster 설정을 통해 서로를 peer로 등록--initial-cluster "master1=https://192.168.1.10:2380,master2=https://192.168.1.11:2380"
참고: 실무에서는 external etcd 클러스터 구성도 가능하지만,
stacked방식이 kubeadm에서는 간편하고 권장됨
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controlPlaneEndpoint: "loadbalancer.k8s.local:6443" # 반드시 로드밸런서 주소
etcd:
local:
dataDir: /var/lib/etcd
serverCertSANs:
- "192.168.1.10"
- "192.168.1.11"
peerCertSANs:
- "192.168.1.10"
- "192.168.1.11"
kubeadm init --config=kubeadm-config.yaml --upload-certs
두 번째 마스터에서 다음 명령 실행:
kubeadm join loadbalancer.k8s.local:6443 \
--token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH> \
--control-plane \
--certificate-key <CERT_KEY>
--control-plane: 해당 노드를 master로 추가--certificate-key: 첫 번째 마스터에서 출력된 키로 공유된 인증서 사용모든 노드에서 CNI가 작동해야 함 (Flannel, Calico 등)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get nodes -o wide
kubectl get pods -A
kubectl get endpoints kube-apiserver -n default -o yaml
모든 마스터가 control-plane 역할을 수행하고 있는지 확인.
| 항목 | 설명 |
|---|---|
| 로드밸런서 | kube-apiserver 앞단에 위치해 모든 control plane 트래픽 분산 |
| 다중 마스터 | 각 노드에 etcd + control-plane 컴포넌트 구성 |
| 인증서 공유 | --upload-certs, --certificate-key로 자동화 |
| etcd 구성 | stacked 또는 external, 최소 3개 이상 odd number 권장 |
| kubeadm 설정 | 반드시 controlPlaneEndpoint 설정 필요 |
인증서 키 재생성:
kubeadm init phase upload-certs --upload-certs
control-plane 노드 제거:
kubeadm reset