参考掘金 K8s 部署教程时的防踩坑经验分享

4 阅读2分钟

最近在学习 Kubernetes,在掘金上看到一篇部署教程:Kubernetes v1.35 部署实战

这篇文章讲解得非常清晰,实操性也很强,推荐给想学习搭建 K8s 集群的同学们。

不过,在跟随教程实操的过程中,我遇到了一些配置上的细节问题。为了帮助大家更顺畅地完成部署,我总结了这份经验分享,作为原教程的补充。


1. Systemd 配置文件细节

原文提供了详细的 cri-dockerd 服务配置模板。但在直接使用时,需要注意一些细节。

1.1 避免行内注释

问题/etc/systemd/system/cri-dockerd.service/etc/systemd/system/cri-docker.socket 配置文件中如果包含类似 Requires=cri-docker.socket # 依赖socket 这样的行内注释,Systemd 可能会解析失败,报错 Failed to add dependency on #...

# /etc/systemd/system/cri-dockerd.service:
Requires=cri-docker.socket     # 以前的文件名注释
# /etc/systemd/system/cri-docker.socket:
PartOf=cri-docker.service    #systemd cri-docker.servics 文件名

解决: Systemd 的 Unit 文件通常不支持在参数值后直接加 # 进行注释。建议直接删除注释。

1.2 注意长命令换行

/etc/systemd/system/cri-dockerd.service 中的 ExecStart 命令较长,在 pause:3.10 后有一个多余的换行。在复制时,需要删除这个换行,否则会导致命令截断。


2. 文件名一致性问题

在配置过程中,容易混淆 cri-dockercri-dockerd(是否带 d)。

问题: 如果 Socket 文件中配置了 PartOf=cri-dockerd.service,但实际创建的服务文件名为 cri-docker.service,会导致 Socket 启动后无法正确拉起主服务,Kubelet 也会报错找不到文件。

建议: 保持 Socket 文件和 Service 文件命名的一致性。

我采用的统一命名为:

  • /etc/systemd/system/cri-dockerd.service
  • /etc/systemd/system/cri-dockerd.socket

并在 cri-dockerd.service 文件中指定:

[Unit]
Requires=cri-dockerd.socket

cri-dockerd.socket 文件中指定:

[Unit]
PartOf=cri-dockerd.service

3. kubeadm 初始化配置

在原教程 4.6.2 执行kubeadm init命令 章节中,涉及到 --control-plane-endpoint 字段的配置。

问题: 如果照抄配置文件中的 --control-plane-endpoint=k8smaster 而没有修改,或者将其设置为一个无法解析的域名,kubeadm init 将会失败,提示无法连接到 API Server。

建议controlPlaneEndpoint 必须是一个可解析、可访问的地址,指向 Master 节点的 IP 或域名。

  • 推荐做法:将其设置为 Master 节点的主机名(例如 master)或直接使用 Master 节点的 IP 地址。
  • 前提条件:如果使用主机名,必须确保该主机名可被解析(如在 /etc/hosts 文件中已经配置了正确的域名解析: 192.168.109.100 master)。

4. 小结

以上就是我在使用该教程部署时遇到的一些细节问题。原教程提供了很好的整体步骤,希望这些配置细节可以帮大家避免不必要的排查时间。