Q&A
kubeinstall.sh 오류 확인 요청드립니다.
버전이 좀 오래되어서 아래와 같이 변경을 했습니다. 제가 설치해보니 잘 되는데, 한번 교체를 해서 해보시기 바랍니다. #!/usr/bin/env bash # ===================================================================== # Kubernetes 단일 노드(Control-plane + Worker) 설치 스크립트 # 대상 OS : Ubuntu 18.04 / 20.04 / 22.04 (cgroup v1/v2 모두 지원) # 구성 : containerd + kubeadm/kubelet/kubectl v1.30 + Flannel CNI # 사용법 : sudo bash install-k8s.sh # ===================================================================== set -euo pipefail # ---------------------------- 설정값 --------------------------------- K8S_VERSION="${K8S_VERSION:-v1.30}" # Kubernetes 마이너 버전 POD_CIDR="${POD_CIDR:-10.244.0.0/16}" # Flannel 기본 Pod 대역 NODE_IP="${NODE_IP:-$(hostname -I | awk '{print $1}')}" # API 서버 광고 IP KUBE_USER="${SUDO_USER:-$(whoami)}" # kubectl을 사용할 일반 사용자 FLANNEL_URL="https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml" export DEBIAN_FRONTEND=noninteractive log() { echo -e "\n\033[1;32m[$(date +%H:%M:%S)] ==> $*\033[0m"; } if [ "$(id -u)" -ne 0 ]; then echo "root 권한이 필요합니다: sudo bash $0" >&2; exit 1 fi # ------------------------------------------------------------------ log "STEP 1. Swap 비활성화" # ------------------------------------------------------------------ swapoff -a sed -i.bak -E '/\sswap\s/ s/^([^#])/#\1/' /etc/fstab free -h # ------------------------------------------------------------------ log "STEP 2. 커널 모듈(overlay, br_netfilter) 및 sysctl 설정" # ------------------------------------------------------------------ cat /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter cat /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system >/dev/null sysctl net.bridge.bridge-nf-call-iptables net.ipv4.ip_forward # ------------------------------------------------------------------ log "STEP 3. 방화벽(ufw) 쿠버네티스 필수 포트 허용" # ------------------------------------------------------------------ if command -v ufw >/dev/null 2>&1 && ufw status | grep -q "Status: active"; then ufw allow 22/tcp # SSH ufw allow 6443/tcp # kube-apiserver ufw allow 2379:2380/tcp # etcd ufw allow 10250/tcp # kubelet API ufw allow 10257/tcp # kube-controller-manager ufw allow 10259/tcp # kube-scheduler ufw allow 30000:32767/tcp # NodePort 서비스 ufw allow 8472/udp # Flannel VXLAN ufw allow from "${POD_CIDR}" # Pod 네트워크 내부 통신 ufw allow from 10.96.0.0/12 # Service 네트워크 내부 통신 ufw status numbered fi # ------------------------------------------------------------------ log "STEP 4. 필수 패키지 설치" # ------------------------------------------------------------------ apt-get update -y || true apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release mkdir -p -m 755 /etc/apt/keyrings # ------------------------------------------------------------------ log "STEP 5. containerd 설치 (Docker 공식 저장소)" # ------------------------------------------------------------------ curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ > /etc/apt/sources.list.d/docker.list apt-get update -y || true apt-get install -y containerd.io # containerd 기본 설정 생성 + SystemdCgroup 활성화 + pause 이미지 지정 mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml sed -i -E 's#sandbox_image = ".*"#sandbox_image = "registry.k8s.io/pause:3.9"#' /etc/containerd/config.toml systemctl restart containerd systemctl enable containerd containerd --version # ------------------------------------------------------------------ log "STEP 6. kubeadm / kubelet / kubectl 설치 (${K8S_VERSION})" # ------------------------------------------------------------------ curl -fsSL "https://pkgs.k8s.io/core:/stable:/${K8S_VERSION}/deb/Release.key" \ | gpg --dearmor --yes -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:/${K8S_VERSION}/deb/ /" \ > /etc/apt/sources.list.d/kubernetes.list apt-get update -y || true apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl systemctl enable --now kubelet kubeadm version -o short # ------------------------------------------------------------------ log "STEP 7. kubeadm init (클러스터 초기화)" # ------------------------------------------------------------------ if [ ! -f /etc/kubernetes/admin.conf ]; then kubeadm config images pull kubeadm init \ --pod-network-cidr="${POD_CIDR}" \ --apiserver-advertise-address="${NODE_IP}" \ | tee /root/kubeadm-init.log else echo "이미 초기화된 클러스터입니다 (/etc/kubernetes/admin.conf 존재) - 건너뜀" fi # ------------------------------------------------------------------ log "STEP 8. kubectl 설정 (root, ${KUBE_USER})" # ------------------------------------------------------------------ mkdir -p /root/.kube cp -f /etc/kubernetes/admin.conf /root/.kube/config USER_HOME=$(getent passwd "${KUBE_USER}" | cut -d: -f6) mkdir -p "${USER_HOME}/.kube" cp -f /etc/kubernetes/admin.conf "${USER_HOME}/.kube/config" chown -R "$(id -u "${KUBE_USER}")":"$(id -g "${KUBE_USER}")" "${USER_HOME}/.kube" export KUBECONFIG=/etc/kubernetes/admin.conf # ------------------------------------------------------------------ log "STEP 9. Flannel CNI 설치" # ------------------------------------------------------------------ kubectl apply -f "${FLANNEL_URL}" # ------------------------------------------------------------------ log "STEP 10. 단일 노드에서 Pod 스케줄링 허용 (control-plane taint 제거)" # ------------------------------------------------------------------ kubectl taint nodes --all node-role.kubernetes.io/control-plane- || true # ------------------------------------------------------------------ log "STEP 11. 노드 Ready 대기" # ------------------------------------------------------------------ kubectl wait --for=condition=Ready node --all --timeout=300s kubectl get nodes -o wide kubectl get pods -A # ------------------------------------------------------------------ log "STEP 12. 동작 테스트 (nginx 배포 + NodePort 노출)" # ------------------------------------------------------------------ kubectl create deployment nginx-test --image=nginx --dry-run=client -o yaml | kubectl apply -f - kubectl expose deployment nginx-test --port=80 --type=NodePort --dry-run=client -o yaml | kubectl apply -f - kubectl rollout status deployment/nginx-test --timeout=300s NODE_PORT=$(kubectl get svc nginx-test -o jsonpath='{.spec.ports[0].nodePort}') kubectl get deploy,svc,pods -o wide echo "--- curl http://${NODE_IP}:${NODE_PORT} ---" curl -s "http://${NODE_IP}:${NODE_PORT}" | grep -i " " || true log "설치 완료! 일반 사용자(${KUBE_USER})로 'kubectl get nodes' 를 실행해 보세요." echo "워커 노드 추가 명령: $(kubeadm token create --print-join-command)"
- Likes
- 0
- Comments
- 1
- Viewcount
- 23

