【故障公告】k8s 开船记:增加控制舱(control-plane)造成的翻船
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
春节期间我们更换了 kubernetes 生产集群,旧集群的 kubernetes 版本是 1.17.0,新集群版本是 1.23.3,新集群上部署了 dapr,最近准备将更多独立部署的服务器部署到 k8s 集群上,比如 redis, memcached, mongodb。
新集群和旧集群一样都是高可用集群,但新集群开始只用了 1 个 control-plane 节点,今天本来的任务是给新集群再增加 2 个 control-plane 节点,实现高可用。
如何加入 control-plane 节点呢? k8s 没有直接提供生成 join 命令的命令,下面的命令只能用于加入 worker 节点。
kubeadm token create --print-join-command
之前我们是在创建集群的时候,在执行 kubeadm init 命令之后就操作加入 control-plane 节点,kubeadm init 会生成加入命令
You can now join any number of the control-plane node running the following command on each as root:kubeadm join k8s-api:6443 --token ****** \--discovery-token-ca-cert-hash ****** \--control-plane --certificate-key ******
上面的命令实际上就是 token create --print-join-command
的输出加上 --control-plane
与 --certificate-key
,但之前使用的 certificate-key 已经过期。
开始我们用下面的命令生成 certificate-key 加入集群
kubeadm certs certificate-key
但加入失败,报错信息如下
[download-certs] Downloading the certificates in Secret “kubeadm-certs” in the “kube-system” Namespace
error execution phase control-plane-prepare/download-certs: error downloading certs: error downloading the secret: Secret “kubeadm-certs” was not found in the “kube-system” Namespace. This Secret might have expired. Please, runkubeadm init phase upload-certs --upload-certs
on a control plane to generate a new one
于是改用 upload-certs 命令
$ kubeadm init phase upload-certs --upload-certs
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
*****
将 upload-certs 命令生成的 certificate-key 用于 kubeadm join 命令,这个 key 果然可以,但是在加入过程中卡在了下面的地方
[etcd] Announced new etcd member joining to the existing etcd cluster
[etcd] Creating static Pod manifest for “etcd”
[etcd] Waiting for the new etcd member to join the cluster. This can take up to 40s
[kubelet-check] Initial timeout of 40s passed.
本以为新 control-plane 节点加入不了不会影响现有集群的正常运行,但一个残酷的现实突然而至 —— 已有且仅有的那台 control-plane 上 api-server 容器突然无法启动了,syslog 中的其中一条错误信息如下
“Unable to authenticate the request due to an error” err=“Post “https://k8s-api:6443/apis/authentication.k8s.io/v1/tokenreviews”: dial tcp 10.0.9.171:6443: connect: connection refused”
这时虽然 api-server 不能正常工作,但 worker 节点上的 pod 都正常运行,应用暂时没有受影响。
面对这样如履薄冰的场景,我们首先想到的是先恢复旧集群,将负载切换到旧集群,然后从容地处理新集群的问题,但故障如此会开玩笑,旧集群的 api-server 竟然也无法正常启动。
CONTAINER ID IMAGE COMMAND CREATED STATUS
0f30ff71a13d 0cae8d5cc64c "kube-apiserver --ad…" 5 seconds ago Up 3 seconds
命运会作弄人,故障也学会了。
面对如履薄冰与故障的作弄,我们做出了一个铤而走险的决定 —— 更新所有证书,之前成功操作过,但当时集群中没有负载。
用下面的命令三下五除二地完成了证书更新
$ cd /etc/kubernetes/pki/
$ mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} ~/
$ kubeadm init phase certs all --control-plane-endpoint "k8s-api:6443"
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all --control-plane-endpoint "k8s-api:6443"
接下来就是重启 control-plane 节点服务器使用更新的证书。
重启的结局却是 —— 满园尽是502
走险失败后立即进入紧急抢险,用当前 control-plane 节点今天凌晨的快照创建镜像,用镜像重置整个系统。
重置后的 control-plane 节点成功启动后,从 control-plane 节点上看集群应该恢复了正常,worker 节点都处于 ready 状态,绝大多数 pod 都处于 running 状态,但是 pod 中的应用却不能正常工作,比如连不上其他服务、ingress 规则失效等。
开始以为要将所有 worker node 退出并重新加入集群才能恢复,但是在第1个 worker node 上操作退出时却卡在下面的地方
$ kubeadm reset
[reset] Unmounting mounted directories in "/var/lib/kubelet"
后来想到重启所有 worker node 试试,越是关键时候越是不能忽略简单方法,都重启后一切恢复了正常。
非常抱歉,今天 19:10~19:50 期间由于 k8s 集群操作引发全站全站故障,由此给您带来很大的麻烦,请您谅解。
【故障公告】k8s 开船记:增加控制舱(control-plane)造成的翻船相关推荐
- k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常)
k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常) 参考文章: (1)k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常) (2)https://ww ...
- Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画
Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画 引子 这段时间一直努力在把早期版本的拇指接龙游戏(Cocos2d-x 2.2.3+CocoStud ...
- oracle 新增加控制文件,Oracle增加控制文件副本
1.文档目标 新建的数据库只有一个控制文件副本,希望增加控制文件副本到不同位置,防止控制文件发生损坏. 2.修改control_files参数 # 如果使用了OMF则可以在修改参数时只指定路径,无需指 ...
- 在Android的 设置-显示 中增加控制屏幕旋转方向的选项
在Android的 设置->显示 中增加控制屏幕旋转方向的选项 参考博文 实现目标 效果局限 代码实现 配置资源文件 界面搭建 功能实现 默认值修改 其他情况 结语 参考博文 Android-x ...
- 市内移出版本2.0(1、一页显示15条。2、增加控制标志。3、打印表格时绑定的list的优化。4、保存迁出登记信息时根据业务流水号判断增加还是修改。5、统一管理常量)
HjdjConstants.java package cn.hnisi.gdrk.utils; /** * * @author yanghanming * @function 存放户籍登记的相关常量 ...
- android 11.0 增加控制状态栏和导航栏的接口
增加控制状态栏和导航栏的接口,代码如下 .../statusbar/NavigationBarController.java | 6 +-.../phone/NavigationBarFragment ...
- 橙旗贷11月13日故障公告补偿金已经发放
各位投资用户 你们好! 11月13日上午,由于网络服务提供商阿里云出现网络故障,导致部分用户无法访问橙旗贷平台,在此橙旗贷对于所有投资人致以诚挚的歉意,给大家造成的不便敬请谅解.我们愿意对此次事件负起 ...
- SAP SD基础知识之输出控制(Output Control)
SAP SD基础知识之输出控制(Output Control) 一,销售的输出类型 Output是用于和商业伙伴及系统交换信息的通信方式.我们可以为不同的销售凭证如报价单,订单,交货单,发票设置out ...
- php output详解,PHP输出缓冲控制Output Control系列函数详解,output函数详解
PHP输出缓冲控制Output Control系列函数详解,output函数详解 概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到 ...
最新文章
- rem是如何实现自适应布局的
- 超声检查预测一年后RA病人的MRI侵蚀进展
- Python的进程和线程(二)——IO密集型任务
- 2.Vivado软件基础操作
- 图集分配透明与不透明打包不到一起的错误
- Microsoft.AspNet.Identity 自定义使用现有的表—登录实现
- Linux文件句柄占用数量查看与设置
- Windows Serer2003域升级到Windows Server2008R2域
- ES6的Set使用方法
- Android 自定义ToggleButton+用SharedPreferences保存用户配置
- (转)如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
- ajax(form)图片上传(spring)
- 一个能和企鹅一样飞的创意
- RuntimeError: generator raised StopIteration
- postgresql-timescaldb_extention
- int 类型 转 long的坑
- Python Qt5 入门教程
- Django创建数据库(Django数据库字段类型)
- 计算机网络根据其规模大小和延伸范围,网络管理员考试计算机网络的分类
- PyQt5 图片进行缩放
热门文章
- Floyd-Warshall[弗洛依德]算法
- 电脑查看服务器ip地址
- 中国的计算机网络技术学校,计算机系网络营销学校,计算机网络技术有哪些专科学校...
- 神奇!一篇不足700字的论文,竟然能发表在Science上
- 广西大学计算机专业分流,《广西大学中加国际学院学生专业分流管理办法》的翻译项目报告.pdf...
- 50个有创意的单页网站设计
- SQL查询重复数据,只显示一条sql语句
- 仙人掌之歌——权力的游戏(3)
- python使用protobuf
- python用animation绘制动画