kOps配置protectKernelDefaults与EventRateLimit后K8s集群启动失败
问题1:启用protectKernelDefaults: true后集群无日志无法启动
根因
该参数的作用是强制kubelet校验节点内核参数是否符合Kubernetes运行要求,校验不通过时kubelet会直接终止启动。kubelet启动失败会导致Master节点上的kube-apiserver、kube-scheduler等静态Pod无法被调度创建,因此/var/log下对应组件日志全部为空。
排查步骤
- 登录故障Master节点,执行
systemctl status kubelet查看kubelet运行状态,执行journalctl -u kubelet --no-pager查看kubelet启动日志,日志中会明确打印不符合要求的内核参数名称。 - 常见缺失的内核参数包括:
vm.overcommit_memory=1、kernel.panic=10、kernel.panic_on_oops=1、net.ipv4.ip_forward=1,你使用的Ubuntu 20.04镜像默认未配置以上参数,是该问题的高频诱因。
解决方案
通过kOps InstanceGroup的userData字段添加开机初始化脚本,在节点启动时提前配置所有需要的内核参数,再启用protectKernelDefaults即可。
问题2:启用EventRateLimit准入插件后apiserver启动失败
根因
EventRateLimit准入插件属于配置依赖型插件,仅在启用列表中添加插件名称是不够的,必须同步提供对应的限流配置文件,否则apiserver启动时会校验失败直接退出,你看到的日志只有开头的flag打印就是进程启动校验不通过反复重启的表现。
排查步骤
- 登录故障Master节点,执行
crictl ps -a | grep kube-apiserver找到退出的apiserver容器ID,执行crictl logs <容器ID>查看完整启动报错,会明确提示缺少EventRateLimit配置文件。
解决方案
- 新增fileAsset将EventRateLimit配置文件投递到所有Master节点,示例如下:
fileAssets: - name: event-rate-limit-config path: /srv/kubernetes/apiserver/event-rate-limit.yaml roles: [Master] content: | apiVersion: eventratelimit.admission.k8s.io/v1alpha1 kind: Configuration limits: - type: Namespace qps: 50 burst: 100 - type: User qps: 10 burst: 50
- 在kubeAPIServer配置中添加对应配置路径参数,kOps 1.21版本可直接添加字段:
kubeAPIServer: eventRateLimitConfig: /srv/kubernetes/apiserver/event-rate-limit.yaml
通用排查建议
- kOps部署的集群遇到启动问题优先查看kubelet的systemd日志,静态Pod未启动时/var/log下的组件日志无参考价值。
- 配置修改后可先执行
kops update cluster检查配置是否被正确识别,避免配置字段版本不兼容的问题。
内容的提问来源于stack exchange,提问作者Arshad
相关产品推荐
相关产品推荐

