내가 마주한 에러들

진짜 쿠버네티스 분산 처리보다 어려웠다
정확히는 챙겨야하는게 많았고 에러도 많았다
양이 방대해서 개념 정리도 필요했음
1. kube-apiserver / etcd 강제 종료 & 무한 재시작
- 6443 포트 사용하는 Kube-apiserver가 자동으로 종료되는 문제
- etcd도 시작 후 10초 뒤에 외부 신호(SIGTERM) 받고 종료됨;;;
- 로그 보니 무슨 kubelet이 etcd liveness probe 실패해서 종료되고 결국 kubelet이 무한 재시작 루프에 갇힘
- 그로인해 apiserver도 같이 죽는 문제 발생
- 찾아보니 기존 클러스터의 자연 파일 및 프로세스가 남아있어서 중복 포트 점유 중이라서 생긴 문제

- 일단 기존 포트 점유 중인 것 전부 kill하기 위해 아래 명령어 시도
# 1. 클러스터 서비스 중단
sudo systemctl stop kubelet
# 2. etcd 데이터 완전 초기화 (비어있는 상태로 재생성)
sudo rm -rf /var/lib/etcd
# 3. kubelet 다시 시작 (이러면 kubeadm이 etcd, apiserver 전부 재생성)
sudo systemctl restart kubelet
# 4. 10~15초 기다리고 확인
sleep 15
sudo ss -tulnp | grep -E "2379|6443"
- 하고 보니 이젠 연결 거부
dial tcp 127.0.0.1:2379: connect: connection refused
- 확인해보니 포트가 ufw에서 닫혀 있어서 열어주었다
sudo ufw allow 2381/tcp
2. Node는 Ready인데 Pod이 안뜸;;
- 바로 위의 1번과도 연결되는 문제
- Node 상태는 Ready인데 Pod이 안뜨는 이슈였다
- 이때는 아예 그냥 싹다 끄고 다시 만들고 시작해서 해결했다
1) Kubelet 및 containerd 완전 중단
sudo systemctl stop kubelet
sudo systemctl stop containerd
2) Kubeadm 리셋 및 잔여 리소스 제거
sudo kubeadm reset -f
3) 수동으로 직접 디렉토리 정리
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/kubelet/*
sudo rm -rf /etc/cni/net.d
sudo rm -rf ~/.kube
4) (혹시 남아있는) 프로세스 강제 종료
sudo pkill -9 kubelet
sudo pkill -9 etcd
sudo pkill -9 kube-apiserver
sudo pkill -9 kube-controller
sudo pkill -9 kube-scheduler
5) containerd 다시 시작
sudo systemctl restart containerd
sudo systemctl enable containerd
6) kubelet 재시작
sudo systemctl restart kubelet
7) 다시 init 시도
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
8) 7번까지 됐으면 아래 명령어 실행
- 이 명령어들은 kubectl에게 'Kubernetes 클러스터의 연결 정보'를 알려주는 과정이다
- 참고로 admin.conf 안에는 kubectl이 클러스터와 통신하는 데 필요한 모든 인증정보가 들어있다
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 위 명령어를 안하면 아래 같은 에러를 볼 수 있다

3. kubeconfig 설정 안 해서 kubectl 명령어 전부 오류
- 이건 바로 위의 2번(Node는 Ready인데 Pod이 안뜸;;)의 8번 과정과 연관있는 에러였다
kubectl: The connection to the server localhost:8080 was refused
- kubeconfig를 $HOME/.kube/config로 복사하지 않았던 것이 원인
- 복사해주면 된다
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
4. ip_forward 꺼짐으로 Pod 통신 안됨
- CNI 쓸려면 커널단에서 라우팅은 켜줘야한다
sudo sysctl -w net.ipv4.ip_forward=1
5. 메인 노드에 요청이 안가는 에러
- 이것은... 메인 노드(맥미니_우분투)에 설치해둔 nginx가 요청을 다먹어서 생긴 문제였다
- 그러니까 nginx가 있어서 제일 먼저 요청을 처리하니까 쿠버네티스가 받을 틈이 없었던 것
- nginx 종료해서 해결됐다
6. CNI 모듈 로딩 실패
- 자꾸 노드 하나만 에러 뜨는 이슈가 있었다

- 아래 명령어가 vxlan과 br_netfilter라고 CNI 구축에 필수인 것들 체크하는 것인데 안뜬다면?
- CNI가 동작이 불가하고 flannel이 패닉에 빠진다
lsmod | grep vxlan
lsmod | grep br_netfilter
- 한 노드가 그런 상태였음

- 다시 설정해주자
sudo modprobe br_netfilter
sudo modprobe vxlan
- 영구 설정 명령어 (e.g. 재부팅)
echo br_netfilter | sudo tee /etc/modules-load.d/br_netfilter.conf
echo vxlan | sudo tee /etc/modules-load.d/vxlan.conf
- 이러고 나니 인식 잘됨!!


7. flannel subnet.env 생성 실패 (feat. CrashLoopBackOff 에러)
- 한 노드에만 subnet.env는 CNI 초기 파일인데 불러올 수가 없다는 에러
- 이로 인해 CNI 초기화 불가
Failed to setup network for sandbox:
failed to load flannel 'subnet.env' file:
open /run/flannel/subnet.env: no such file or directory
- flannel은 정상 부팅하고 '/run/flannel/subnet.env'이란 파일을 생성함
- 확인해보니 br_netfilter 오류
- br_netfilter 오류 발생 ➡️ kubelet이 CNI 초기화를 실패하고 ➡️ subnet.env 생성 불가하고 ➡️ pod 생성 실패!!
- 이로 인해 CrashLoopBackOff도 발생함
- CrashLoopBackOff는 컨테이너가 시작되자마자 계속 죽어서, Kubernetes가 재시작을 반복하는 상태를 말한다

- 이걸 해결하는 방법은 두가지
1. br_netfilter 활성화 (CrashLoopBackOff가 발생하는 노드에서 활성화)
2. flannel 재설치 (/run/flannel/subnet.env가 제대로 생성될 수 있도록)
- 우선 br_netfilter 활성화 명령어
sudo modprobe br_netfilter
echo "br_netfilter" | sudo tee /etc/modules-load.d/br_netfilter.conf
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1
- flannel 전체 재설치를 위해 메인 노드에서 실행
kubectl delete -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
8. 노드 NotReady 해결방법
- 간혹 아래 사진처럼 노드가 NotReady가 뜰 때가 있었다

- 나 같은 경우엔 CNI 바이너리 설치가 누락되어서 그랬었음
- 쉽게 말해 K8s 네트워크에 필요한 파일을 못찾아서 그런 것임
- 그래서 노드로 쓸 준비가 안됐다고 표기하는 것
- 일단 직접 설치해줬다
ARCH=$(uname -m); case $ARCH in armv7*) ARCH="arm";; aarch64) ARCH="arm64";; x86_64) ARCH="amd64";; esac
sudo mkdir -p /opt/cni/bin
curl -O -L https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-$ARCH-v1.5.1.tgz
sudo tar -C /opt/cni/bin -xzf cni-plugins-linux-$ARCH-v1.5.1.tgz
sudo systemctl restart kubelet
- 그랬더니 잘 해결된 것을 볼 수 있었음

9. Flannel 설정에 CNI 이름 하드코딩 하면 안됨
- Flannel 설정할 때 CNI 이름을 하드코딩해서 줬었다 (왜그랬지...?)
- 아무튼 이렇게 하면 에러가 날 수 있다
- 노드(서버)마다 네트워크 인터페이스의 이름이 다를 수 있기 때문이다
- 내가 그런 케이스였고, 곧바로 에러 터졌음

- 아래 두 개 파일에서 모두 'enp4s0' 찾아서 지워준다
kubectl edit ds kube-flannel-ds -n kube-flannel
sudo vim kube-flannel.yml

10. 이미지 다 띄우고도 메인 노드랑 통신이 안되는 이슈
- UFW가 트래픽을 막아서 생긴 이슈였다
- ping 테스트는 되고 파드끼리 통신은 안되길래 이것저것 다 테스트하다 겨우 찾음
- UFW는 기본적으로 '서버로 직접 들어오는 요청만 허용'하고, '서버 안에서 다른 곳으로 전달되는 패킷'은 막아버리기 때문이었음
- 이제 트래픽을 허용해보자
- 아래 과정은 메인노드에서 진행한다
1) UFW가 Docker/Nerdctl 트래픽을 막지 않게 설정
- 아래 명령어 입력 후
sudo nano /etc/default/ufw
- 아래 옵션을 찾아서 ACCEPT로 변경한다
- DEFAULT_FORWARD_POLICY="DROP"
+ DEFAULT_FORWARD_POLICY="ACCEPT"
- 이렇게되면 내부 네트워크(e.g. cni0, docker0)와 외부 인터페이스(eth0) 간 패킷 이동 가능
- 모든 인터페이스 간의 패킷 포워딩이 허용

2) Docker/Nerdctl 관련 NAT 허용 룰 추가
sudo ufw allow in on cni0
sudo ufw allow in on docker0
sudo ufw allow out on docker0
sudo ufw allow out on cni0
sudo ufw reload
- 추가된 모습
- 참고로 인터페이스 명은 환경마다 다 다를 수 있다

3) UFW 재시작
sudo ufw disable
sudo ufw enable
sudo systemctl restart ufw
sudo systemctl restart containerd
sudo nerdctl restart registry
4) 테스트
- 다른 노드에서 메인 노드로 테스트
curl http://192.168.0.201:5001/v2/_catalog
- 응답 잘 왔다 (repositories 부분)
toy@toy-500A2M:~$ curl http://192.168.0.201:5001/v2/_catalog
{"repositories":[]}'Infra > DevOps' 카테고리의 다른 글
| Flannel이란? (feat. 쿠버네티스, Kubernetes, K8s) (2) | 2025.12.07 |
|---|---|
| 쿠버네티스(Kubernetes, K8s) 실험과 배운 것들에 대한 회고록 (0) | 2025.12.06 |
| 홈서버 4대로 쿠버네티스(Kubernetes, K8s) 구축하기 (0) | 2025.12.01 |
| Prometheus, Out of Bound 해결방법 (feat. 서버 시간 통일 & TSDB 초기화) (0) | 2025.11.28 |
| Fail2Ban, 다시 iptables-nft 체제로 전환하기 (feat. 최최최종ver) (0) | 2025.11.24 |
