Kubernetes The Hard Way 计算资源篇:机器数据库、SSH 通道与主机名解析的完整落地方法
【免费下载链接】kubernetes-the-hard-wayBootstrap Kubernetes the hard way. No scripts.项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-the-hard-way
本篇基于 docs/03-compute-resources.md 展开,讲解在 Kubernetes The Hard Way 实验环境中完成计算资源供给的全部操作:设计机器数据库machines.txt并理解POD_SUBNET的集群级含义、为三台集群机器打通 root SSH 免密通道、批量设置主机名、构建并分发 hosts 查找表。读完本篇,你将掌握一个单控制面 + 两工作节点的三机集群从"裸机"到"可被主机名寻址"的标准化供给流程,以及这些主机名和 Pod 网段在后续控制面、工作节点、Pod 路由实验中的具体消费方式。
1. 实验背景:需要哪些机器
根据 README 的说明,本教程要求4 台连接在同一网络上的 ARM64 或 AMD64 虚拟机/物理机:一台jumpbox(操作跳板,后续所有命令均从此机发出),一台server(承载全部控制面组件),以及两台node-0、node-1(工作节点,容器最终运行其上)。集群组件版本为 Kubernetes v1.32.x、containerd v2.1.x、CNI v1.6.x、etcd v3.6.x。
本文档(Lab 3)的任务就是为后三台机器建立统一的主机资产台账,并让它们之间以及它们与jumpbox之间可通过主机名互相 SSH 访问。
2. 机器数据库 machines.txt:整个教程的"单一事实来源"
教程用一个纯文本文件作为machine database,逐行记录每台机器的属性,后续几乎所有批量脚本(SSH 分发、主机名设置、hosts 生成、Pod 路由)都通过while read循环解析这个文件。
2.1 文件 Schema
IPV4_ADDRESS FQDN HOSTNAME POD_SUBNET四列含义:
| 列 | 含义 | 说明 |
|---|---|---|
IPV4_ADDRESS | 机器内网 IPv4 地址 | 要求各机器之间、以及机器与jumpbox之间互相可达,地址本身可以任意规划 |
FQDN | 完全限定域名 | 用于127.0.1.1本机解析和 hosts 表 |
HOSTNAME | 主机名 | jumpbox上 SSH 的目标名;也是 Kubernetes API server 客户端调用时使用的名字,以及工作节点向集群注册时上报的节点名 |
POD_SUBNET | 该机器专属的 Pod IP 网段 | Kubernetes 为每个 Pod 分配一个 IP,POD_SUBNET就是分配给这台机器的独占地址范围。注意:控制面机器server上不跑 Pod,所以该行没有第四列 |
2.2 示例内容
原文档给出的示例(IP 已脱敏,实际地址按自己的网络环境填写):
XXX.XXX.XXX.XXX server.kubernetes.local server XXX.XXX.XXX.XXX node-0.kubernetes.local node-0 10.200.0.0/24 XXX.XXX.XXX.XXX node-1.kubernetes.local node-1 10.200.1.0/24创建自己的machines.txt时请严格保持"列与空格分隔"的格式,因为后续脚本依赖固定列位(cut -d " " -f 4等)提取字段。
2.3 为什么 POD_SUBNET 如此重要
POD_SUBNET不是摆设,它是本教程 Pod 网络模型的核心数据。从仓库中两处下游用法可以印证其消费链路:
- CNI 网桥配置:configs/10-bridge.conf 中
host-localIPAM 的ranges写的是占位符"subnet": "SUBNET"。在 docs/09-bootstrapping-kubernetes-workers.md 中,每登录一台 worker 前,都会执行SUBNET=$(grep ${HOST} machines.txt | cut -d " " -f 4),再用sed "s|SUBNET|$SUBNET|g"把网段替换进10-bridge.conf(同时也替换进 configs/kubelet-config.yaml)。也就是说,每个 Pod 的 IP 都从machines.txt里那台机器自己的第四列网段中分配。 - 跨节点路由:docs/11-pod-network-routes.md 中,
server、node-0、node-1三台机器互相ip route add ${NODE_X_SUBNET} via ${NODE_X_IP},而这些SUBNET变量同样来自grep node-0 machines.txt | cut -d " " -f 4。没有这份网段表,跨节点 Pod 通信的路由就无法建立。
换句话说,machines.txt的第四列在 Lab 3 里被写下的那一刻,就已经决定了 Lab 9 和 Lab 11 里 Pod 网络的行为。
3. 配置 SSH 访问
后续所有配置动作都通过 SSH 下发,因此需要先确认jumpbox能以root身份免密登录三台机器。
3.1 启用 root SSH 登录
默认的 Debian 安装出于安全考虑会禁用root的 SSH 登录。本教程为简化操作步骤选择开启它,原文档也明确提示这是"安全与便利的权衡(Security is a tradeoff)"——生产环境不要这样做。
在每台上以普通用户登录后su - root,然后编辑/etc/ssh/sshd_config,用sed将PermitRootLogin置为yes(^#*同时匹配被注释和未注释的行):
sed -i \ 's/^#*PermitRootLogin.*/PermitRootLogin yes/' \ /etc/ssh/sshd_config重启 SSH 服务使配置生效:
systemctl restart sshd如果机器本身已允许 root SSH 登录,可跳过本小节。
3.2 生成并分发 SSH 密钥
以下命令均在jumpbox上执行。
生成新的密钥对(交互式提示中保存路径、passphrase 直接回车,生成/root/.ssh/id_rsa与/root/.ssh/id_rsa.pub):
ssh-keygenGenerating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa Your public key has been saved in /root/.ssh/id_rsa.pub利用机器数据库把公钥批量拷贝到三台机器——这里while read IP FQDN HOST SUBNET把每行拆成四个 shell 变量,SUBNET在本场景用不到但必须占位,否则HOST会吞掉整个剩余行:
while read IP FQDN HOST SUBNET; do ssh-copy-id root@${IP} done < machines.txt验证免密登录已生效(-n防止远程命令意外读取 stdin,否则会吃掉machines.txt的后续行):
while read IP FQDN HOST SUBNET; do ssh -n root@${IP} hostname done < machines.txt期望输出三台机器各自的主机名:
server node-0 node-14. 批量设置主机名
主机名在本实验中有三个关键作用:jumpbox通过它执行远程命令;Kubernetes 客户端不再用 IP 而是用server这个主机名访问 API server;node-0、node-1向集群注册时也使用主机名作为节点标识(对应 configs/kubelet-config.yaml 中的registerNode: true注册流程)。
在jumpbox上执行,逐台完成三件事:改写/etc/hosts中的127.0.1.1本机条目、设置静态主机名、重启 hostnamed 服务:
while read IP FQDN HOST SUBNET; do CMD="sed -i 's/^127.0.1.1.*/127.0.1.1\t${FQDN} ${HOST}/' /etc/hosts" ssh -n root@${IP} "$CMD" ssh -n root@${IP} hostnamectl set-hostname ${HOST} ssh -n root@${IP} systemctl restart systemd-hostnamed done < machines.txt验证:
while read IP FQDN HOST SUBNET; do ssh -n root@${IP} hostname --fqdn done < machines.txt期望输出:
server.kubernetes.local node-0.kubernetes.local node-1.kubernetes.local5. 生成主机查找表 hosts
为了让server、node-0、node-1这些短主机名在所有机器上都能解析,先构建一份共享的 hosts 片段。
创建文件并写入标识头:
echo "" > hosts echo "# Kubernetes The Hard Way" >> hosts逐行从machines.txt生成条目追加进去:
while read IP FQDN HOST SUBNET; do ENTRY="${IP} ${FQDN} ${HOST}" echo $ENTRY >> hosts done < machines.txt检查生成结果:
cat hosts# Kubernetes The Hard Way XXX.XXX.XXX.XXX server.kubernetes.local server XXX.XXX.XXX.XXX node-0.kubernetes.local node-0 XXX.XXX.XXX.XXX node-1.kubernetes.local node-16. 写入 /etc/hosts:本地与远端
6.1 追加到 jumpbox 本机
cat hosts >> /etc/hosts验证/etc/hosts末尾出现新条目(原有127.0.0.1 localhost、127.0.1.1 jumpbox等保持不变):
cat /etc/hosts127.0.0.1 localhost 127.0.1.1 jumpbox # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters # Kubernetes The Hard Way XXX.XXX.XXX.XXX server.kubernetes.local server XXX.XXX.XXX.XXX node-0.kubernetes.local node-0 XXX.XXX.XXX.XXX node-1.kubernetes.local node-1此时即可直接以主机名 SSH:
for host in server node-0 node-1 do ssh root@${host} hostname doneserver node-0 node-16.2 追加到三台集群机器
把hosts文件先scp到每台机器的 home 目录,再追加进其/etc/hosts:
while read IP FQDN HOST SUBNET; do scp hosts root@${HOST}:~/ ssh -n \ root@${HOST} "cat hosts >> /etc/hosts" done < machines.txt完成后,jumpbox与三台集群机器之间都可以完全用主机名互访,后续 Lab 4(证书签发)起的所有文档都默认这一网络可达性已就绪。
7. 完成检查清单
在进入下一节(CA 与 TLS 证书,见 docs/04-certificate-authority.md)前,逐项确认:
machines.txt存在,且server、node-0、node-1三行字段完整、node-0/node-1的POD_SUBNET网段互不重叠(如10.200.0.0/24与10.200.1.0/24);jumpbox对三台机器可ssh root@<IP>免密登录,且hostname命令回显正确主机名;- 三台机器
hostname --fqdn输出*.kubernetes.local; - 每台机器的
/etc/hosts都包含# Kubernetes The Hard Way段落的三行条目; - 用主机名(而非 IP)在
jumpbox与集群机器之间互相 SSH 均能成功。
至此,集群的"物理层供给"完成:机器可寻址、可登录、网段已规划,为接下来的控制面与工作节点部署奠定了网络基础。
【免费下载链接】kubernetes-the-hard-wayBootstrap Kubernetes the hard way. No scripts.项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-the-hard-way
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考