K8s Cluster에 kubectl 안될 때 - The connection to the server <host>:6443 was refused - did you specify the right host or port?

자꾸 쿠버네티스 클러스터를 구축한 후 이런 오류가 발생했다.

팀원이 구성된 클러스터를 같이 수정하게 되면서 설정 값이 바뀌어서 kubectl 명령어가 잡히지 않게 된 것 같은데, 본인의 해결방법은 다음과 같았다.

1. Swap 메모리 사용 종료
2. docker daemon 설정 변경

0. K8s Cluster 구성 방식

최신 버전의 쿠버네티스는 Docker와 전혀 상관이 없는 상황이지만, 기존에 익숙한 docker 명령어를 함께 사용하여 파드를 생성하고 싶었기 때문에 CRI로써 Docker Engine을 사용하고 이를 지원하는 버전을 사용했다.

아래의 설정을 모든 노드에서 구성해야지 정상적으로 동작된다!

 

추가적으로 Cluster 구성은 kubeadm의 도움을 받아 간편하게 Worker Node들을 클러스터에 Join 시켰다.

 

상세한 kubelet & kubeadm & kubectl의 버전은 아래와 같다. - Docker는 최신버전

kubelet=1.22.6-00 kubeadm=1.22.6-00 kubectl=1.22.6-00

1. Swap 메모리 사용 중지 &영구 중지

첫 번째 이유는 Swap 메모리 때문이다.

Linux 위에서 작업을 하거나 가상 머신 위에 Linux를 사용하게 되면, 일반적으로 CPU는 여러 사용자가 동시간대에 나누어서 처리가 가능하다.

하지만, RAM은 기본적으로 연산자가 아니기 때문에 매우 짧은 단위로 나누어 사용하는 구성요소가 아니다.

 

따라서, 여러 노드들이 가상 메모리 옵션을 사용하게 된다면 특정 노드가 부하 상태일 때 또 다른 노드의 Ram 조금 더 가져와서 사용하게 된다.

 

이렇게 된다면 기존에 존재하는 파드들에 영향을 미칠 수 있기 때문에 좋은 상황이라고 볼 수 없고, 안정적인 운영에 제약을 가져다 준다고 생각한다.  

 

이를 일시적으로 중지하는 방법은 아래와 같고, 영구적으로 중지시키기 위해선 /etc/fstab의 내용을 수정해야한다.

sudo swapoff -a # 일시적 비활성화

vi /etc/fstabl # 영구 비활성화
#/swapfile~~~~                                 none

 

2. /etc/docker/daemon.json 수정

기본적으로 Docker.engine이 사용하는 자원을 할당받아 사용하는 드라이버(cgroupdriver)가 K8s이 사용하는 드라이버와 다르다.

이를 Linux 자체에서 사용하는 systemcd로 지정하여 docker와 K8s을 사용할 수 있게 맞추어주어야한다.

 

본인은 사설 Docker Image Registry을 사용하면서 협업의 과정에서 /etc/docker/daemon.json 구성을 다른 팀원이 지워버려, 이 때문에 위와 같은 오류가 발생했다. 찾는데 좀 걸렸다 ㅎㅎ

 

docker가 동작하고 있다면 /etc/docker/daemon.json 파일을 생성하여 아래와 같이 내용을 추가하면 된다.

최초에는 해당 파일이 존재하지 않을 것이다.

vi /etc/docker/daemon.json 에 아래 내용 추가한 뒤, 도커 재실행(systemctl restart docker)

{
        "exec-opts": ["native.cgroupdriver=systemd"]
}

레지스트리 인증 생략 & docker cgroupdriver 변경

현재는 Docker Harbor를 사용하기 때문에 인증서 발급 과정을 생략하기 위해, 각 노드에서 해당 레지스트리에 인증 과정을 생략하는 설정을 추가했다.

728x90
반응형