⭕ Ubuntu 24 Kubernetes - containerd 기반 쿠버네티스 설치 - 스크립트로 스피드 구축
1️⃣ 공통 설치 스크립트 → k8s-common-install.sh
2️⃣ 마스터 노드 전용 스크립트 → k8s-master-install.sh
3️⃣ 워커 노드 전용 스크립트 → k8s-worker-install.sh
우분트 24 이상 : CPU/RAM 최소 스펙
master: 4 vCPU, 8G RAM 이상
worker: 2 vCPU, 8G RAM 이상
1. Kubernetes 노드 호스트네임 설정 정리
1️⃣ 각 노드에서 Hostname 변경
마스터 노드:
sudo hostnamectl set-hostname k8s-master
워커 노드:
sudo hostnamectl set-hostname k8s-worker1
또는
sudo hostnamectl set-hostname k8s-worker2
2️⃣ /etc/hosts 파일 수정 (모든 노드 공통)
sudo nano /etc/hosts
예시:
192.168.120.200 k8s-master 192.168.120.201 k8s-worker1 192.168.120.202 k8s-worker2
3️⃣ 설정 확인
hostname hostnamectl cat /etc/hosts
✅ ???? 추가 팁
hostnamectl 명령으로 변경하면 즉시 적용되지만, 일부 환경에서는 SSH 세션 재접속 또는 sudo reboot 후 확인하는 것이 안전합니다.
특히 클라우드(VM) 환경에서는 다음 부팅 시 cloud-init이 hostname을 다시 변경할 수 있으므로, 아래 설정을 해두세요:
sudo nano /etc/cloud/cloud.cfg
다음 항목 추가 또는 수정:
preserve_hostname: true
2. 마스터 노드 + 워커노드 공통 설치 스크립트 k8s-common-install.sh 파일 실행
#!/bin/bash # ================================================================ # [공통 설치 스크립트] Kubernetes + Containerd 자동 설치 (Ubuntu 24.x) # 작성자: ChatGPT (GPT-5) # 설명: 마스터/워커 노드 공통으로 사용 가능. # 기존 설치 감지 시 전체 초기화 후 재설치 가능. # ================================================================ set -e LOG_FILE="/var/log/k8s-install.log" function log() { echo -e "[ $(date '+%Y-%m-%d %H:%M:%S') ] $1" | tee -a $LOG_FILE } function check_root() { if [ "$EUID" -ne 0 ]; then echo "⚠️ root 권한으로 실행해주세요." exit 1 fi } function reset_kubernetes() { echo -n "\n⚠️ 기존 쿠버네티스 구성을 전부 삭제하시겠습니까? [y/N]: " read answer if [[ "$answer" == "y" || "$answer" == "Y" ]]; then log "기존 쿠버네티스 구성을 삭제합니다." kubeadm reset -f || true systemctl stop kubelet || true systemctl stop containerd || true apt purge -y kubeadm kubectl kubelet containerd || true apt autoremove -y rm -rf /etc/kubernetes /var/lib/kubelet /var/lib/etcd /var/lib/containerd /etc/containerd /root/.kube log "초기화 완료. 새 설치를 진행합니다." else log "기존 구성을 유지하고 설치를 중단합니다." exit 0 fi } function install_dependencies() { log "[1/6] 필수 패키지 설치 중..." apt update -y apt install -y apt-transport-https ca-certificates curl gnupg lsb-release software-properties-common } function disable_swap() { log "[2/6] Swap 비활성화 중..." swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab } function setup_kernel_modules() { log "[3/6] 커널 모듈 및 네트워크 설정 중..." cat <<EOF | tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF sysctl --system > /dev/null } function install_containerd() { log "[4/6] Containerd 설치 중..." apt install -y containerd mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml systemctl enable containerd systemctl restart containerd } function install_kubernetes() { log "[5/6] Kubernetes 구성요소 설치 중..." curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" > /etc/apt/sources.list.d/kubernetes.list apt update -y apt install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl } function configure_kubelet() { log "[6/6] kubelet 설정 적용 중..." systemctl enable kubelet log "✅ 공통 설치 완료! 마스터 또는 워커 전용 스크립트를 실행하세요." } # ------------------ 실행부 ------------------ check_root if command -v kubeadm &> /dev/null; then reset_kubernetes fi install_dependencies disable_swap setup_kernel_modules install_containerd install_kubernetes configure_kubelet exit 0
실행
# 1️⃣ 공통 설치 스크립트 권한 설정 sudo chmod +x k8s-common-install.sh # 공통 설치 실행 (모든 노드 공통) sudo ./k8s-common-install.sh
3. 마스터 노드 전용 초기화 및 설치 구축
마스터 노드 전용 스크립트 → k8s-master-install.sh
#!/bin/bash # ================================================================ # [마스터 노드 전용 설치 스크립트] # Ubuntu 24.x + Containerd 기반 Kubernetes 마스터 초기화 및 설정 # ================================================================ set -e LOG_FILE="/var/log/k8s-master-setup.log" function log() { echo -e "[ $(date '+%Y-%m-%d %H:%M:%S') ] $1" | tee -a $LOG_FILE } function check_root() { if [ "$EUID" -ne 0 ]; then echo "⚠️ root 권한으로 실행해주세요." exit 1 fi } function init_master() { log "Kubernetes 마스터 노드 초기화 중..." local POD_CIDR="10.244.0.0/16" kubeadm init --pod-network-cidr=$POD_CIDR --kubernetes-version stable-1.30 | tee -a $LOG_FILE mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config log "네트워크 애드온(flannel) 설치 중..." kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml | tee -a $LOG_FILE log "마스터 노드 초기화 완료!" log "아래 명령어를 복사하여 워커 노드에서 실행하세요:" kubeadm token create --print-join-command } check_root init_master log "✅ 마스터 노드 설정이 완료되었습니다. 클러스터 상태를 확인하려면:\n kubectl get nodes -o wide" exit 0
실행
# 2️⃣ 마스터 노드 전용 스크립트 권한 설정 sudo chmod +x k8s-master-install.sh # 마스터 노드 초기화 실행 sudo ./k8s-master-install.sh
워커노드 조인값 복사
4. 워커 노드 등록 실행 - k8s-worker-install.sh
k8s-worker-install.sh
#!/bin/bash # ================================================================ # [워커 노드 전용 설치 스크립트] # Ubuntu 24.x + Containerd 기반 Kubernetes 워커 노드 등록 # ================================================================ set -e LOG_FILE="/var/log/k8s-worker-setup.log" function log() { echo -e "[ $(date '+%Y-%m-%d %H:%M:%S') ] $1" | tee -a $LOG_FILE } function check_root() { if [ "$EUID" -ne 0 ]; then echo "⚠️ root 권한으로 실행해주세요." exit 1 fi } function join_cluster() { echo -n "마스터 노드에서 받은 join 명령어를 입력해주세요:\n> " read JOIN_CMD if [[ -z "$JOIN_CMD" ]]; then log "❌ join 명령어가 비어있습니다. 마스터 노드에서 'kubeadm token create --print-join-command'로 확인하세요." exit 1 fi log "워커 노드를 클러스터에 등록 중..." eval $JOIN_CMD | tee -a $LOG_FILE log "✅ 워커 노드 등록 완료!" log "마스터 노드에서 'kubectl get nodes'로 등록 상태를 확인하세요." } check_root join_cluster exit 0
실행
# 3️⃣ 워커 노드 전용 스크립트 권한 설정 sudo chmod +x k8s-worker-install.sh # 워커 노드 등록 실행 sudo ./k8s-worker-install.sh
5. master node에서 등록된 worker node를 확인합니다.
root@k8s-master:~# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-master Ready control-plane 17h v1.30.14 192.168.0.50 <none> Ubuntu 24.04.3 LTS 6.8.0-85-generic containerd://1.7.28 k8s-worker1 Ready <none> 17h v1.30.14 192.168.0.51 <none> Ubuntu 24.04.3 LTS 6.8.0-85-generic containerd://1.7.28 k8s-worker2 Ready <none> 17h v1.30.14 192.168.0.52 <none> Ubuntu 24.04.3 LTS 6.8.0-85-generic containerd://1.7.28 k8s-worker3 Ready <none> 17h v1.30.14 192.168.0.53 <none> Ubuntu 24.04.3 LTS 6.8.0-85-generic containerd://1.7.28 k8s-worker4 Ready <none> 16h v1.30.14 192.168.0.54 <none> Ubuntu 24.04.3 LTS 6.8.0-85-generic containerd://1.7.28
6. k8s-worker-rejoin.sh 스마트 워커 재설치 스크립트
#!/bin/bash # ================================================================ # k8s-worker-rejoin.sh # 스마트 워커 재설치/재조인 스크립트 (Ubuntu 24.x, containerd 기반) # - 로컬 워커 kubeadm 설정을 안전하게 초기화(reset)하고 # 새 hostname으로 재조인(join)할 수 있게 도와줍니다. # - **중요:** 이 스크립트는 마스터(컨트롤플레인)의 구성(Etcd, API 서버 등)을 # 삭제하거나 재설치하지 않습니다. 마스터 관련 작업은 별도로 마스터에서 수행해야 합니다. # ================================================================ set -euo pipefail LOG_FILE="/var/log/k8s-worker-rejoin.log" function log() { echo -e "[ $(date '+%Y-%m-%d %H:%M:%S') ] $1" | tee -a "$LOG_FILE" } function check_root() { if [ "$EUID" -ne 0 ]; then echo "⚠️ 루트 권한으로 실행하세요: sudo ./k8s-worker-rejoin.sh" exit 1 fi } function safe_remove_if_exists() { local path="$1" if [ -e "$path" ]; then rm -rf "$path" || true log "Removed: $path" fi } function local_reset() { if ! command -v kubeadm &>/dev/null; then log "kubeadm이 설치되어 있지 않습니다. 로컬 초기화는 건너뜁니다." return fi echo -n "⚠️ 기존 워커 노드 로컬 구성을 초기화(reset)하시겠습니까? (로컬 설정만 삭제) [y/N]: " read -r ans if [[ "$ans" != "y" && "$ans" != "Y" ]]; then log "로컬 초기화를 선택하지 않았습니다. 종료합니다." exit 0 fi log "로컬 kubeadm reset 실행 중..." kubeadm reset -f || true systemctl stop kubelet || true systemctl disable kubelet || true log "로컬 관련 디렉토리 정리 중..." safe_remove_if_exists "/etc/kubernetes" safe_remove_if_exists "/var/lib/kubelet" safe_remove_if_exists "/var/lib/etcd" safe_remove_if_exists "/var/lib/cni" safe_remove_if_exists "/etc/cni/net.d" safe_remove_if_exists "/var/lib/containerd" safe_remove_if_exists "/etc/containerd" safe_remove_if_exists "/root/.kube" # CNI 인터페이스 삭제 시도 (실패해도 계속) ip link delete cni0 2>/dev/null || true ip link delete flannel.1 2>/dev/null || true systemctl restart containerd || true log "로컬 초기화 완료." } function optionally_run_common_installer() { if [ -x "./k8s-common-install.sh" ]; then echo -n "공통 설치 스크립트(k8s-common-install.sh)를 실행하여 kubelet/containerd 등 공통 구성 재설치 하시겠습니까? [y/N]: " read -r ans if [[ "$ans" == "y" || "$ans" == "Y" ]]; then log "k8s-common-install.sh 실행..." ./k8s-common-install.sh log "공통 설치 완료." else log "공통 설치 스크립트 실행 안함." fi else log "동일 디렉토리에 k8s-common-install.sh이 없습니다. 공통 구성 재설치 필요 시 이 파일을 같은 경로에 넣고 다시 실행하세요." fi } function delete_old_node_on_master_instructions() { log "주의: 마스터 클러스터에는 이전 hostname(예: old-hostname)이 남아 있을 수 있습니다." echo -e "\n마스터에서 아래 명령으로 기존 노드를 삭제하세요 (마스터에서 실행):\n kubectl delete node <old-hostname>\n" echo -e "만약 마스터 접근 권한이 있고 자동으로 삭제를 하길 원하면, 마스터에서 직접 이 스크립트를 실행하거나 SSH로 수동 삭제하세요.\n" } function do_join() { echo -e "\n마스터 노드에서 받은 kubeadm join 명령어 전체(예: kubeadm join <ip>:6443 --token ... --discovery-token-ca-cert-hash sha256:...) 를 입력하세요:\n> " read -r JOIN_CMD if [[ -z "$JOIN_CMD" ]]; then log "❌ join 명령어 입력이 없습니다. 종료합니다." exit 1 fi log "join 명령 실행 중..." # join 시 --cri-socket 옵션이 필요한 경우가 있어 안전하게 실행 eval "$JOIN_CMD" | tee -a "$LOG_FILE" log "join 명령 실행 완료." } # ---------------- 실행 흐름 ---------------- check_root log "=== k8s-worker-rejoin 시작 ===" # 1) 로컬 초기화 (kubeadm reset 등) local_reset # 2) 공통 설치 스크립트 재실행 선택 (containerd, kubeadm, kubelet 등 재설치) optionally_run_common_installer # 3) 사용자에게 마스터에서 기존 노드를 삭제하라는 안내 제공 delete_old_node_on_master_instructions # 4) join 명령어로 재조인 do_join log "=== 작업 완료 ===" log "마스터에서 'kubectl get nodes' 로 노드 상태를 확인하세요." exit 0
1)파일을 워커 노드에 복사하고 실행 권한 부여:
sudo chmod +x k8s-worker-rejoin.sh
2) 실행
sudo ./k8s-worker-rejoin.sh
스크립트가 묻는 순서에 따라:
로컬 초기화 수행 여부(y/N)
동일 폴더에 k8s-common-install.sh가 있으면 공통 스크립트 재실행 여부(y/N)
마스터에서 기존 노드 삭제 안내 (사용자가 직접 kubectl delete node <old-hostname> 수행)
마지막으로 kubeadm join ... 명령어 입력받아 재조인 실행
핵심 — 이 스크립트가 무엇을 하는가
로컬 워커 노드의 kubeadm 설정만 안전하게 초기화(reset) 합니다 (kubeadm reset -f, kubelet/관련 디렉토리 삭제 등).
필요하면 같은 디렉토리에 있는 k8s-common-install.sh를 자동으로 실행해 containerd / kubelet / kubeadm 등 공통 구성을 재설치할 수 있습니다.
마스터(컨트롤플레인) 구성(Etcd, API 서버 등)은 절대 삭제하지 않습니다. 마스터에서 노드를 직접 삭제(kubectl delete node <old-hostname>)해야 할 경우 사용자에게 안내합니다.
초기화 후 사용자가 입력한 kubeadm join ... 명령어로 재조인(join) 을 수행합니다.
실행 로그는 /var/log/k8s-worker-rejoin.log에 남습니다.
7. k8s 삭제 스크립트 - k8s-full-delete.sh
#!/usr/bin/env bash # k8s-full-delete.sh # 목적: 쿠버네티스 마스터/워커 노드 완전 삭제 스크립트 (설치 재설치 준비용) # 사용 환경: Ubuntu, kubeadm 기반 클러스터 # 주의: 모든 쿠버네티스 데이터 삭제됨. 반드시 백업 후 실행. set -euo pipefail IFS=$'\n\t' echo "[INFO] 쿠버네티스 완전 삭제 시작" ######################################## # 1) kubeadm 초기화 ######################################## echo "[STEP 1] kubeadm reset" set +e kubectl drain $(hostname) --ignore-daemonsets --delete-emptydir-data --force 2>/dev/null || true set -e sudo kubeadm reset -f || true ######################################## # 2) kubelet 및 컨테이너 런타임 정리 ######################################## echo "[STEP 2] kubelet / 컨테이너 정리" sudo systemctl stop kubelet || true sudo systemctl stop docker || true sudo systemctl stop containerd || true sudo pkill -f kubelet || true sudo pkill -f dockerd || true sudo pkill -f containerd || true ######################################## # 3) 쿠버네티스 관련 디렉토리 삭제 ######################################## echo "[STEP 3] 관련 디렉토리 삭제" sudo rm -rf /etc/kubernetes sudo rm -rf /var/lib/etcd sudo rm -rf /var/lib/kubelet sudo rm -rf /var/lib/dockershim sudo rm -rf /var/lib/cni sudo rm -rf /var/run/kubernetes sudo rm -rf /etc/cni/net.d sudo rm -rf /opt/cni ######################################## # 4) 쿠버네티스 패키지 제거 ######################################## echo "[STEP 4] 패키지 제거" sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni kube* sudo apt-get autoremove -y sudo apt-get autoclean ######################################## # 5) 네트워크 초기화 ######################################## echo "[STEP 5] CNI 네트워크 및 iptables 초기화" sudo ip link delete cni0 || true sudo ip link delete flannel.1 || true sudo ip link delete docker0 || true sudo iptables -F sudo iptables -t nat -F sudo iptables -t mangle -F sudo iptables -X ######################################## # 6) 컨테이너 런타임 초기화 ######################################## echo "[STEP 6] 컨테이너 런타임 이미지/컨테이너 삭제" docker system prune -a -f || true crictl rm -f $(crictl ps -aq) 2>/dev/null || true crictl rmi -f $(crictl images -q) 2>/dev/null || true ######################################## # 완료 ######################################## echo "[DONE] 쿠버네티스 완전 삭제 완료. 재설치 준비 완료"
댓글 ( 0)
댓글 남기기