Bootstrap

二进制部署高可用Kubernetes集群 (成功) 看报错

SUMMARY

参考网上的教程和网课,进行二进制高可用Kubernetes部署。并对整个过程和报错进行简单记录。

架构图

设备规划

序号名字功能VMNET 1备注 + 1备注 + 2备注 +3 备注 + 4备注 +5
0orgin界面192.168.164.10haproxykeepalived192.168.164.200
1reporsitory仓库192.168.164.16yum 仓库registoryhaproxykeepalived
2master01H-K8S-1192.168.164.11kube-apicontrollerscheduleretcd
3master02H-K8S-2192.168.164.12kube-apicontrollerscheduleretcd
4master03H-K8S-3192.168.164.13kube-apicontrollerscheduleretcd
5node04H-K8S-1192.168.164.14kube-proxykubeletdocker
6node05H-K8S-2192.168.164.15kube-proxykubeletdocker
7node07H-K8S-3192.168.164.17kube-proxykubeletdocker

软件版本

软件名称版本备注
CentOS76.3.3-1.el7.elrepo.x86_64
kubernetesv1.22.0非最新版本
etcdv3.4.13非最新版本
calicov3.19.4
corednsv1.8.4
containerd1.6.1
runc1.1.0

Ansible module summary

# 查看组件如何使用
ansible-doc <mode>

 在部署过程中,经常使用的ansible的重要组件或者模块

modeimport optiondescriptionremark
copysrc
dest
mode
复制文件到远程主机
unarchivesrc
dest
本地压缩包解压到远程主机
filepath
owner
mode
state
对远程文件的增删改
systemdenabled
daemon_reload
state
启动或者停止程序
shell 执行shell命令
stat debug when判断状态
scripts执行shell脚本
yumstate程序安装卸载

folders or directories summary

总结相关重要文件夹的功能和路径

文件夹描述可能存放的文件备注
/etc/etcdetcd主配置文件夹etcd.conf
/etc/etcd/ssletcd证书文件夹ca-key.pem
ca.pem
etcd-key.pem
etcd.pem
/var/lib/etcdetcd存放数据的文件夹
/etc/kubernetes/kubernetes主配置文件夹,
含有组件配置信息
kube-apiserver.conf
kube-controller-manager.conf
kube-controller-manager.kubeconfig
kubelet-bootstrap.kubeconfig
kubelet.json
kubelet.kubeconfig
kube-proxy.kubeconfig
kube-proxy.yaml
kube-scheduler.conf
kube-scheduler.kubeconfig
假如有必要,根据组件进行拆分,再创建一层文件夹
/etc/kubernetes/sslK8S证书文件夹admin-key.pem
admin.pem
ca-key.pem
ca.pem
kube-apiserver-key.pem
kube-apiserver.pem
kube-controller-manager-key.pem
kube-controller-manager.pem
kubelet-client-2023-05-19-08-17-28.pem
kubelet-client-current.pem -> /etc/kubernetes/ssl/kubelet-client-2023-05-19-08-17-28.pem
kubelet.crt
kubelet.key
kube-proxy-key.pem
kube-proxy.pem
kube-scheduler-key.pem
kube-scheduler.pem
假如有必要,根据组件进行拆分,再创建一层文件夹
/var/log/kubernetesk8s的日志存放路径相关文件在部署服务的时候需要提前创建好
/usr/lib/systemd/systemsystemd管理service文件夹需留意个组件启动文件的配置项目,参数不能缺少
/usr/local/binK8S + ETCD 各主要程序执行存放路径
/etc/containerdcontainerd的配置地址

常用命令

tail -20 /var/log/messages

cat /var/log/messages|grep kube-apiserver|grep -i error

systemctl status <service>.service -l

journalctl -xe


systemctl daemon-reload && systemctl start etcd.service --now  && systemctl status etcd

systemctl daemon-reload && systemctl restart etcd.service --now  && systemctl status etcd

systemctl daemon-reload && systemctl enable etcd.service --now  && systemctl status etcd

systemctl list-unit-files | grep kube- | awk '{print $1}' | xargs systemctl status

失败经历第一次

(48条消息) Kubernetes 二进制部署高可用集群 失败 看报错_HJJ-DREAMER的博客-CSDN博客

HAproxy + Keepalived (docker)

HAproxy

HAproxy success output

这个页面成功显示的前置条件是kube-controller-manager启动成功,否则无法显示,会报connection refuse的网页无法访问的错误。但后期二次复现报错并没有成功产生依赖关联。

第一次error: 监控页面无法显示,controller启动成功后,才成功访问。

后期二次复现,发现不存在该依赖关系:

keepalived

keepalived success output 

注意:

假如keepalived没办法成功启动,也就没办法提供虚拟IP,则进行kubectl二进制部署的时候会产生connection rejection 链接失败等错误。所以必须先有一台服务器可成功启动keepalived,成功提供虚拟IP,才可实现kubectl的部署。

后期所有二进制部署,只要涉及虚拟IP的前置都需要成功启动虚拟IP,从而方便部署测试。

error: 容器一直处于restart无法提供对外服务

 更换网上教程容器启动成功

如何使用第三方部署的官方容器

# 查看镜像信息
docker inspect 

测试高级进阶技能系列 - Docker - 随笔分类 - 小菠萝测试笔记 - 博客园 (cnblogs.com)

1、Docker学习大纲_哔哩哔哩_bilibili

H-ETCD-CLUSTER

error:--etcd-servers must be specified

 May 18 21:39:49 master01 kube-apiserver: Error: [--etcd-servers must be specified, service-account-issuer is a required flag, --service-account-signing-key-file and --service-account-issuer are required flags]

目前没有解决

test command

# 健康检测
ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table \
--cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--endpoints=https://192.168.164.11:2379,https://192.168.164.12:2379,https://192.168.164.13:2379 endpoint health

# 性能检测
ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table \
--cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--endpoints=https://192.168.164.11:2379,https://192.168.164.12:2379,https://192.168.164.13:2379 check perf
# 成员列表
ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table \
--cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--endpoints=https://192.168.164.11:2379,https://192.168.164.12:2379,https://192.168.164.13:2379 member list

# 成员分工
ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table \
--cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--endpoints=https://192.168.164.11:2379,https://192.168.164.12:2379,https://192.168.164.13:2379 endpoint status

success output

debug命令

tail -20 /var/log/messages

# cat /var/log/messages|grep kube-apiserver|grep -i error

H-KUBERNETES-CLUSTER

success output

最终输出的结果 

kube-apiserver

success output

error: issuer URL must use https scheme, got: api

kube-apiserver: E0518 22:47:16.373344    1747 instance.go:380] Could not construct prendpoints. Endpoints will not be enabled. Error: issuer URL must use https scheme, got: api

 解决方案Kubernetes-问题 - 麦恒 - 博客园 (cnblogs.com)

修改kube-apiserver.conf的配置文件,添加配置

--service-account-issuer=https://kubernetes.default.svc.cluster.local \

error:windows 复杂资料到 linux 虚拟机 产生变量缺失

 (48条消息) Kubernetes 二进制部署高可用集群 失败 看报错_HJJ-DREAMER的博客-CSDN博客

与以上失败所记录的内容不同,当时即使写了参数也没创建成功,所以,最终很可能是openssl创建的证书缺少参数导致创建失败。又或者相关的service文件没写正确导致。

kubectl 二进制部署

success output

error: dial tcp 192.168.164.200:6443: connect: no route to host

 报错原因是没有创建haproxy和keepalived 这个虚拟IP地址,导致在创建kubectl的时候没有找到这个主机,所以配置kubectl时候,高可用的负载均衡服务必须启动起来。

如何获取haproxy的配置文件

在centos上安装haproxy,随后搜索haproxy.cfg文件,接着在/etc/haproxy下获取

yum -y install haproxy keepalived

find / -name haproxy.cfg
cat /etc/haproxy/haproxy.cfg

find / -name keepalived.conf
cat /etc/keepalived/keepalived.conf

error: failed to create clusterrolebinding: clusterrolebindings.rbac.authorization.k8s.io "kube-apiserver:kubelet-apis" already exists

 因为多次创建rolebing导致,系统已经有了,需要执行delete操作重新创建。

# delete
kubectl delete clusterrolebinding kube-apiserver:kubelet-apis
# create
kubectl create clusterrolebinding kube-apiserver:kubelet-apis \
> --clusterrole=system:kubelet-api-admin --user kubernetes --kubeconfig=/root/.kube/config
clusterrolebinding.rbac.authorization.k8s.io/kube-apiserver:kubelet-apis created

error:connection refused

dial tcp :6443:error: failed to create clusterrolebinding: Post :6443/apis/rbac.authorization.k8s.io/v1/clusterrolebindings?fieldManager=kubectl-create": connect: connection refused

 网络不通,前端的反向代理服务没有起来

需要成功启动haproxy才能执行成功, 需要关闭防火墙和selinux 

controller-manager install

success output

error: 一切配置都正确,日志也没报错,但是服务没有起来是为什么?

后期二次复现,发现真实的报错原因如下图:

error: unknown flag: --horizontal-pod-autoscaler-use-rest-clients

如何发现这个报错?

# 手动停止服务
systemctl disable --now kube-controller-manager

# 查阅systemd.service的相关配置文件,手动执行程序启动命令
/usr/local/bin/kube-controller-manager --port=0 \
  --secure-port=10257 \
  --bind-address=127.0.0.1 \
  --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \
  --service-cluster-ip-range=10.96.0.0/16 \
  --cluster-name=kubernetes \
  --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
  --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --allocate-node-cidrs=true \
  --cluster-cidr=10.244.0.0/16 \
  --experimental-cluster-signing-duration=87600h \
  --root-ca-file=/etc/kubernetes/ssl/ca.pem \
  --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --leader-elect=true \
  --feature-gates=RotateKubeletServerCertificate=true \
  --controllers=*,bootstrapsigner,tokencleaner \
  --horizontal-pod-autoscaler-sync-period=10s \
  --tls-cert-file=/etc/kubernetes/ssl/kube-controller-manager.pem \
  --tls-private-key-file=/etc/kubernetes/ssl/kube-controller-manager-key.pem \
  --use-service-account-credentials=true \
  --alsologtostderr=true \
  --logtostderr=false \
  --log-dir=/var/log/kubernetes \
  --v=2

 在启动配置文件,删除这个配置即可。

error: address already in use

failed to create listener: failed to listen on 127.0.0.1:10257: listen tcp 127.0.0.1:10257: bind: address already in use

 当时debug 报错测试的时候没有停止服务,所以产生2个程序抢夺相同端口,从而报错

error:tls: private key does not match public key

重新部署服务的时候,更新了证书,证书更新后没同步到现在程序或者其他节点,需要重头部署配置。

error invalid port value 10252: only zero is allowed

5月 19 08:06:38 master01 kube-controller-manager[100922]: invalid port value 10252: only zero is allowed

 启动服务时候,1.22.0的kube-controller-manager指定--port参数为0,写其他则报错,因为K8S迭代很快,不同的版本,启动配置文件不同,需要根据版本修改启动配置。

error getting node err =node master01 not found

控制器没有启动导致报错:没有控制器启动,无法使用kubectl获取资源相关资源,无法执行kubectl get <resources>。

kube-controller-manager启动成功后,报错消失.kube-controller-manager启动成功后,会影响到kubelet,所以需要重启kubelet的服务。

error: coredns 容器status状态一直处于 no ready

 排除防火墙策略没关闭

 关闭防火墙策略后,容器成功启动

error: master01主节点 not ready

systemctl list-unit-files | grep kube
systemctl enable --now kube-controller-manager.service
systemctl enable --now kubelet.service

kubelet

error: failed to find any PEM data in certificate input

systemctl status kubelet.service -l

err="failed to run Kubelet: failed to initialize client certificate manager: could not convert data from \"/etc/kubernetes/ssl/kubelet-client-current.pem\" into cert/key pair: tls: failed to find any PEM data in certificate input"

cat /etc/kubernetes/ssl/kubelet-client-current.pem

网页链接参考阅读

01-集群部署_集群环境准备_哔哩哔哩_bilibili

k8s高可用部署:keepalived + haproxy_Kubernetes中文社区

Docker 安装Haproxy - 简书 (jianshu.com)

(48条消息) 【k8s学习2】二进制文件方式安装 Kubernetes之kubernetesmaster部署_温殿飞的博客-CSDN博客

kubernetes高可用集群安装(二进制安装、v1.20.2版)_51CTO博客_kubernetes二进制安装部署

二进制安装Kubernetes(k8s) v1.25.0 IPv4/IPv6双栈-阿里云开发者社区

HAProxy - The Reliable, High Perf. TCP/HTTP Load Balancer

docker run | Docker Documentation   Docker run 命令 | 菜鸟教程

Dockerfile · master · aleks / haproxy18-centos · GitLab

;