PC에서 실습 환경 구축 <1> 우분트,. 버추얼 박스 1 # 우분트 다운로드 - 10분 https://ubuntu.com/download/server 2 # 버추얼 박스 다운로드 - 10분 https://www.virtualbox.org/ 3 # 설치한 우분트를 SSH 서버 만들기. sudo apt update sudo apt install openssh-server sudo systemctl status ssh 4 # 1. 패키지 업데이트 및 필수 도구 설치 sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl software-properties-common # 2. 도커 공식 GPG 키 추가 및 저장소 등록 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 3. 도커 설치 sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io 5 명령어 한 줄이면 바로 눈으로 확인하실 수 있습니다: docker run -d -p 80:80 --name my-web nginx <4> PC에 쿠버네티스 설치 1 2. 모든 노드 공통 설정 (Master & Worker) # Swap 비활성화 sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 2 # 커널 모듈 및 네트워크 설정 cat < [설정] -> [시스템] -> [프로세서] 탭으로 이동합니다. 프로세서 개수를 2개로 늘려줍니다. VM을 다시 켜고 아래 명령어를 다시 실행합니다. ----------- 해결 방법 2: 사양 체크 무시하고 강제 설치 만약 호스트 PC 사정상 CPU를 늘릴 수 없다면, 에러를 무시하는 옵션을 추가하여 진행할 수 있습니다. # --ignore-preflight-errors 옵션 추가 sudo kubeadm init \ --pod-network-cidr=192.168.0.0/16 \ --apiserver-advertise-address=192.168.45.131 \ --ignore-preflight-errors=NumCPU 해결 방법: 1 containerd 설정을 초기화하고 SystemdCgroup을 true로 확실히 설정해야 합니다. sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # SystemdCgroup 설정 찾아서 true로 변경 sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml sudo systemctl restart containerd 2. 두 번째 원인: kubeadm reset 및 재시도 한 번 실패한 상태에서 그대로 다시 init을 하면 파일이 꼬입니다. 깨끗하게 비우고 다시 시작해야 합니다. # 1. 이전 설정 초기화 sudo kubeadm reset -f # 2. (선택사항) IP 포워딩 확인 sudo sysctl -w net.ipv4.ip_forward=1 # 3. 다시 실행 (CPU가 2개가 아니라면 에러 무시 옵션 유지) sudo kubeadm init \ --pod-network-cidr=192.168.0.0/16 \ --apiserver-advertise-address=192.168.45.131 \ --ignore-preflight-errors=NumCPU 3 # kubelet의 실시간 로그 확인 journalctl -xeu kubelet -f --------- 8 성공 후 다음 단계 (반드시 확인) kubeadm init이 성공하면 화면에 **"Your Kubernetes control-plane has initialized successfully!"**라는 메시지가 뜹니다. 그 후에 아래 명령어를 입력해야 에러가 나지 않습니다. # 1. 설정 파일 복사 (이제 파일이 존재하므로 에러가 나지 않습니다) mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 2. 노드 상태 확인 kubectl get nodes 9 버추얼박스의 NAT 또는 어댑터 설정이 DHCP(자동 할당)로 되어 있으면, 재부팅할 때마다 IP가 바뀌어 클러스터가 깨질 수 있습니다. 해결 방안: Ubuntu Netplan 설정: /etc/netplan/*.yaml 파일을 수정하여 192.168.45.132를 **고정 IP(Static)**로 지정하세요. VirtualBox 설정: '호스트 전용 어댑터'를 사용하여 고정된 서브넷의 IP를 부여하는 것이 가장 안정적입니다. # 마스터 노드 초기화 (Master Node만 실행) 해결 단계 (IP 불일치 수정) sudo kubeadm reset -f sudo rm -rf $HOME/.kube sudo rm -rf /etc/cni/net.d sudo kubeadm init \ --pod-network-cidr=192.168.0.0/16 \ --apiserver-advertise-address=192.168.45.132 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ----------------------------------------------------------------------------------- 10 2. kubeadm init 재실행 kubeadm 설치가 확인되었다면, 아까 실패했던 초기화 명령어를 다시 입력합니다. (반드시 sudo 권한으로 실행하세요) # Calico CNI를 사용할 경우의 예시 sudo kubeadm init \ --pod-network-cidr=192.168.0.0/16 \ --apiserver-advertise-address=192.168.45.131 # 설정 파일 복사 (일반 사용자 권한으로 kubectl 사용) mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config --------------- 조치 11 현재 상황은 kubeadm이 **"컨테이너 런타임(containerd)을 통해 API 서버를 띄우려고 시도했지만, kubelet이 이를 정상적으로 실행하지 못하고 있음"**을 의미합니다. 가장 결정적인 원인은 Ubuntu 24.04의 containerd 기본 설정과 쿠버네티스의 Cgroup 드라이버 불일치일 가능성이 매우 높습니다. 아래 절차를 순서대로 빠짐없이 수행하면 해결될 것입니다. 1. 런타임 설정 완전 초기화 (필수) kubelet이 containerd를 제대로 제어하려면 SystemdCgroup 옵션이 반드시 true여야 합니다. # 1. 기존 실패 잔해 완전히 제거 sudo kubeadm reset -f sudo rm -rf /etc/cni/net.d /var/lib/etcd /var/lib/kubelet # 2. containerd 설정 초기화 및 수정 sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # SystemdCgroup 설정을 false에서 true로 강제 변경 sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml # 3. 서비스 재시작 sudo systemctl restart containerd sudo systemctl restart kubelet 2 2. 이미지 미리 다운로드 (타임아웃 방지) 가상머신 사양이나 네트워크 속도 문제로 4분 안에 컴포넌트를 못 띄우는 경우를 방지하기 위해 이미지를 미리 받아둡니다. sudo kubeadm config images pull 3 3. 쿠버네티스 초기화 재시도 (현재 IP 사용) 현재 확인하신 IP인 192.168.45.132를 사용하여 초기화를 진행합니다. sudo kubeadm init \ --pod-network-cidr=192.168.0.0/16 \ --apiserver-advertise-address=192.168.45.132 -------------------- 12 1. 클러스터 관리 설정 (필수) 현재 root 사용자이시므로, kubectl 명령어를 바로 사용할 수 있도록 환경 변수를 설정하거나 설정 파일을 복사해야 합니다. (아래 명령어를 복사해서 붙여넣으세요.) mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 2. 네트워크 플러그인(CNI) 설치 현재 상태에서 kubectl get nodes를 치면 노드가 NotReady로 보일 것입니다. 노드 간 통신을 위해 Calico를 설치해야 합니다. # 1. Calico Operator 설치 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml # 2. Custom Resources 설치 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/custom-resources.yaml kubectl get nodes 4. 워커 노드 조인 (Worker Nodes) 만약 추가로 준비한 다른 VM(워커 노드)이 있다면, 해당 VM에서 아까 화면에 뜬 조인 명령어를 실행하면 됩니다. 주의: 아래 명령어는 예시이며, 반드시 본인의 터미널에 뜬 토큰값을 사용하세요. # 워커 노드 VM에서 실행 (root 권한) kubeadm join 192.168.45.132:6443 --token o0q8wy.2wfiaapxlij8z5ui \ --discovery-token-ca-cert-hash sha256:4377210e13bf753da80b7a4be78f6806dae20eeaf3622edcbd900e58623af4d8 ---------- : 마스터 노드에서도 파드를 띄우고 싶다면? (단일 노드 구성) 지금은 마스터 노드 하나만 있는 상태이므로, 기본적으로는 보안상 마스터에는 일반 파드가 배포되지 않습니다(Taint 설정). 테스트용으로 마스터 노드 하나만 쓰실 계획이라면 아래 명령어를 입력해 주세 kubectl taint nodes --all node-role.kubernetes.io/control-plane- 13 kubectl get nodes 14 1. 마스터 노드 스케줄링 허용 (Taint 해제) 기본적으로 쿠버네티스 마스터 노드는 보안을 위해 일반 애플리케이션 파드(Pod)가 배포되지 않도록 설정되어 있습니다. 워커 노드 없이 마스터 노드만 사용 중이라면 이 설정을 풀어줘야 합 kubectl taint nodes --all node-role.kubernetes.io/control-plane- 15 2. Nginx Deployment 생성 Deployment는 파드의 개수와 상태를 관리하는 컨트롤러입니다. Nginx 파드를 하나 생성해 보겠습니다. # nginx 배포 (Deployment 생성) kubectl create deployment nginx-web --image=nginx # 배포 상태 확인 kubectl get pods 16 3. 서비스(Service) 노출하기 파드는 내부 IP만 가지고 있어 외부에서 접속할 수 없습니다. 외부에서 접속할 수 있도록 NodePort 타입의 서비스를 생성합니다. # 80 포트를 외부로 노출 kubectl expose deployment nginx-web --type=NodePort --port=80 # 할당된 포트 번호 확인 kubectl get svc 4. 접속 테스트 이제 브라우저를 열고 다음 주소로 접속해 보세요. 주소: http://192.168.45.132:3xxxx (위에서 확인한 포트 번호) 성공하면 "Welcome to nginx!" 메시지가 화면에 나타납니다. 17 # 파드 개수를 3개로 확장 kubectl scale deployment nginx-web --replicas=3 # 확인 kubectl get pods -o wide 18 g 0 71s 192.168.255.197 agame-web01 root@agame-web01:~# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-web-54f478b58f-4484z 1/1 Running 0 16s 192.168.255.200 agame-web01 nginx-web-54f478b58f-5jkdj 1/1 Running 0 16s 192.168.255.201 agame-web01 nginx-web-54f478b58f-pldd4 1/1 Running 0 75s 192.168.255.197 agame-web01 root@agame-web01:~# kubectl get pods -o wide 19 만약 브라우저에서 접속이 안 된다면 다음 두 가지를 확인하세요: Ubuntu 방화벽: sudo ufw disable이 되어 있는지 확인하세요. VirtualBox 포트 포워딩: 만약 NAT 네트워크를 사용 중이라면, VirtualBox 설정의 [네트워크] -> [고급] -> [포트 포워딩]에서 3xxxx 포트를 호스트 PC와 연결해 주어야 합니다. 이제 웹 서버가 정상적으로 작동하나요? 아니면 YAML 파일을 이용해 직접 설정을 정의하는 방법을 배워보고 싶으신가요? 20 8b58f-pldd4 1/1 Running 0 75s 192.168.255.197 agame-web01 root@agame-web01:~# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 9m34s nginx-web NodePort 10.105.60.211 80:32549/TCP 83s 21 http://192.168.45.132:32549 22 만약 접속이 안 된다면? (VirtualBox 필수 체크) VirtualBox 가상머신 환경에서는 네트워크 설정 방식에 따라 추가 작업이 필요할 수 있습니다. 1. 포트 포워딩 설정 (NAT 네트워크 사용 시) 가상머신의 네트워크 어댑터가 NAT 방식이라면, 내 PC(호스트)의 포트와 가상머신의 포트를 연결해줘야 합니다. VirtualBox 관리자에서 [설정] -> [네트워크] -> [고급] -> [포트 포워딩] 클릭. 새 규칙 추가: 호스트 포트: 32549 게스트 IP: 192.168.45.132 게스트 포트: 32549 확인 후 웹 브라우저에서 http://localhost:32549로 접속해 보세요. 2. 내부 통신 확인 (VM 안에서) # VM 터미널에서 입력 curl localhost:32549