기존에 라즈베리파이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 쿠버네티스 워커노드 만들기
그래서 성공한 명령어를 다시 나열해 봅니다.
아래 명령은 모두 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에서 모니터링도 수정해야 겠습니다.
'Raspberry pi' 카테고리의 다른 글
[삽질의 추억] K8s ingress-nginx를 설치했는데 controller가 떠있는 노드에서만 접근이 된다면... (1) | 2023.10.22 |
---|---|
라즈베리파이 쿠버네티스에 Prometheus + Grafana 올리기 (0) | 2022.08.25 |
라즈베리파이 2대 쿠버네티스 클러스터링 구성 완료 (0) | 2022.08.17 |
라즈베리파이2 쿠버네티스 워커노드 만들기 (0) | 2022.08.15 |
퍼시스턴스 볼륨을 사용하면 기존 파일이 사라지는 문제 해결 (0) | 2022.08.11 |