Deployment with Kubeadm

Yu Sang Min·2025년 7월 3일

CKA

목록 보기
91/110

🔧 kubeadm을 사용한 Kubernetes 클러스터 부트스트랩 개요


1. kubeadm이란?

  • Kubernetes 클러스터를 빠르고 안정적으로 설치할 수 있게 도와주는 CLI 툴
  • API Server, etcd, Scheduler, Controller Manager 등의 설치 및 설정 자동화
  • TLS 인증서, 토큰, 설정 파일까지 자동 생성

직접 하나하나 수동으로 설치하면 시간도 오래 걸리고 실수도 많아짐 → kubeadm이 이를 해결


2. kubeadm으로 클러스터 구축 단계 요약

📌 Step 1: 노드 준비 (VM or 실제 서버)

  • 마스터(Master) 노드 1개
  • 워커(Worker) 노드 1개 이상
  • 물리서버, 클라우드 인스턴스, 혹은 VirtualBox 기반 VM

실습에서는 VirtualBox + Ubuntu를 주로 사용


📌 Step 2: 컨테이너 런타임 설치

  • containerd를 주로 사용 (도커는 현재 비추천)
  • 모든 노드에 설치 필요

📌 Step 3: kubeadm, kubelet, kubectl 설치

  • 모든 노드에 설치 (APT 패키지로 설치 가능)
  • kubeadm → 클러스터 부트스트랩
  • kubelet → 클러스터 내에서 Pod 관리
  • kubectl → 클러스터 제어 명령어 (CLI)

📌 Step 4: 마스터 노드 초기화

sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • Kubernetes control-plane 구성 요소 설치
  • TLS 인증서, kubeconfig, CA 생성
  • 출력되는 kubeadm join 명령어는 워커 노드에서 사용할 것

📌 Step 5: kubectl 셋업

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 설정


📌 Step 6: Pod 네트워크 플러그인 설치

  • Kubernetes는 Pod 간 통신을 위해 별도의 CNI 필요

  • 주로 사용하는 CNI:

    • Flannel (간단하고 실습에 적합)
    • Calico, Weave, Cilium (보다 고급 기능 제공)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

📌 Step 7: 워커 노드 클러스터에 조인

  • 마스터 초기화 후 출력된 kubeadm join ... 명령어 사용
kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

3. 설치 후 확인

kubectl get nodes
  • 마스터와 워커 노드들이 Ready 상태로 나타나야 정상

📌 보충 정리

구성 요소역할 설명
kubeadm설치 자동화 도구 (TLS, API Server 설정 등 포함)
kubelet각 노드에서 Pod 상태 모니터링 및 관리
kubectl사용자 CLI 툴, 명령어로 클러스터 제어
containerd컨테이너 런타임 (Docker 대체로 사용)
CNI 플러그인Pod 간 네트워크 통신 담당 (flannel, calico 등)

🔍 실무 기준 팁

  • 프로덕션 환경에선 반드시 고가용성(HA) 구성 필요 (다중 마스터 + 외부 etcd + 로드밸런서)
  • kubeadm은 실습, PoC, 사내 클러스터 초기 구축 등에 적합
  • 클라우드 환경에선 GKE/EKS/AKS 등 Managed Kubernetes 고려
  • CKA 시험에서도 kubeadm init, join, pod network 설치는 출제 빈도 높음

✅ 결론 요약

  • kubeadm은 Kubernetes 설치를 간편하게 해주는 매우 유용한 도구
  • 단계별 절차를 정확히 숙지하면 로컬 실습부터 실무까지 확장 가능
  • 네트워크(CNI) 설치, 노드 Join 등 후속 절차도 반드시 따라야 정상 작동

💡 심화 질문

kubeadm 설치 후 control-plane을 고가용성(HA)으로 확장하려면 어떤 구성과 설정이 필요할까?

좋아, 그럼 **Q1. kubeadm 설치 후 control-plane을 고가용성(HA)으로 확장하려면 어떤 구성과 설정이 필요할까?**에 대해 독립적으로 정확하고 심화된 설명을 해줄게.


✅ kubeadm 기반 Kubernetes 클러스터의 고가용성(HA) 구성 가이드

고가용성 클러스터는 단일 master node에 장애가 발생했을 때 전체 클러스터가 마비되지 않도록, 다중 control plane nodeetcd 복제, 그리고 로드밸런서를 이용해 무중단 운영을 가능하게 하는 구조.


🔧 1. 전체 구조 요약

+------------------------+
|      LoadBalancer      |  <== kube-apiserver endpoint
+-----------+------------+
            |
   +--------+--------+
   |                 |
+--+--+          +---+--+
|M1  |          | M2   |  ... 추가 M3도 가능
+----+          +------+
| etcd |        | etcd |
+------+        +------+
    |              |
+---+---+      +---+---+
|Worker|      |Worker|
+-------+     +------+

✅ 2. 필수 조건 및 사전 준비

  • VM 또는 서버 최소 3대 (Master 3대 권장)
  • OS: Ubuntu 20.04 또는 CentOS 7 이상 (모든 노드 동일)
  • 고정 IP 필요
  • 모든 노드 간 통신 가능해야 함
  • SSH 무비밀번호 접속 설정 (옵션)
  • 로드밸런서가 존재하거나 nginx/haproxy로 구성

✅ 3. 로드밸런서 설정

  • kube-apiserver는 각 master 노드의 6443 포트를 사용
  • LoadBalancer (예: HAProxy, NGINX)는 이 포트로 트래픽 분산
  • 클러스터를 관리할 때 사용하는 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

✅ 4. etcd 클러스터 구성 (stacked topology 기준)

  • 각 master 노드에 etcd 구성 (stacked control plane)
  • initial-cluster 설정을 통해 서로를 peer로 등록
  • 예시:
--initial-cluster "master1=https://192.168.1.10:2380,master2=https://192.168.1.11:2380"

참고: 실무에서는 external etcd 클러스터 구성도 가능하지만, stacked 방식이 kubeadm에서는 간편하고 권장됨


✅ 5. kubeadm 설정 파일 (kubeadm-config.yaml)

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"

✅ 6. 마스터 노드 초기화 (첫 번째 노드)

kubeadm init --config=kubeadm-config.yaml --upload-certs
  • 이 명령은 클러스터를 초기화하고, 다른 control plane 노드가 인증서 공유(certs) 할 수 있도록 token을 생성

✅ 7. 추가 마스터 노드 조인

두 번째 마스터에서 다음 명령 실행:

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: 첫 번째 마스터에서 출력된 키로 공유된 인증서 사용

✅ 8. 네트워크 플러그인(CNI) 설치

모든 노드에서 CNI가 작동해야 함 (Flannel, Calico 등)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

✅ 9. 상태 확인

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

✅ 추가로..

  • 고가용성 구성은 로드밸런서 장애까지 고려한 이중화 필요
  • etcd는 무조건 홀수 (3 or 5)로 구성해야 quorum 유지
  • 마스터에 taint 설정되어 있으므로, 워크로드는 worker node에서 실행
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글