Kubernetes The Hard Way의 두 번째 단계인 '점프박스 세팅 및 바이너리 다운로드' 과정을 기술
- 클러스터 구축에 필요한 모든 부품(Binaries)을 인터넷에서 미리 다운로드 받아, 용도별(
client,controller,worker)로 깔끔하게 정리해두는 작업이다.- 쿠버네티스 구축에 필요한 실행 파일(Binary)들을 미리 점프박스에 다운로드하여 정리한다.
- 나중에 각 노드(Controller, Worker)에 배포할 때, 매번 인터넷에서 다운받지 않고 여기서 한 번에 실행하기 위함이다.
점프박스는 관리자 권한(root)으로 작업하며, 최신 버전의 KTHW 저장소를 가져온다.
| 설치 항목 | 버전 |
|---|---|
| k8s 관련 (kube-apiserver, kubelet 등) | 1.32.2 |
| etcd | 3.6.0 |
| containerd | 2.1.0 |
| runc | 1.3.0 |
# 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:~#
전체 히스토리는 필요 없으므로 --depth 1 옵션으로 최신 커밋만 가볍게 가져온다.
git clone --depth 1 https://github.com/kelseyhightower/kubernetes-the-hard-way.git
cd kubernetes-the-hard-way
쿠버네티스 버전 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
# 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
다운로드 받은 파일들이 한곳에 섞여 있으면 관리가 어렵다.
사용 용도(Role)에 따라 디렉터리를 나누고 파일을 이동시킨다.
mkdir -p downloads/{client,cni-plugins,controller,worker}
단순 바이너리 파일은 그냥 옮기면 되지만, tar.gz로 묶인 녀석들은 압축을 풀어서 알맹이만 꺼낸다.
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
# 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
# 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
# 불필요한 원본 압축파일 삭제
rm -rf downloads/*.gz
# 실행 권한 부여 (+x)
chmod +x downloads/{client,cni-plugins,controller,worker}/*
ls -l downloads/{client,cni-plugins,controller,worker}/*
# 일부 파일 소유자 변경
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
점프박스에서도 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 인증서) 작업을 수행해야 한다.