跳至内容

实验 3:配置计算资源

信息

这是由 Kelsey Hightower(GitHub:kelseyhightower)最初编写的 “Kubernetes the hard way” 的一个分支。与原始版本不同的是,原始版本基于 ARM64 架构的类 Debian 发行版,而此分支则针对 Rocky Linux 等企业级 Linux 发行版,这些发行版运行在 x86_64 架构上。

Kubernetes 需要一组机器来托管 Kubernetes 控制平面和最终运行容器的工作节点。在本实验中,您将提供设置 Kubernetes 集群所需的机器。

机器数据库

本教程将利用一个文本文件作为机器数据库,用于存储设置 Kubernetes 控制平面和工作节点时将使用的各种机器属性。以下模式代表机器数据库中的条目,每行一个条目。

IPV4_ADDRESS FQDN HOSTNAME POD_SUBNET

每一列对应一个机器 IP 地址 IPV4_ADDRESS、完全限定域名 FQDN、主机名 HOSTNAME 以及 IP 子网 POD_SUBNET。Kubernetes 为每个 pod 分配一个 IP 地址,POD_SUBNET 代表集群中每台机器用于此目的的唯一 IP 地址范围。

下面是一个机器数据库示例,与创建本教程所用的数据库类似。请查看隐藏的 IP 地址。您可以为您的机器分配任何 IP 地址,只要它们彼此之间以及与 jumpbox 可达即可。

cat machines.txt
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 文件,其中包含您将用于创建 Kubernetes 集群的三台机器的详细信息。您可以参考上面的示例机器数据库来添加您的机器的详细信息。

配置 SSH 访问

您将使用 SSH 来配置集群中的机器。验证您是否对机器数据库中列出的每台机器都具有 root SSH 访问权限。您可能需要通过更新 sshd_config 文件并重新启动 SSH 服务器来为每台节点启用 root SSH 访问。

启用 root SSH 访问

如果您对每台机器都具有 root SSH 访问权限,则可以跳过此部分。

新安装的 Rocky Linux 默认禁用 root 用户的 SSH 访问。出于安全原因,root 用户对类 Unix 系统拥有完全的管理控制权。弱密码对于联网的机器来说非常糟糕。如前所述,您将启用 root 通过 SSH 访问,以简化本教程的步骤。安全是一种权衡;在这种情况下,您正在优化便利性。

使用 SSH 和您的用户帐户登录到每台机器,然后使用 su 命令切换到 root 用户。

su - root

编辑 /etc/ssh/sshd_config SSH 守护程序配置文件,并将 PermitRootLogin 选项设置为 yes

sed -i \
  's/^#PermitRootLogin.*/PermitRootLogin yes/' \
  /etc/ssh/sshd_config

重新启动 sshd SSH 服务器以加载更新的配置文件。

systemctl restart sshd

生成并分发 SSH 密钥

在这里,您将为 servernode-0node-1 机器生成并分发 SSH 密钥对,您将使用这些密钥对在此教程中对这些机器执行命令。请从 jumpbox 机器运行以下命令。

生成新的 SSH 密钥

ssh-keygen

Enter 接受此处所有提示的默认值。

Generating 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

将 SSH 公钥复制到每台机器

while read IP FQDN HOST SUBNET; do 
  ssh-copy-id root@${IP}
done < machines.txt

添加每个密钥后,验证 SSH 公钥访问是否正常工作。

while read IP FQDN HOST SUBNET; do 
  ssh -n root@${IP} uname -o -m
done < machines.txt
x86_64 GNU/Linux
x86_64 GNU/Linux
x86_64 GNU/Linux

主机名

在本节中,您将为主机 servernode-0node-1 分配主机名。当您从 jumpbox 向每台机器执行命令时,将使用主机名。主机名在集群中也起着重要作用。Kubernetes 客户端将使用 server 主机名而不是 IP 地址来向 Kubernetes API 服务器发出命令。在将每台工作节点机器(node-0node-1)注册到给定的 Kubernetes 集群时,也会使用主机名。

要为主每台机器配置主机名,请在 jumpbox 上运行以下命令。

machines.txt 文件中列出的每台机器上设置主机名

while read IP FQDN HOST SUBNET; do
    ssh -n root@${IP} cp /etc/hosts /etc/hosts.bak 
    CMD="sed -i 's/^127.0.0.1.*/127.0.0.1\t${FQDN} ${HOST}/' /etc/hosts"
    ssh -n root@${IP} "$CMD"
    ssh -n root@${IP} hostnamectl hostname ${HOST}
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.local

主机查找表

在本节中,您将生成一个 hosts 文件,并将其追加到 jumpbox 上的 /etc/hosts 文件以及本教程使用的所有三个集群成员上的 /etc/hosts 文件中。这将允许每台机器都可以通过主机名(如 servernode-0node-1)进行访问。

创建一个新的 hosts 文件,并添加一个标题以标识要添加的机器。

echo "" > hosts
echo "# Kubernetes The Hard Way" >> hosts

machines.txt 文件中的每台机器生成一个主机条目,并将其追加到 hosts 文件中。

while read IP FQDN HOST SUBNET; do 
    ENTRY="${IP} ${FQDN} ${HOST}"
    echo $ENTRY >> hosts
done < machines.txt

查看 hosts 文件中的主机条目。

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-1

将 /etc/hosts 条目添加到本地计算机

在本节中,您将把 hosts 文件中的 DNS 条目追加到您的 jumpbox 机器上的本地 /etc/hosts 文件。

hosts 中的 DNS 条目追加到 /etc/hosts

cat hosts >> /etc/hosts

验证 /etc/hosts 文件的更新。

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# 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 到 machines.txt 文件中列出的每台机器。

for host in server node-0 node-1
   do ssh root@${host} uname -o -m -n
done
server x86_64 GNU/Linux
node-0 x86_64 GNU/Linux
node-1 x86_64 GNU/Linux

将 /etc/hosts 条目添加到远程计算机

在本节中,您将把 hosts 中的主机条目追加到 machines.txt 文本文件中列出的每台机器上的 /etc/hosts 文件中。

hosts 文件复制到每台机器,并将其内容追加到 /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 机器或 Kubernetes 集群中的任何一台机器连接到其他机器时使用主机名。现在,您可以使用主机名(如 servernode-0node-1)连接到机器,而无需使用 IP 地址。

下一步:配置 CA 并生成 TLS 证书

作者:Wale Soyinka

贡献者:Steven Spencer