Nodejs

 

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] 쿠버네티스 완전 삭제 완료. 재설치 준비 완료"

 

 

 

 

about author

PHRASE

Level 60  라이트

이 세상에서는 당신이 영원히 죽지 않는다고 생각하고 모든 것을 계획하라. 그러나 저 세상을 위해서는 내일 죽는다고 생각하고 계획하라. -유태격언

댓글 ( 0)

댓글 남기기

작성