跳至内容

实验 4:配置 CA 并生成 TLS 证书

信息

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

在本实验中,您将使用 OpenSSL 配置一个公钥基础设施 (PKI),以引导证书颁发机构,并为以下组件生成 TLS 证书:

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • kubelet
  • kube-proxy

在本节中,请从 jumpbox 运行命令。

证书颁发机构

在本节中,您将配置一个证书颁发机构,您将使用它来为其他 Kubernetes 组件生成额外的 TLS 证书。使用 openssl 设置 CA 和生成证书可能非常耗时,尤其是在第一次操作时。为了简化本实验,必须包含一个 openssl 配置文件 ca.conf,该文件定义了为每个 Kubernetes 组件生成证书所需的所有详细信息。

花点时间查看 ca.conf 配置文件

cat ca.conf

要完成本教程,您不需要理解 ca.conf 文件中的所有内容。不过,您应该将其视为学习 openssl 以及高级证书管理配置的起点。

每个证书颁发机构都始于一个私钥和一个根证书。在本节中,您将创建一个自签名证书颁发机构。虽然这足以满足本教程的需求,但在实际生产环境中不应考虑这一点。

生成 CA 配置文件、证书和私钥

  openssl genrsa -out ca.key 4096
  openssl req -x509 -new -sha512 -noenc \
    -key ca.key -days 3653 \
    -config ca.conf \
    -out ca.crt

结果

ca.crt ca.key

技巧

要查看生成证书文件 (ca.crt) 中编码的详细信息,可以使用此 OpenSSL 命令 openssl x509 -in ca.crt -text -noout | less

创建客户端和服务器证书

在本节中,您将为每个 Kubernetes 组件生成客户端和服务器证书,以及为 Kubernetes admin 用户生成客户端证书。

生成证书和私钥

certs=(
  "admin" "node-0" "node-1"
  "kube-proxy" "kube-scheduler"
  "kube-controller-manager"
  "kube-api-server"
  "service-accounts"
)
for i in ${certs[*]}; do
  openssl genrsa -out "${i}.key" 4096

  openssl req -new -key "${i}.key" -sha256 \
    -config "ca.conf" -section ${i} \
    -out "${i}.csr"

  openssl x509 -req -days 3653 -in "${i}.csr" \
    -copy_extensions copyall \
    -sha256 -CA "ca.crt" \
    -CAkey "ca.key" \
    -CAcreateserial \
    -out "${i}.crt"
done

上述命令将为每个 Kubernetes 组件生成一个私钥、证书签名请求和已签名的 SSL 证书。您可以使用以下命令列出生成的​​文件:

ls -1 *.crt *.key *.csr

分发客户端和服务器证书

在本节中,您将把各种证书复制到每台机器上,放置在每个 Kubernetes 组件会查找其证书对的路径下。在实际环境中,您会将这些证书视为一组敏感的秘密,因为 Kubernetes 使用这些组件来相互进行身份验证。

将适当的证书和私钥复制到 node-0node-1 机器

for host in node-0 node-1; do
  ssh root@$host mkdir /var/lib/kubelet/

  scp ca.crt root@$host:/var/lib/kubelet/

  scp $host.crt \
    root@$host:/var/lib/kubelet/kubelet.crt

  scp $host.key \
    root@$host:/var/lib/kubelet/kubelet.key
done

将适当的证书和私钥复制到 server 机器

scp \
  ca.key ca.crt \
  kube-api-server.key kube-api-server.crt \
  service-accounts.key service-accounts.crt \
  root@server:~/

在下一个实验中,您将使用 kube-proxykube-controller-managerkube-schedulerkubelet 客户端证书来生成客户端身份验证配置文件。

下一步:生成用于身份验证的 Kubernetes 配置文件

作者:Wale Soyinka

贡献者:Steven Spencer, Ganna Zhyrnova