Raspberry pi

쿠버네티스 클러스터에 라즈베리파이3 워커노드 추가

[혜안] 2022. 12. 27. 23:27
728x90

기존에 라즈베리파이4에 쿠버네티스 컨트롤플레인을 설치하고 라즈베리파이2를 워커노드로 조인해서 사용 중이었습니다.

그런데 아무래도 라즈베리파이2의 성능이 쳐지다 보니 CPU 부하도 꽤 먹고,

뭔가 버벅거리는 느낌적인 느낌을 지울 수 없었는데요.

NAMESPACE       NAME                                    STATUS	NODE
default	        coin-gather-55d49bdb8-6c52k             Running	raspberrypi2
default	        coin-trader-85f974d495-6758f            Running	raspberrypi2
default	        fan-controller-hf6wc                    Running	raspberrypi2
default	        home-server-654446f6d5-nds6w            Running	raspberrypi2
default	        plug-controller-6764f8c8b4-db7wb        Running	raspberrypi2
default	        wol-597cd6f6b7-c94rk                    Running	raspberrypi2
kube-flannel    kube-flannel-ds-j9fvr                   Running	raspberrypi2
kube-system     kube-proxy-4nmpl                        Running	raspberrypi2
logging	        loki-promtail-qllgk                     Running	raspberrypi2
monitoring      node-exporter-zq4bz                     Running	raspberrypi2
default	        fan-controller-wdvzx                    Running	raspberrypi4
default	        mariadb-custom-5dbf65bc5b-65bhz	        Running	raspberrypi4
kube-flannel    kube-flannel-ds-gqf77                   Running	raspberrypi4
kube-system     coredns-6d4b75cb6d-crtj6                Running	raspberrypi4
kube-system     coredns-6d4b75cb6d-xxdj4                Running	raspberrypi4
kube-system     etcd-raspberrypi4                       Running	raspberrypi4
kube-system     kube-apiserver-raspberrypi4             Running	raspberrypi4
kube-system     kube-controller-manager-raspberrypi4    Running	raspberrypi4
kube-system     kube-proxy-5c4wh             	        Running	raspberrypi4
kube-system     kube-scheduler-raspberrypi4             Running	raspberrypi4
logging	        loki-0                                  Running	raspberrypi4
logging	        loki-promtail-br68d                     Running	raspberrypi4
monitoring      grafana-7cf86c94b8-dh4k5                Running	raspberrypi4
monitoring      node-exporter-mmf7j                     Running	raspberrypi4
monitoring      prometheus-deployment-5fd9cb6949-4vc49  Running	raspberrypi4

성능도 낮은데 pod 들도 꽤 배치되어서 실행 중입니다.

아마도 쿠버네티스가 CPU 성능까지 감안해서 pod를 분배하는건 아닌가 봅니다.

 

그리고 노드를 조회하면

$ k get node
NAME           STATUS     ROLES           AGE    VERSION
raspberrypi2   Ready      <none>          133d   v1.24.3
raspberrypi4   Ready      control-plane   145d   v1.24.3

뭔가 raspberrypi2 와 4 사이에 3을 끼워넣고 싶다는 생각이 자꾸 듭니다.

이건 결벽은 아닌것 같고... 뭐랄까...

 

암튼 그래서 라즈베리파이3을 중고나라에서 한대 업어 왔습니다.

그리고 워커노드 조인 작업 시작.

 

이미 라즈베리파이2 워커노드 조인은 해봤지만, 시간이 좀 지난 뒤에 그대로 하니 또 안됩니다.

2022.08.15 - [Raspberry pi] - 라즈베리파이2 쿠버네티스 워커노드 만들기

 

라즈베리파이2 쿠버네티스 워커노드 만들기

새로 장만한 라즈베리파이4에 쿠버네티스 컨트롤플레인 설치를 완료했습니다. 2022.08.03 - [Raspberry pi] - 라즈베리파이4 쿠버네티스 설치 라즈베리파이4 쿠버네티스 설치 라즈베리파이4에 라즈비안

viewise.tistory.com

 

그래서 성공한 명령어를 다시 나열해 봅니다.

 

아래 명령은 모두 root 로 작업합니다.

$ apt-get update & apt-get upgrade
$ swapoff -a
$ systemctl disable dphys-swapfile.service
$ reboot now

$ apt install containerd
$ sed -i '$ s/$/ cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1 systemd.unified_cgroup_hierarchy=0/' /boot/cmdline.txt

$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

$ sysctl --system

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

 

그리고 다음 스텝인 kubelet lubeadm lubectl 설치는 버전을 지정해줘야 합니다.

라즈베리파이4에 컨트롤플레인을 설치한 시점의 버전과 동일하게, 워커노드도 버전을 맞춰줘야 노드 조인이 됩니다.

먼저 컨트롤 플레인에서 현재 버전을 확인 후,

$ k get node
NAME           STATUS   ROLES           AGE    VERSION
raspberrypi2   Ready    <none>          133d   v1.24.3
raspberrypi4   Ready    control-plane   145d   v1.24.3

버전을 지정하여 설치를 진행합니다.

$ apt update & apt install kubelet=1.24.3-00 kubeadm=1.24.3-00 kubectl=1.24.3-00

설치후에는 버전을 고정하구요.

$ apt-mark hold kubelet kubeadm kubectl

 

설치가 완료되면 노드 조인을 위해 컨트롤플레인에서 키 발급을 해줍니다.

컨트롤플레인 작업

$ kubeadm token create
[토큰값 출력]

$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
[해시값 출력]

위에서 출력된 토큰값과 해시값을 아래 명령어에 넣어서 조인을 시도합니다.

워커노드 작업 (root)

$ kubeadm join [컨트롤플레인 IP]:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값]

 

아래와 같이 출력되면 정상인데요.

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

 

저는 에러메시지가 발생했습니다.

error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
        [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1

 

구글링하여 아래와 같이 해결합니다.

$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ modprobe br_netfilter
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

 

조인에 성공하고 컨트롤플레인에서 노드를 조회해봅니다.

$ k get node
NAME           STATUS     ROLES           AGE    VERSION
raspberrypi2   Ready      <none>          133d   v1.24.3
raspberrypi3   NotReady   <none>          7s     v1.24.3
raspberrypi4   Ready      control-plane   145d   v1.24.3

라즈베리파이2,3,4가 나란히 나오는게 보기 좋네요.

그런데 새로 추가한 3번이 NotReady 상태입니다.

예전에 컨트롤플레인에서 flannel 설치가 안되서 이런적이 있었는데, 워커노드에서는 왜 이럴까 싶은데요.

$ k get node -w
NAME           STATUS     ROLES           AGE    VERSION
raspberrypi2   Ready      <none>          133d   v1.24.3
raspberrypi3   NotReady   <none>          27s    v1.24.3
raspberrypi4   Ready      control-plane   145d   v1.24.3
raspberrypi3   NotReady   <none>          52s    v1.24.3
raspberrypi3   NotReady   <none>          2m23s   v1.24.3
raspberrypi4   Ready      control-plane   145d    v1.24.3
raspberrypi2   Ready      <none>          133d    v1.24.3
raspberrypi3   NotReady   <none>          4m27s   v1.24.3
raspberrypi3   NotReady   <none>          6m19s   v1.24.3
raspberrypi3   Ready      <none>          7m21s   v1.24.3

시간이 지나니 해결되네요.

pod들이 기동되느라 시간이 좀 걸린 모양입니다.

.

.

.

.

그런데 시간이 지나도 기동되지 않는 pod가 있네요.

 k get pod
NAME                               READY   STATUS              RESTARTS        AGE
coin-gather-55d49bdb8-6c52k        1/1     Running             6 (2d17h ago)   121d
coin-trader-85f974d495-6758f       1/1     Running             1 (2d17h ago)   13d
fan-controller-hf6wc               1/1     Running             0               2d16h
fan-controller-nbvk4               0/1     ContainerCreating   0               93m
loki-promtail-kdzmn                0/1     ContainerCreating   0               96m

데몬이라 모든 노드에서 실행되어야 하는 pod 입니다.

 

description을 보니 문제가 아직 있나 봅니다.

Events:
  Type     Reason                  Age                    From               Message
  ----     ------                  ----                   ----               -------
  Normal   Scheduled               29m                    default-scheduler  Successfully assigned default/fan-controller-nbvk4 to raspberrypi3
  Warning  FailedCreatePodSandBox  29m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "a203e9bd12f897f9e4fddcccf25e12e1e8d9d12577c47110fc55f35798461005": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  29m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "3ce6df4dcef9dc5430ff45f33779ee3b101f06859a0c0ff3ac0fb307cdb80291": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  28m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "f4b143f4e2a0039e9492470961eee9d387c6a95eecb8f3dd34dbe81ef2b3bef9": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  28m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "3c1268ef368de281619516f73b11700ddaa69d83d57c9ca977b1ae8cde880f9e": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  28m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "591e4b0a3fb4d8de4044e3a7365d6793f6b4c833f556dcb8e4da079afe15d6da": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  28m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "2f6af579e515b37d04345c4e945e8c8d364ba15b9785a17fd39f03585a423db9": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  28m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "65a9cde2a2144143dfb0864e011b395adec4e5716de2028117a79f507f80e968": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  27m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "7c7907b6e938c9e840fceeab8b60f95128c1770dc7f9b475907ad4acdd65462f": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  27m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "6fbcb62a728c283d9bf97e38c083349a57fede962305fda33cc91a07a9c11468": failed to find plugin "loopback" in path [/usr/lib/cni]
  Warning  FailedCreatePodSandBox  4m17s (x107 over 27m)  kubelet            (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "60ec5cfb4edff6c954bef9d4d2c39d7246bd7578bbfd5cddd2291cec1bd9e6ee": failed to find plugin "loopback" in path [/usr/lib/cni]

/usr/lib/cni 를 못찾는 문제면, 좀 익숙한데요.

$ cat /etc/containerd/config.toml
version = 2

[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".cni]
      bin_dir = "/usr/lib/cni"
      conf_dir = "/etc/cni/net.d"
  [plugins."io.containerd.internal.v1.opt"]
    path = "/var/lib/containerd/opt"

cni bin 디렉토리가 /usr/lib/cni 로 되어 있는데, 실제 cni는 저 경로에 없습니다.

$ ls /opt/cni/bin
bandwidth  bridge  dhcp  firewall  flannel  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tuning  vlan

여기에 flannel이 설치되어 있으니, 바꿔줘야 합니다.

그리고 private repo를 사용하니 registry 정보도 추가해줍니다.

$ vi /etc/containerd/config.toml
version = 2

[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".cni]
      bin_dir = "/opt/cni/bin"
      conf_dir = "/etc/cni/net.d"
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."private.repo:8099"]
          endpoint = ["http://private.repo:8099"]
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."private.repo:8099".tls]
            insecure_skip_verify = true
        [plugins."io.containerd.grpc.v1.cri".registry.auths."private.repo:8099"]
          username = "xxxxxx"
          password = "xxxxxx"
  [plugins."io.containerd.internal.v1.opt"]
    path = "/var/lib/containerd/opt"

추가로,

private.repo가 어느 서버인지 host 정보도 넣어줍니다.

$ vi /etc/hosts
192.168.0.28    private.repo

 

그리고 containerd를 재기동 합니다.

systemctl restart containerd.service

문제가 있는 pod를 강제 종료하고

k delete pod fan-controller-nbvk4 --force

기다립니다.

.

.

.

.

$ k get pod
NAME                               READY   STATUS    RESTARTS        AGE
coin-gather-55d49bdb8-6c52k        1/1     Running   6 (2d23h ago)   121d
coin-trader-85f974d495-6758f       1/1     Running   1 (2d23h ago)   13d
fan-controller-dpjqr               1/1     Running   4               5h41m
fan-controller-hf6wc               1/1     Running   0               2d22h
fan-controller-wdvzx               1/1     Running   7 (2d22h ago)   122d
home-server-654446f6d5-nds6w       1/1     Running   1 (2d23h ago)   84d
mariadb-custom-5dbf65bc5b-65bhz    1/1     Running   7 (2d22h ago)   131d
plug-controller-6764f8c8b4-db7wb   1/1     Running   6 (2d23h ago)   131d
wol-597cd6f6b7-c94rk               1/1     Running   7 (2d23h ago)   126d

정상적으로 올라왔네요.

grafana에서 모니터링도 수정해야 겠습니다.

728x90