Kubernetes 故障解决心得(一)
故障一
故障现象
kubelet 启动不了,通过命令 journalctl -u kubelet
查看日志,报 Failed to start ContainerManager failed to initialize top level QOS containers: failed to update top level Burstable QOS cgroup : failed to set supported cgroup subsystems for cgroup [kubepods burstable]: failed to find subsystem mount for required subsystem: pids
故障分析
根据报错,有用的信息是 failed to find subsystem mount for required subsystem: pids
,通过命令 ls -l /sys/fs/cgroup/systemd/kubepods/burstable/
查看,该目录下没有 pids
目录。
SupportPodPidsLimit
在 kubernetes 1.14+
默认开启。SupportNodePidsLimit 在 1.15+
默认开启。
相关Issues:https://github.com/kubernetes/kubernetes/issues/79046
解决方法
- 方法一:编辑 kubelet 配置文件,添加
--feature-gates=SupportPodPidsLimit=false,SupportNodePidsLimit=false
参数,后面在重启 kubelet 服务。 - 方法二:可以升级系统内核
5+
版本
故障二
故障现象
Docker daemon oci 故障,日志报 docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:301: running exec setns process for init caused "exit status 40"": unknown.
解决方法
# 清理缓存
$ echo 1 > /proc/sys/vm/drop_caches
# 永久生效
$ echo "vm.min_free_kbytes=1048576" >> /etc/sysctl.conf
$ sysctl -p
# 重启 docker 服务,让 docker 应用内核设置
$ systemctl restart docker
故障三
报错现象
kubelet 日志报 network plugin is not ready: cni config uninitialized
解决方法
网络插件(flannel 或者 calico)没有安装或者安装失败。
故障四
故障现象
kubelet 日志报 Failed to connect to apiserver: the server has asked for the client to provide credentials
故障分析
从上面 kubelet 日志信息能得出,kubelet 客户端证书已过期,导致 Node节点状态处于 NotReady
。
也可以通过命令 openssl x509 -noout -enddate -in {证书路径}
来查看证书到期日期。
解决方法
kubeadm 部署的 Kubernetes 解决方法
kubernetes 1.15+ 版本可以直接通过命令 kubeadm alpha certs renew <cert_name>
更新。
kubernetes 小于 1.15 版本的,可以参考 https://github.com/yuyicai/update-kube-cert
项目更新
二进制部署的 Kubernetes 解决方法
# 删除旧的 kubelet 证书文件
$ rm -f /opt/kubernetes/ssl/kubelet*
# 删除 kubelet kubeconfig 文件
$ rm -f /opt/kubernetes/cfg/kubelet.kubeconfig
# 重启 kubelet 服务,让 master 重新颁发客户端证书
$ systemctl restart kubelet
参考链接
- https://adoyle.me/Today-I-Learned/k8s/k8s-deployment.html
- SQL Server安全(3/11):主体和安全对象(Principals and Securables)
- 在SQL Server里如何进行页级别的恢复
- 你可能不知道的字符比较中的“秘密”
- c++实现简单计算器
- re模块(正则表达式)
- Python学习——collections系列
- 为stackGan一个工程创建一个虚拟环境,python 2.7 tensorflow0.12-tensorflow 1.01
- linux 普通操作,查看资源使用情况
- Python 函数使用记录,join函数和os.path.join用法
- 01.SQLServer性能优化之----强大的文件组----分盘存储
- stackGan实验
- pyTorch基础入门练习
- 昨天遇到的几个常用函数
- 【深入浅出】一篇超棒的机器学习入门文章
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis基础——剖析基础数据结构及其用法
- SwipeRefreshLayout+RecyclerView实现上拉刷新和下拉刷新功能
- 二值分析 | OpenCV + skimage如何提取中心线
- 详解OpenVINO 模型库中的人脸检测模型
- Tensorflow的妙用
- 终端抓包神器 | tcpdump参数解析及使用
- GoLang 中发送 email 邮件
- 漫画算法题:两数之和与三数之和
- 推荐系统与深度学习(十七)——DIN模型原理
- 可视化教程开启BERT之旅
- pandas中apply与map的异同
- 终端下双重过滤筛选内容
- scrapy-redis分布式爬虫
- HTML5新增全局属性
- 漫画:如何找到链表的倒数第n个结点?