使用k8s已有近一年的时间,版本从1.2到1.5、1.6、1.7,期间出现并解决了不少问题,下面是我总结的影响k8s集群稳定性的因素:
1. 安装环境
*kubelet版本最好与kube-apiserver、kube-controller-manager、kube-scheduler匹配;
*docker版本必须符合k8s的要求(当前是1.12);
*在xfs文件系统上使用docker overlay storage 请用下述命令重新格式化分区:mkfs.xfs -n ftype=1
2. 持久化存储
*除非硬件和网络性能足够,否则不要使用分布式存储,比如:glusterfs、ceph,否则,分布式存储的延迟和多节点数据不同步会严重影响k8s集群的稳定;
*可选择单节点的NFS4或者专业存储设备;
3. docker 镜像服务
*确保 docker registry 足够的稳定性和高性能(这一点往往不容易达到);
*部署容器前,提前pull镜像,并把部署文件的ImagePullPolicy设为IfNotPresent;
4. k8s的配置
k8s的配置错误或者冲突也会造成集群的不稳定,但这方面的问题往往比较隐蔽、不容易找出。
*kube-controller-manager的node-monitor-grace-period 不能过短,否则k8s node会不断出现NotReady的错误;
*...
5. etcd
etcd是k8s核心组件之一,存储k8s的api对象,它对磁盘和网络性能很敏感,建议按照官方说明配置如下:
*使用SSD代替普通磁盘
*使用1G以上的网络
*使用多节点(3个或5个)的集群
附:k8s故障排查方法
*建立k8s和容器监控,及时发现问题;
*出现问题后查看日志、找出原因:kube-apiserver、kube-controller-manager、kube-scheduler、其它容器的日志,以及/var/log/messages
*使用google查询解决方案