kubespray 설치 삽질 (Raspberry Pi 4, Ubuntu22.04)

김건우·2025년 4월 12일

[TIL]

목록 보기
25/25

오늘 라즈베리파이 3대가 다 설치되어서 쿠버네티스 클러스터를 한 번 구축해보려다가 kubespray 설치하는데만 몇 시간을 쓴지 모르겠다..

24단계 실습으로 정복하는 쿠버네티스 책을 기반으로 따라하고 있었는데, 아무래도 나온지 조금 된 2022년 책이다 보니 옛날 버전을 사용하기도하기에 안되는 부분이 몇가지 존재했다.
그 얘기를 풀어보려고 한다.

호스트 설정, ssh-keygen 을 통한 암호 입력 없는 ssh 연결 설정, visudo 를 통한 비번 없이 sudo 사용 설정, swap/방화벽 해제 같은 설치에 앞선 기본 설정들은 생략하도록 하겠다.

우선 나는 kubespray-2.25.1 버전을 사용했다!

1. Ubuntu22.04 버전 문제

이건 공식 github의 이슈에서도 제기된 문제였다.

문제는 Ubuntu 22.04 버전에서는 커널이 경량화되어 있어서 dummy 모듈이 빠져 있어서 클러스터 생성 작업 중에 dummy 모듈을 사용하는 곳에서 문제가 생기는 것이다.

해결 방안을 제시해주는데, dummy 모듈을 설치하거나, enable_nodelocaldnsfalse 로 설정하라고 한다.

nano inventory/k8scluster/group_vars/k8s_cluster/k8s-cluster.yml
해당 명령어를 통해 들어가서 수정해주면 된다. vi 를 써도 되지만, 나는 nano가 편해서 사용했다.

2. 문제가 생기면 reset

이게 근본적인 문제였다.
이때까지 설치시에 문제가 생기면 바로 재설치를 했는데, 해결하면 새로운 문제가 계속 나왔다..
이 때문에 git checkout 으로 버전도 바꿔가면서 다 시도해봤지만 문제가 문제를 낳을 뿐이였다.

결국 해결책은 문제가 한번이라도 생기면 reset을 통해 초기화를 해주고 다시 시도해야 한다.

ansible-playbook -v -i inventory/k8s_cluster/inventory.ini --become --become-user=root cluster.yml

위 명령어가 클러스터를 설치하는 명령어인데, ansible 기반으로 동작한다.
그렇기에 핵심인 cluster.yml 라는 playbook 을 실행하는데, inventory.ini 에 저장된 정보를 바탕으로 root 계정으로 실행하는 것이다.

inventory.ini

[all]
ubun22-01 ansible_host=192.168.x.1 ansible_user=kimgunwoo
ubun22-02 ansible_host=192.168.x.2 ansible_user=kimgunwoo2
ubun22-03 ansible_host=192.168.x.3 ansible_user=kimgunwoo3

[kube_control_plane]
ubun22-01

[etcd]
ubun22-01

[kube_node]
ubun22-02
ubun22-03

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node

이런식으로 구성되어있는데, 공유기 안에 내부 private ip 기에 192.168로 시작한다.
ansible_user 옵션을 통해 각 host 별 접속할 사용자를 정할 수도 있다.

설치만을 위해 간단하게 구현한 것이라 참고만 하면 될 것 같다.

여튼, 결론은
문제가 생기면 제거하고, 다시 설치하자.
ansible-playbook -v -i inventory/k8s_cluster/inventory.ini --become --become-user=root reset.yml

이처럼 reset.yml 이라는 playbook 파일을 제공하고 있기에 이를 통해 제거하고, 설치하면 웬만한 문제는 해결되는 것 같다.
물론 이 또한 시간이 꽤 걸린다.

3. kubectl 문제

worker 노드에서 calico 설정 중에 문제가 발생했다.

각 노드에서 sudo systemctl status kubelet 로 확인해봤을 땐 모두 정상 작동 중이였는데,
마스터 노드에서 kubectl cluster-info 같은 것으로 확인하려고 했을 때

이런 문제가 발생했다.

다행히 같은 문제를 겪은 사례를 찾아서 해결할 수 있었다.

확인해보니 역시 설정 정보가 비어있었고

해당 글을 참고해서 해결할 수 있었다.

4. resolv.conf가 Ansible이 DNS 설정을 시도한 직후 다시 덮어써진 문제

worker node 에 해당하는 ubun22-02, ubun22-03 노드들에 대해서 DNS 를 인식하지 못하는 문제를 발견했다.

이 또한 비슷한 문제를 겪는 을 발견해서 해결했다.

sudo rm /etc/resolv.conf
sudo touch /etc/resolv.conf
sudo nano /etc/resolv.conf

작성 >> nameserver 1.1.1.1
sudo systemctl restart systemd-resolved.service

다음과 같은 과정을 통해 nameserver 를 등록하고, 시스템을 재시작 해주면 된다.

5. Calico 문제

해당 글 에서도 보면 라즈베리파이 4 기준으로 쿠버네티스 클러스터를 설치하려고 했는데, 네트워크 플러그인에서 Calico 를 사용했을 때 파드가 정상적으로 뜨지 않았다고 한다.

댓글에서 해결책을 발견했는데, 나 같은 경우에는 이렇게해도 해결이 되지 않았다.
그래서 네트워크 플러그인을 flannel 을 사용해서 구성했다.
ARM 환경(라즈베리파이 등) 에선 Calico, 특히 v3.27 이상 버전이 다음 문제를 자주 일으키기에 flannel을 사용하는게 마음 편하다.

이런 차이가 존재한다고 한다.

nano inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml 를 통해서 network_plugin 설정을 flannel 로 바꿔주면 쉽게 해결 가능하다.

6. CoreDNS 실패

[FATAL] plugin/loop: Loop (10.233.64.1:47674 -> :53) detected for zone "."

DNS 루프가 감지되어 CoreDNS가 죽어버린 상황이 발생했다.

DNS 루프는?? CoreDNS가 DNS 요청을 다른 서버로 포워딩했는데, 그 DNS 서버가 다시 CoreDNS에게 요청을 보내면서 무한 루프가 발생하는 상황

해결 방안은 CoreDNS의 ConfigMap에 forward 플러그인이 잘못 설정 되었기에 재설정 해주면된다.

kubectl -n kube-system edit configmap coredns 를 통해서 vi 기반 수정이 가능하다.

data:
  Corefile: |
    .:53 {
        errors {
        }
        health {
            lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 8.8.8.8 1.1.1.1

        cache 30

        loop
        reload
        loadbalance
    }

기존

forward . /etc/resolv.conf {
  prefer_udp
  max_concurrent 1000
}

부분을 forward . 8.8.8.8 1.1.1.1 으로 설정해주고,
kubectl -n kube-system delete pod -l k8s-app=kube-dns 를 통해서 삭제해주면 자동으로 재시작 된다.

7. 워커 노드를 클러스터에 수동 조인

이렇게 설정하면 이제 워커 노드를 클러스터에 수동으로 조인해줄 수 있다.

마스터노드에서
kubeadm token create --print-join-command
를 통해서 token 값과 sha256 해시값을 구해볼 수 있다.

그리고 각 워커 노드에 접속해서
sudo kubeadm reset -f
sudo kubeadm join 192.168.219.108:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
를 통해서 수동으로 클러스터에 조인해줄 수 있다.

그렇게 한 후, kubectl get nodes -o wide 를 사용해서 확인해보면..
드디어 클러스터 구축에 성공했다..!!


라즈베리파이 4B 기준으로 30분 가까이 걸리는 것 같다.
근데, 다른 블로그를 보면 딸깍으로 설치가 가능한 것 같은데, 왜 나만 이렇게 쉽지 않았던 건지 모르겠다.

라즈베리 파이라는 ARM 환경과 부족한 코어, 메모리가 원인이였을까?
여튼 kubespray 를 통해서 수동에 가까운 구축에 성공했다.

profile
공부 정리용

0개의 댓글