Deploy k8s

2026. 1. 6. 22:44·CKA

쿠버네티스 클러스터는 단순히 “노드에 쿠버네티스 설치”로 끝나지 않습니다. 컨트롤 플레인(kube-apiserver, etcd, controller-manager, scheduler), 노드 에이전트(kubelet), 그리고 이들 간 통신을 위한 인증서/키(PKI), Pod Network(CNI) 까지 함께 맞물려야 정상 동작합니다.

이걸 노드마다 수동 설치·설정·인증서 배포로 맞추려면 작업량이 급격히 커집니다. 그래서 표준적인 부트스트랩 도구로 kubeadm을 많이 사용합니다. kubeadm은 쿠버네티스 “클러스터 골격”을 베스트 프랙티스 흐름으로 빠르게 구성해주는 도구입니다.

강의 스크립트의 “cube admin”은 정확히는 kubeadm입니다.


1. 로컬에서 멀티 노드 VM을 빠르게 구성하기: VirtualBox + Vagrant

실습에서 가장 먼저 필요한 건 “멀티 노드 환경(컨트롤 플레인 1대 + 워커 2대)”입니다. 로컬 PC에서 이 구성을 가장 깔끔하게 재현하는 조합이 VirtualBox(하이퍼바이저) + Vagrant(프로비저닝 자동화) 입니다.

  • VirtualBox: VM을 실제로 실행하는 하이퍼바이저
  • Vagrant: 여러 VM을 동일한 스펙/네트워크/설정으로 한 번에 띄우도록 자동화

Vagrant를 쓰면 “VM 3대 만들고, 네트워크 잡고, SSH 설정하고…”를 명령 한 번(vagrant up)으로 끝낼 수 있어, 강의/실습에서 모두가 같은 환경으로 따라가기 좋습니다.

1.1 사전 준비물

  • VirtualBox 설치
  • Vagrant 설치
  • Git 설치(레포 클론 용도)

설치는 OS별로 공식 설치 방법이 다르니, 본문에서는 “설치 완료”를 전제로 진행합니다.


2. Vagrantfile로 VM 3대(마스터 1 + 워커 2) 프로비저닝하기

강의 흐름은 다음과 같습니다.

  1. 강의 레포지토리 클론
  2. Vagrantfile 확인
  3. vagrant status로 현재 상태 확인
  4. vagrant up으로 VM 생성/부팅
  5. vagrant ssh <노드명>으로 접속

2.1 레포지토리 클론

git clone <COURSE_REPO_URL>
cd <REPO_DIRECTORY>
ls
# Vagrantfile 이 보이는지 확인

2.2 Vagrantfile 구성 확인 (핵심 포인트)

Vagrantfile에는 보통 아래 정보가 들어있습니다.

  • VM 이름: kubemaster, kubenode01, kubenode02
  • 각 VM IP: 보통 192.168.56.x 대역
  • VM 스펙: CPU/RAM 등
  • 베이스 이미지(Box): 예) ubuntu/bionic64(Ubuntu 18.04) 같은 값

여기서 설정하는 IP는 “쿠버네티스의 Pod IP”가 아니라, VM(노드) 자체의 IP입니다. 즉, 쿠버네티스가 올라가기 전 단계에서 “노드들끼리 통신 가능한 기본 네트워크”를 만드는 설정입니다.

예시(실제 강의 레포의 Vagrantfile과 다를 수 있지만 구조는 보통 유사합니다):

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"

  nodes = [
    { name: "kubemaster", ip: "192.168.56.10", cpu: 2, mem: 2048 },
    { name: "kubenode01", ip: "192.168.56.11", cpu: 2, mem: 2048 },
    { name: "kubenode02", ip: "192.168.56.12", cpu: 2, mem: 2048 }
  ]

  nodes.each do |node|
    config.vm.define node[:name] do |n|
      n.vm.hostname = node[:name]
      n.vm.network "private_network", ip: node[:ip]

      n.vm.provider "virtualbox" do |vb|
        vb.cpus = node[:cpu]
        vb.memory = node[:mem]
      end
    end
  end
end
  • 192.168.56.0/24는 VirtualBox에서 흔히 쓰는 Host-only/Private network 대역으로 잡는 경우가 많습니다.
  • 이 IP 대역은 쿠버네티스 “Pod CIDR”과는 별개입니다(헷갈리기 쉬움).

2.3 VM 상태 확인: vagrant status

vagrant status

처음에는 보통 이렇게 보입니다.

  • kubemaster: not created
  • kubenode01: not created
  • kubenode02: not created

2.4 VM 생성/부팅: vagrant up

vagrant up
  • Vagrant가 베이스 이미지(Box)를 내려받고
  • 설정대로 VM을 3대 만들고
  • 순차적으로 부팅합니다

로그상으로는 보통 kubemaster -> kubenode01 -> kubenode02 순으로 프로비저닝되는 흐름이 보입니다.

완료 후 다시 확인:

vagrant status

모든 노드가 running이면 성공입니다.

2.5 VM 접속: vagrant ssh <node>

컨트롤 플레인 노드 접속:

vagrant ssh kubemaster

접속 후 확인:

hostname
ip addr

나가기:

logout

워커 노드도 동일하게 접속합니다.

vagrant ssh kubenode01
uptime
logout

vagrant ssh kubenode02
uptime
logout

이제 “멀티 노드 인프라” 준비가 끝났고, 다음 단계가 kubeadm으로 쿠버네티스 부트스트랩입니다.


3. kubeadm이 해주는 일 / 하지 않는 일

kubeadm이 해주는 일

  • 컨트롤 플레인 컴포넌트 설치/구성(Static Pod 매니페스트 생성 등)
  • 클러스터 인증서(PKI) 생성 및 배치
  • 워커 조인을 위한 토큰/커맨드 제공 (kubeadm join)
  • 권장 기본 구성으로 초기화

kubeadm이 하지 않는 일 (사용자가 해야 함)

  • Pod Network(CNI) 설치: Calico/Flannel/Cilium 등
  • Ingress Controller, Storage, 모니터링 같은 애드온 설치
  • HA 구성에서 외부 LB/외부 etcd 등의 아키텍처 설계

4. kubeadm 설치 흐름(하이 레벨)

  1. 노드 준비(지금 Vagrant로 완료)
  2. 컨테이너 런타임 설치(containerd) — 모든 노드
  3. kubeadm/kubelet/kubectl 설치 — 모든 노드
  4. 컨트롤 플레인에서 kubeadm init
  5. CNI 설치(이게 있어야 Ready가 정상적으로 뜸)
  6. 워커에서 kubeadm join
  7. kubectl get nodes/pods -A로 점검

정리

  • VirtualBox + Vagrant로 로컬에서 “컨트롤 플레인 1 + 워커 2” 멀티 노드를 손쉽게 구성할 수 있습니다.
  • kubeadm은 쿠버네티스 클러스터의 골격(컨트롤 플레인/인증서/부트스트랩)을 표준 절차대로 세팅해줍니다.
  • 하지만 클러스터가 “진짜로” 동작하려면 CNI(Pod Network) 설치가 필수입니다.
  • 실습에서 가장 흔한 실패 지점은 swap, sysctl, CNI 미설치, containerd/cgroup 설정입니다.

'CKA' 카테고리의 다른 글

Helm  (0) 2026.01.07
Deploy k8s - kubeadm으로 배포하기  (0) 2026.01.06
Design Kubernetes - HA of ETCD  (0) 2026.01.06
Design Kubernetes - HA(High Availability)  (0) 2026.01.06
Design Kubernetes - Choosing Infrastructure  (0) 2026.01.06
'CKA' 카테고리의 다른 글
  • Helm
  • Deploy k8s - kubeadm으로 배포하기
  • Design Kubernetes - HA of ETCD
  • Design Kubernetes - HA(High Availability)
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (118)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      김영한
      버퍼
      조회 성능 최적화
      고급
      gesingleresult
      cglib
      @args
      락
      Thread
      자바
      스레드
      프록시 팩토리
      requset scope
      @within
      JPQL
      WAS
      log trace
      jdk 동적 프록시
      단방향 맵핑
      페치 조인
      reentarantlock
      jpq
      양방향 맵핑
      @discriminatorcolumn
      @discriminatorvalue
      hibernate5module
      typequery
      Target
      프록시
      빈 후처리기
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    Deploy k8s
    상단으로

    티스토리툴바