⭕ 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)  
댓글 남기기