最近在学习 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-docker 和 cri-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. 小结
以上就是我在使用该教程部署时遇到的一些细节问题。原教程提供了很好的整体步骤,希望这些配置细节可以帮大家避免不必要的排查时间。