部署环境
$ hostnamectl
Icon name: computer
Operating System: Kylin Linux Advanced Server V10 (Tercel)
Kernel: Linux 4.19.90-17.5.ky10.aarch64
Architecture: arm64
$ rke version
INFO[0000] Running RKE version: v1.3.12
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.16", GitCommit:"e37e4ab4cc8dcda84f1344dda47a97bb1927d074", GitTreeState:"clean", BuildDate:"2021-10-27T16:20:18Z", GoVersion:"go1.15.15", Compiler:"gc", Platform:"linux/arm64"}
问题描述
-
rke up执行异常中断

-
192.168.0.42是唯一的worker

- 查看已加入集群的状态
kubectl describe node 192.168.0.140
rke还未执行到部署网络插件部分 异常中断,kubelet因插件缺失初始化失败,不能上报Node Ready信息


排查过程
- 查看worker节点的
kubelet日志
kubelet无法访问api-server以获取本节点信息

- 查看
kube-proxy日志
kube-proxy同样无法访问api-server以获取本节点信息


- 监听6443端口进程
在master节点根据端口查找进程,发现6443对应kube-apiserver,但是在worker节点6443端口并未被占用

- 对比正常的worker节点
对比分析x86_64环境正常运行的k8s集群的worker节点,发现监听6443的是个代理转发-Nginx进程,最终发现此进程是rke创建的nginx-proxy 容器启动的,容器镜像是rancher/rke-tools。




- 追踪nginx-proxy启动失败原因
搜索rke-tools代码库源码发现代理转发进程由的启动程序是/usr/bin/nginx-proxy
https://github.com/rancher/rke-tools/tree/v0.1.78

创建临时容器,直接尝试启动/usr/bin/nginx-proxy ,出现强力线索:二进制可执行文件confd格式错误,最终发现该二进制文件针对32位机器编译,无法在ARM64机器上运行


- rke-tools镜像中
confd平台不匹配原因
https://github.com/rancher/confd
https://github.com/rancher/confd/releases
翻看confd代码库,发现一个针对同样问题的PRFix building arm64 confd binary by orangedeng · Pull Request #8 · rancher/confd,确定代码库发布的针对arm64平台的编译产物其实是针对32位平台的。


解决方案
自编译可执行文件,替换镜像中的错误文件
- 编译confd-0.16.1-linux-arm64
git clone https://github.com/rancher/confd.git
cd confd/
git checkout -b v0.16.4 v0.16.4
make release
- 重建镜像替换confd
FROM rancher/rke-tools:v0.1.78
COPY confd-0.16.1-linux-arm64 /usr/bin/confd
RUN chmod +x /usr/bin/confd
docker build -t rancher/rke-tools:v0.1.78-arm64 .
总结
rancher-rke部署架构中,worker节点的kubelet访问locahost的6443端口,通过nginx-proxy 这个代理转发服务与master节点的kube-apiserver通信。
因为confd平台不适配,导致worker节点的nginx-proxy 不能正常运行,kubelet无法与apiserver通信上报节点信息。这就是是rke up执行失败,报错Can't find node by name [192.168.0.42], error "192.168.0.42" not found. 的原因。
debug
docker logs kubelet &> kubelet.log
docker logs kube-proxy &> kube-proxy.log
sudo netstat -lntup | grep 6443
docker run --rm -it rancher/rke-tools:v0.1.78 -- bash
# ls /usr/bin/confd