잡다한 IT 지식

Kubernetes The connection to the server [IP] was refused 트러블슈팅 본문

Kubernetes/트러블슈팅

Kubernetes The connection to the server [IP] was refused 트러블슈팅

가나무마 2025. 7. 18. 03:16

kube-apiserver에 접근이 안되는 문제가 발생해서 트러블 슈팅을 기록으로 남긴다.

err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s"

error 상황

문제 상황: kubectl 명령어 실행 시에 localhost:8080과 연결 불가

원인: ~/.kube/config 파일 존재하지 않거나 빈 값(kubectl config view를 통해 설정값 확인 가능)

해결 방법: /etc/kubernetes/admin.conf 파일을 ~/.kube/config로 복사

 

원인 설명

기본적으로 kubectl 명령어는 ~/.kube/config 파일을 설정 값으로 사용한다.

~/.kube/config 파일엔 kube-apiserver의 엔드포인트나 클러스터 접근을 위한 인증서 등 클러스터 사용을 위한 정보가 들어있다.

그런데 만약, ~/.kube/config 파일이 없다면 kubectl 명령어는 기본 경로를 사용한다.

이 때, 사용되는 기본 경로가 localhost:8080이다. 이는 kubernetes 깃허브 소스 코드에서 직접 확인 가능하다.

 

client-go/tools/clientcmd/client_config.go at a21e7a8bf0d6c98bb9652fb45e48cb8de15392b4 · kubernetes/client-go

Go client for Kubernetes. Contribute to kubernetes/client-go development by creating an account on GitHub.

github.com

환경변수가 없으면 localhost:8080을 기본 서버 주소로 반환한다.

 


err="couldn't get current server API group list: Get \"https://cp.cluster.local:6443/api?timeout=32s\": dial tcp 192.168.56.10:6443: connect: connection refused"

문제 상황: kubectl 명령어 실행 시에 kube-apiserver와 연결 불가

원인: 위 오류를 유발하는 원인은 굉장히 많다.(DNS lookup실패, iptables Deny, 인증서 문제 등) 이번 경우엔 kubelet 설정값 문제였다.

해결 방법: kubelet conf값 수정

트러블슈팅: 

1. kube-apiserver 실행 여부 확인

kube-apiserver 실행 여부 확인

현재 실행 중인 컨테이너를 확인해봤다. kube-apiserver가 존재하지 않는다.

 

2. /etc/kubernetes/manifests 확인

kubelet은 kube-apiserver와 통신할 필요 없이 kubelet이 직접 실행하는 pod들이 존재한다. 이를 static pod(정적 파드)라고 한다.

static pod는 kubelet이 알아서 실행하므로 따로 명령어를 실행하거나 할 필요가 없다.

그런데, static pod가 실행되지 않았으므로 해당 경로에 제대로 yaml 파일들이 존재하는지 확인해보겠다.

파일들은 설정되어 있다. 그런데, 컨테이너를 생성하진 않는다.

static pod를 위한 yaml파일들이 설정된 상태지만 어째서인지 컨테이너들이 실행되지 않는다.

이제 그러면 컨테이너 실행의 주체인 kubelet의 상태를 확인할 필요가 있다.

 

3. kubelet 실행 여부 확인

static pod가 설정되어 있더라도 해당 yaml을 컨테이너로 만드는 건 kubelet의 역할이다.

kubelet이 일을 안하고 있을 확률이 높다. systemctl 커맨드로 상태를 확인해보자.

kubelet은 잘 실행 중이다.

kubelet은 잘 실행 중이다. 잘 실행 중이므로 이제 로그를 직접 확인하는 방법만 남았다.

 

4. journalctl로 kubelet 로그 확인

journalctl을 통해 kubelet의 로그를 추적

해당 로그를 보면 static pod의 경로가 /etc/kubernetes/manisfests가 아닌 /etc/kubernetes/manisfests2를 사용함을 알 수 있다.

즉, kubelet의 설정 값이 잘못됐다.

 

5. kubelet 설정 파일 찾기

다시 한 번 systemctl status kubelet을 통해서 kubelet이 어떤 설정 파일을 사용하는지 확인하겠다.

kubelet 실행에 쓰이는 설정 파일들이 나열된다.

6. 설정값 확인

잘못된 설정 값 발견

/etc/kubernetes/manifests가 아닌 /etc/kubernetes/manifests2로 설정되어 있다.

수정하고 kubelet을 재시작하자.

 

7. 재시작 후 컨테이너 실행 결과 확인

컨테이너가 제대로 실행된다.

 

8. kubectl 명령 실행

kubectl 명령어 실행

kubectl 명령어가 잘 실행된다. 현재 worker 노드가 없어 taint로 인해 nginx가 스케쥴링 되진 않는다.