쿠버네티스(Kubernetes, K8s) 구축 과정에 마주한 에러들

2025. 12. 3. 14:33·Infra/DevOps

내가 마주한 에러들

살려줘.. 쉽지 않아.. 삽질 오지게 해...

진짜 쿠버네티스 분산 처리보다 어려웠다

정확히는 챙겨야하는게 많았고 에러도 많았다

양이 방대해서 개념 정리도 필요했음


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

- 이러고 나니 인식 잘됨!!

모두 Running 잘 뜸!


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

- 그랬더니 잘 해결된 것을 볼 수 있었음

Ready로 잘 돌아왔다!


9. Flannel 설정에 CNI 이름 하드코딩 하면 안됨

- Flannel 설정할 때 CNI 이름을 하드코딩해서 줬었다 (왜그랬지...?)

- 아무튼 이렇게 하면 에러가 날 수 있다

- 노드(서버)마다 네트워크 인터페이스의 이름이 다를 수 있기 때문이다

- 내가 그런 케이스였고, 곧바로 에러 터졌음

enp4s0? 그런 네트워크 인터페이스 없습니다만?

- 아래 두 개 파일에서 모두 '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) 간 패킷 이동 가능

- 모든 인터페이스 간의 패킷 포워딩이 허용

Drop이던 것을 Accept로 변경


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
'Infra/DevOps' 카테고리의 다른 글
  • Flannel이란? (feat. 쿠버네티스, Kubernetes, K8s)
  • 쿠버네티스(Kubernetes, K8s) 실험과 배운 것들에 대한 회고록
  • 홈서버 4대로 쿠버네티스(Kubernetes, K8s) 구축하기
  • Prometheus, Out of Bound 해결방법 (feat. 서버 시간 통일 & TSDB 초기화)
Ratatou2
Ratatou2
온갖 정보들을 기록해두는 메모보드 블로그
  • Ratatou2
    nak-z
    · Ratatou2 ·
  • 전체
    오늘
    어제
  • 공지사항

    • 블로그 이전 진행 중 (24.11.25 ~)
    • 분류 전체보기 (303) N
      • OS (89) N
        • Linux (39)
        • Window (24)
        • Mac (21) N
        • Android (5)
      • Infra (83) N
        • DevOps (38) N
        • Docker (14)
        • Jenkins (9)
        • n8n (13)
        • Nextcloud (8)
        • Rasberry Pi (1)
      • Dev (17)
        • JAVA (7)
        • Python (1)
        • DB (3)
        • Vue (2)
        • AI (4)
        • Git (0)
      • Tools (10)
      • Study (69)
        • Algorithm (66)
        • CS (3)
      • Game (10)
        • Project Zomboid (9)
        • Don't Starve Together (1)
      • etc (24)
        • Temp (0)
      • 개발 외 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Ratatou2
쿠버네티스(Kubernetes, K8s) 구축 과정에 마주한 에러들
상단으로

티스토리툴바