SUMMARY
参考网上的教程和网课,进行二进制高可用Kubernetes部署。并对整个过程和报错进行简单记录。
架构图
设备规划
序号 | 名字 | 功能 | VMNET 1 | 备注 + 1 | 备注 + 2 | 备注 +3 | 备注 + 4 | 备注 +5 |
0 | orgin | 界面 | 192.168.164.10 | haproxy | keepalived | 192.168.164.200 | ||
1 | reporsitory | 仓库 | 192.168.164.16 | yum 仓库 | registory | haproxy | keepalived | |
2 | master01 | H-K8S-1 | 192.168.164.11 | kube-api | controller | scheduler | etcd | |
3 | master02 | H-K8S-2 | 192.168.164.12 | kube-api | controller | scheduler | etcd | |
4 | master03 | H-K8S-3 | 192.168.164.13 | kube-api | controller | scheduler | etcd | |
5 | node04 | H-K8S-1 | 192.168.164.14 | kube-proxy | kubelet | docker | ||
6 | node05 | H-K8S-2 | 192.168.164.15 | kube-proxy | kubelet | docker | ||
7 | node07 | H-K8S-3 | 192.168.164.17 | kube-proxy | kubelet | docker |
软件版本
软件名称 | 版本 | 备注 |
---|---|---|
CentOS7 | 6.3.3-1.el7.elrepo.x86_64 | |
kubernetes | v1.22.0 | 非最新版本 |
etcd | v3.4.13 | 非最新版本 |
calico | v3.19.4 | |
coredns | v1.8.4 | |
containerd | 1.6.1 | |
runc | 1.1.0 |
Ansible module summary
# 查看组件如何使用
ansible-doc <mode>
在部署过程中,经常使用的ansible的重要组件或者模块
mode | import option | description | remark |
copy | src dest mode | 复制文件到远程主机 | |
unarchive | src dest | 本地压缩包解压到远程主机 | |
file | path owner mode state | 对远程文件的增删改 | |
systemd | enabled daemon_reload state | 启动或者停止程序 | |
shell | 执行shell命令 | ||
stat debug when | 判断状态 | ||
scripts | 执行shell脚本 | ||
yum | state | 程序安装卸载 |
folders or directories summary
总结相关重要文件夹的功能和路径
文件夹 | 描述 | 可能存放的文件 | 备注 |
/etc/etcd | etcd主配置文件夹 | etcd.conf | |
/etc/etcd/ssl | etcd证书文件夹 | ca-key.pem ca.pem etcd-key.pem etcd.pem | |
/var/lib/etcd | etcd存放数据的文件夹 | ||
/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/ssl | K8S证书文件夹 | 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/kubernetes | k8s的日志存放路径 | 相关文件在部署服务的时候需要提前创建好 | |
/usr/lib/systemd/system | systemd管理service文件夹 | 需留意个组件启动文件的配置项目,参数不能缺少 | |
/usr/local/bin | K8S + ETCD 各主要程序执行存放路径 | ||
/etc/containerd | containerd的配置地址 |
常用命令
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
失败经历第一次
(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