[K8S Deploy]Kubernetes The Hard Way - 02. 점프박스 세팅 & 바이너리 준비

진웅·2026년 1월 10일

k8s deploy

목록 보기
5/20

Kubernetes The Hard Way의 두 번째 단계인 '점프박스 세팅 및 바이너리 다운로드' 과정을 기술

  • 클러스터 구축에 필요한 모든 부품(Binaries)을 인터넷에서 미리 다운로드 받아, 용도별(client, controller, worker)로 깔끔하게 정리해두는 작업이다.
  • 쿠버네티스 구축에 필요한 실행 파일(Binary)들을 미리 점프박스에 다운로드하여 정리한다.
  • 나중에 각 노드(Controller, Worker)에 배포할 때, 매번 인터넷에서 다운받지 않고 여기서 한 번에 실행하기 위함이다.

1. 환경 점검 및 저장소 동기화

점프박스는 관리자 권한(root)으로 작업하며, 최신 버전의 KTHW 저장소를 가져온다.

목표 : 설치에 필요한 파일 등 준비

설치 항목버전
k8s 관련 (kube-apiserver, kubelet 등)1.32.2
etcd3.6.0
containerd2.1.0
runc1.3.0

jumpbox 서버 ssh접속해서 권한 및 필수 도구 확인

# root 계정 확인 (Vagrant 로그인 시 .bashrc에 의해 자동 전환됨)
whoami
# -> root

# 필수 패키지 설치 확인 (init_cfg.sh에서 설치됨)
apt-get update && apt install tree git jq yq unzip vim sshpass -y
# 결과 
Hit:1 http://security.debian.org/debian-security bookworm-security InRelease
Hit:2 http://httpredir.debian.org/debian bookworm InRelease
Hit:3 http://httpredir.debian.org/debian bookworm-updates InRelease
Reading package lists... Done
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
tree is already the newest version (2.1.0-1).
git is already the newest version (1:2.39.5-0+deb12u3).
jq is already the newest version (1.6-2.1+deb12u1).
yq is already the newest version (3.1.0-3).
unzip is already the newest version (6.0-28).
vim is already the newest version (2:9.0.1378-2+deb12u2).
sshpass is already the newest version (1.09-1).
0 upgraded, 0 newly installed, 0 to remove and 31 not upgraded.
root@jumpbox:~# 

Git Repository Clone

전체 히스토리는 필요 없으므로 --depth 1 옵션으로 최신 커밋만 가볍게 가져온다.

git clone --depth 1 https://github.com/kelseyhightower/kubernetes-the-hard-way.git
cd kubernetes-the-hard-way

2. 쿠버네티스 컴포넌트 다운로드

쿠버네티스 버전 v1.32 및 관련 툴(Etcd, Containerd 등)을 다운로드한다.
이때, 현재 시스템의 CPU 아키텍처(Intel/AMD vs ARM)에 맞는 바이너리를 받는 것이 중요하다.

아키텍처 확인 및 목록 생성

# 내 CPU 아키텍처 확인 (amd64 또는 arm64)
dpkg --print-architecture
#결과 
arm64

# 다운로드 리스트 확인 (스크립트가 자동으로 아키텍처에 맞는 파일을 읽어옴)
cat downloads-$(dpkg --print-architecture).txt
#실행 결과 
https://dl.k8s.io/v1.32.3/bin/linux/arm64/kubectl
https://dl.k8s.io/v1.32.3/bin/linux/arm64/kube-apiserver
https://dl.k8s.io/v1.32.3/bin/linux/arm64/kube-controller-manager
https://dl.k8s.io/v1.32.3/bin/linux/arm64/kube-scheduler
https://dl.k8s.io/v1.32.3/bin/linux/arm64/kube-proxy
https://dl.k8s.io/v1.32.3/bin/linux/arm64/kubelet
https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.32.0/crictl-v1.32.0-linux-arm64.tar.gz
https://github.com/opencontainers/runc/releases/download/v1.3.0-rc.1/runc.arm64
https://github.com/containernetworking/plugins/releases/download/v1.6.2/cni-plugins-linux-arm64-v1.6.2.tgz
https://github.com/containerd/containerd/releases/download/v2.1.0-beta.0/containerd-2.1.0-beta.0-linux-arm64.tar.gz
https://github.com/etcd-io/etcd/releases/download/v3.6.0-rc.3/etcd-v3.6.0-rc.3-linux-arm64.tar.gz

주요 다운로드 항목:

  • K8s Core: kube-apiserver, kube-controller-manager, kube-scheduler, kubelet, kube-proxy, kubectl
  • Etcd: etcd (데이터 저장소)
  • Container Runtime: containerd, runc, crictl
  • Network: cni-plugins

일괄 다운로드 (wget)

# downloads 디렉터리에 병렬 다운로드 진행
wget -q --show-progress \
  --https-only \
  --timestamping \
  -P downloads \
  -i downloads-$(dpkg --print-architecture).txt

# 
kubectl                                     100%[=========================================================================================>]  53.25M  46.8MB/s    in 1.1s    
kube-apiserver                              100%[=========================================================================================>]  86.06M  41.8MB/s    in 2.1s    
kube-controller-manager                     100%[=========================================================================================>]  79.56M  48.3MB/s    in 1.6s    
kube-scheduler                              100%[=========================================================================================>]  61.25M  47.9MB/s    in 1.3s    
kube-proxy                                  100%[=========================================================================================>]  62.25M  46.3MB/s    in 1.3s    
kubelet                                     100%[=========================================================================================>]  71.75M  30.3MB/s    in 2.4s    
crictl-v1.32.0-linux-arm64.tar.gz           100%[=========================================================================================>]  16.98M  47.9MB/s    in 0.4s    
runc.arm64                                  100%[=========================================================================================>]  10.78M  42.3MB/s    in 0.3s    
cni-plugins-linux-arm64-v1.6.2.tgz          100%[=========================================================================================>]  47.17M  44.8MB/s    in 1.1s    
containerd-2.1.0-beta.0-linux-arm64.tar.gz  100%[=========================================================================================>]  33.60M  45.9MB/s    in 0.7s    
etcd-v3.6.0-rc.3-linux-arm64.tar.gz         100%[====================================================================

=====================>]  20.87M  49.4MB/s    in 0.4s  

# 확인

ls -oh downloads
#
drwxr-xr-x 2 root 4.0K Jan 10 23:15 client
drwxr-xr-x 2 root 4.0K Jan 10 23:15 cni-plugins
-rw-r--r-- 1 root  48M Jan  7  2025 cni-plugins-linux-arm64-v1.6.2.tgz
-rw-r--r-- 1 root  34M Mar 18  2025 containerd-2.1.0-beta.0-linux-arm64.tar.gz
drwxr-xr-x 2 root 4.0K Jan 10 23:15 controller
-rw-r--r-- 1 root  17M Dec  9  2024 crictl-v1.32.0-linux-arm64.tar.gz
-rw-r--r-- 1 root  21M Mar 28  2025 etcd-v3.6.0-rc.3-linux-arm64.tar.gz
-rw-r--r-- 1 root  87M Mar 12  2025 kube-apiserver
-rw-r--r-- 1 root  80M Mar 12  2025 kube-controller-manager
-rw-r--r-- 1 root  54M Mar 12  2025 kubectl
-rw-r--r-- 1 root  72M Mar 12  2025 kubelet
-rw-r--r-- 1 root  63M Mar 12  2025 kube-proxy
-rw-r--r-- 1 root  62M Mar 12  2025 kube-scheduler
-rw-r--r-- 1 root  11M Mar  4  2025 runc.arm64
drwxr-xr-x 2 root 4.0K Jan 10 23:15 worker

3. 디렉터리 구조화 (Organize Binaries)

다운로드 받은 파일들이 한곳에 섞여 있으면 관리가 어렵다.
사용 용도(Role)에 따라 디렉터리를 나누고 파일을 이동시킨다.

디렉터리 생성

mkdir -p downloads/{client,cni-plugins,controller,worker}

압축 해제 및 파일 분류

단순 바이너리 파일은 그냥 옮기면 되지만, tar.gz로 묶인 녀석들은 압축을 풀어서 알맹이만 꺼낸다.

  1. Worker Node용 툴 (Container Runtime 등)

ARCH=$(dpkg --print-architecture)
echo $ARCH

# crictl (CRI CLI 도구) -> worker/
tar -xvf downloads/crictl-*-linux-${ARCH}.tar.gz -C downloads/worker/

#crictl

# containerd (컨테이너 런타임) -> worker/
tar -xvf downloads/containerd-*-linux-${ARCH}.tar.gz --strip-components 1 -C downloads/worker/

# 
bin/containerd-shim-runc-v2
bin/containerd
bin/containerd-stress
bin/ctr

# cni-plugins (네트워크 플러그인) -> cni-plugins/
tar -xvf downloads/cni-plugins-linux-${ARCH}-*.tgz -C downloads/cni-plugins/

# 
./
./ipvlan
./tap
./loopback
./host-device
./README.md
./portmap
./ptp
./vlan
./bridge
./firewall
./LICENSE
./macvlan
./dummy
./bandwidth
./vrf
./tuning
./static
./dhcp
./host-local
./sbr
  1. Controller Node용 툴 (Etcd)
# Etcd 및 Etcdctl 추출 -> downloads/ (임시)
tar -xvf downloads/etcd-v3.6.0-rc.3-linux-${ARCH}.tar.gz \
  -C downloads/ \
  --strip-components 1 \
  etcd-v3.6.0-rc.3-linux-${ARCH}/etcdctl \
  etcd-v3.6.0-rc.3-linux-${ARCH}/etcd && tree -ug downloads

#
etcd-v3.6.0-rc.3-linux-arm64/etcdctl
etcd-v3.6.0-rc.3-linux-arm64/etcd
[root     root    ]  downloads
├── [root     root    ]  client
├── [root     root    ]  cni-plugins
│   ├── [root     root    ]  bandwidth
│   ├── [root     root    ]  bridge
│   ├── [root     root    ]  dhcp
│   ├── [root     root    ]  dummy
│   ├── [root     root    ]  firewall
│   ├── [root     root    ]  host-device
│   ├── [root     root    ]  host-local
│   ├── [root     root    ]  ipvlan
│   ├── [root     root    ]  LICENSE
│   ├── [root     root    ]  loopback
│   ├── [root     root    ]  macvlan
│   ├── [root     root    ]  portmap
│   ├── [root     root    ]  ptp
│   ├── [root     root    ]  README.md
│   ├── [root     root    ]  sbr
│   ├── [root     root    ]  static
│   ├── [root     root    ]  tap
│   ├── [root     root    ]  tuning
│   ├── [root     root    ]  vlan
│   └── [root     root    ]  vrf
├── [root     root    ]  cni-plugins-linux-arm64-v1.6.2.tgz
├── [root     root    ]  containerd-2.1.0-beta.0-linux-arm64.tar.gz
├── [root     root    ]  controller
├── [root     root    ]  crictl-v1.32.0-linux-arm64.tar.gz
├── [vagrant  vagrant ]  etcd
├── [vagrant  vagrant ]  etcdctl
├── [root     root    ]  etcd-v3.6.0-rc.3-linux-arm64.tar.gz
├── [root     root    ]  kube-apiserver
├── [root     root    ]  kube-controller-manager
├── [root     root    ]  kubectl
├── [root     root    ]  kubelet
├── [root     root    ]  kube-proxy
├── [root     root    ]  kube-scheduler
├── [root     root    ]  runc.arm64
└── [root     root    ]  worker
    ├── [root     root    ]  containerd
    ├── [root     root    ]  containerd-shim-runc-v2
    ├── [root     root    ]  containerd-stress
    ├── [1001     127     ]  crictl
    └── [root     root    ]  ctr
  1. 파일 최종 이동 (Role-based Move)
# Client용 (관리자 도구)
mv downloads/{etcdctl,kubectl} downloads/client/

# Controller용 (마스터 노드 컴포넌트)
mv downloads/{etcd,kube-apiserver,kube-controller-manager,kube-scheduler} downloads/controller/

# Worker용 (워커 노드 컴포넌트)
mv downloads/{kubelet,kube-proxy} downloads/worker/
mv downloads/runc.${ARCH} downloads/worker/runc

# 확인
tree downloads/client/1
tree downloads/controller/
tree downloads/worker/

#
downloads/client/
├── etcdctl
└── kubectl

1 directory, 2 files
downloads/controller/
├── etcd
├── kube-apiserver
├── kube-controller-manager
└── kube-scheduler

1 directory, 4 files
downloads/worker/
├── containerd
├── containerd-shim-runc-v2
├── containerd-stress
├── crictl
├── ctr
├── kubelet
├── kube-proxy
└── runc

1 directory, 8 files
  1. 권한 설정 및 정리
# 불필요한 원본 압축파일 삭제
rm -rf downloads/*.gz

# 실행 권한 부여 (+x)

chmod +x downloads/{client,cni-plugins,controller,worker}/*
ls -l downloads/{client,cni-plugins,controller,worker}/*
  1. 일부 파일 소유자 변경
# 일부 파일 소유자 변경
tree -ug downloads # cat /etc/passwd | grep vagrant && cat /etc/group | grep vagrant

#잘못된 소유자 보임 
[root     root    ]  downloads
├── [root     root    ]  client
│   ├── [vagrant  vagrant ]  etcdctl
│   └── [root     root    ]  kubectl
├── [root     root    ]  cni-plugins
│   ├── [root     root    ]  bandwidth
│   ├── [root     root    ]  bridge
│   ├── [root     root    ]  dhcp
│   ├── [root     root    ]  dummy
│   ├── [root     root    ]  firewall
│   ├── [root     root    ]  host-device
│   ├── [root     root    ]  host-local
│   ├── [root     root    ]  ipvlan
│   ├── [root     root    ]  LICENSE
│   ├── [root     root    ]  loopback
│   ├── [root     root    ]  macvlan
│   ├── [root     root    ]  portmap
│   ├── [root     root    ]  ptp
│   ├── [root     root    ]  README.md
│   ├── [root     root    ]  sbr
│   ├── [root     root    ]  static
│   ├── [root     root    ]  tap
│   ├── [root     root    ]  tuning
│   ├── [root     root    ]  vlan
│   └── [root     root    ]  vrf
├── [root     root    ]  cni-plugins-linux-arm64-v1.6.2.tgz
├── [root     root    ]  controller
│   ├── [vagrant  vagrant ]  etcd
│   ├── [root     root    ]  kube-apiserver
│   ├── [root     root    ]  kube-controller-manager
│   └── [root     root    ]  kube-scheduler
└── [root     root    ]  worker
    ├── [root     root    ]  containerd
    ├── [root     root    ]  containerd-shim-runc-v2
    ├── [root     root    ]  containerd-stress
    ├── [1001     127     ]  crictl
    ├── [root     root    ]  ctr
    ├── [root     root    ]  kubelet
    ├── [root     root    ]  kube-proxy
    └── [root     root    ]  runc


chown root:root downloads/client/etcdctl
chown root:root downloads/controller/etcd
chown root:root downloads/worker/crictl


tree -ug downloads
#
[root     root    ]  downloads
├── [root     root    ]  client
│   ├── [root     root    ]  etcdctl
│   └── [root     root    ]  kubectl
├── [root     root    ]  cni-plugins
│   ├── [root     root    ]  bandwidth
│   ├── [root     root    ]  bridge
│   ├── [root     root    ]  dhcp
│   ├── [root     root    ]  dummy
│   ├── [root     root    ]  firewall
│   ├── [root     root    ]  host-device
│   ├── [root     root    ]  host-local
│   ├── [root     root    ]  ipvlan
│   ├── [root     root    ]  LICENSE
│   ├── [root     root    ]  loopback
│   ├── [root     root    ]  macvlan
│   ├── [root     root    ]  portmap
│   ├── [root     root    ]  ptp
│   ├── [root     root    ]  README.md
│   ├── [root     root    ]  sbr
│   ├── [root     root    ]  static
│   ├── [root     root    ]  tap
│   ├── [root     root    ]  tuning
│   ├── [root     root    ]  vlan
│   └── [root     root    ]  vrf
├── [root     root    ]  cni-plugins-linux-arm64-v1.6.2.tgz
├── [root     root    ]  controller
│   ├── [root     root    ]  etcd
│   ├── [root     root    ]  kube-apiserver
│   ├── [root     root    ]  kube-controller-manager
│   └── [root     root    ]  kube-scheduler
└── [root     root    ]  worker
    ├── [root     root    ]  containerd
    ├── [root     root    ]  containerd-shim-runc-v2
    ├── [root     root    ]  containerd-stress
    ├── [root     root    ]  crictl
    ├── [root     root    ]  ctr
    ├── [root     root    ]  kubelet
    ├── [root     root    ]  kube-proxy
    └── [root     root    ]  runc

# kubernetes client 도구인 kubectl를 설치
ls -l downloads/client/kubectl
cp downloads/client/kubectl /usr/local/bin/

# can be verified by running the kubectl command:
kubectl version --client
Client Version: v1.32.3
Kustomize Version: v5.5.0

4. 로컬(Jumpbox) 설정

점프박스에서도 kubectl을 써야 하므로, 클라이언트 도구를 시스템 경로(PATH)에 등록한다.

# kubectl 바이너리 설치
cp downloads/client/kubectl /usr/local/bin/

# 설치 확인

kubectl version --client
# -> Client Version: v1.32.3 (정상 출력 확인)

Client Version: v1.32.3
Kustomize Version: v5.5.0

  • 준비 완료: 쿠버네티스 구축에 필요한 모든 바이너리 파일(v1.32)을 확보했다.
  • 구조화: 다운로드한 파일들을 controller, worker, client 디렉터리로 분류했다.
  • 다음 단계: 이제 이 "부품"들을 각 서버(server, node-0, node-1)로 전송하고 조립(설치)하기 전에, 먼저 보안(TLS 인증서) 작업을 수행해야 한다.
profile
bytebliss

0개의 댓글