使用自定义集群证书授权机构

集群证书授权机构 (CA) 会颁发证书并对证书进行签名,以便在集群组件之间实现安全的身份验证和加密。默认情况下,在 GKE on Bare Metal 中,集群 API 会在您创建新集群时创建集群 CA。本文档介绍如何将自己的证书授权机构与 GKE on Bare Metal 搭配使用。使用自定义集群 CA 让您可更好地控制颁发和管理集群证书。您还可以控制信任、加密算法参数、从属证书的深度及其用途。

如需使用自定义 CA,您需要提供根 CA,它由一个 CA 证书文件及其对应的私钥文件组成。您需要为以下每个必需的集群 CA 提供 CA 证书/密钥文件对:

  • etcd CA:etcd CA 证书的证书可保护从 Kubernetes API 服务器到 etcd 副本的通信以及 etcd 副本之间的通信。

  • 集群 CA:集群 CA 的证书用于保护 Kubernetes API 服务器与所有内部 Kubernetes API 客户端之间的通信。客户端包括 kubelet、控制器管理器和调度器。

  • 前端代理 CA:前端代理 CA 的证书可保护与汇总 API 的通信。

您可以为每个 CA 提供唯一的证书/密钥对,也可以为多个 CA 重复使用一个证书/密钥对。

您可以在创建集群(仅限 bmctl 方法)CA 轮替期间应用证书/密钥对。自定义集群 CA 功能适用于所有集群类型:管理员、用户、混合和独立集群。

前提条件

您需要根据以下规则准备自己的根 CA:

  • 自定义 CA 是根 CA,每个 CA 都由自签名证书文件和私钥文件组成。

  • 不支持中间 CA 和从属 CA。

  • 对于证书,我们建议您使用唯一编码规则 (DER) 格式(请参阅关于 ASN.1 编码规则的建议 X.690)。 您的证书文件应包含 base64 编码数据,前缀是 ‑‑‑‑‑BEGIN CERTIFICATE‑‑‑‑‑,后跟 ‑‑‑‑END CERTIFICATE‑‑‑‑‑

  • 对于私钥,我们建议您使用公钥加密标准 (PKCS) #1 格式。密钥文件应包含前缀为 ‑‑‑‑BEGIN RSA PRIVATE KEY‑‑‑‑ 且后跟 ‑‑‑‑END RSA PRIVATE KEY‑‑‑‑ 的 base64 编码数据。

  • 为了最大限度地减少潜在的集群中断,自定义 CA 的有效期不应超过五年。我们建议使用更长的有效期,例如 10 到 30 年。

  • 确保证书和密钥文件位于运行 bmctl CLI 的管理员工作站上。

  • 运行 bmctl 命令的用户必须有权访问您存储文件的目录。我们建议您将这些文件放在用于证书和密钥的现有目录中。例如,您可以将文件与您的服务帐号密钥一起存储在 ~/baremetal/bmctl-workspace/.sa-keys 中。

  • 运行 bmctl 命令的用户必须具有这些文件的读取权限。

在创建集群期间使用自定义 CA

使用 bmctl 创建集群时,首先更新集群配置文件,以描述集群功能和设置。如需在集群创建期间使用自定义集群 CA 功能,您可以通过两个选项在集群配置文件中指定自定义集群 CA:

  • 指定 CA 证书文件和私钥文件的路径
  • 仅指定私钥文件的路径

如果您只指定私钥,bmctl 会在同一目录中查找相应的 CA 证书文件。证书文件必须与相应的私钥文件具有相同的名称,并且文件扩展名必须与 .crt 相同。例如,如果私钥路径为 /custom-ca/cluster_ca.key,则 bmctl 希望证书路径为 /custom-ca/cluster_ca.crt

无论是哪种情况,路径都在配置文件的凭据部分指定,如以下示例所示。

示例 1:指定证书和密钥路径

以下内容摘录自集群配置文件,展示了如何为每个集群 CA 指定证书和密钥文件的路径。在此示例中,CA 证书和密钥文件与服务帐号 JSON 密钥文件位于同一目录中。

gcrKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-gcr.json
...
cloudOperationsServiceAccountKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-cloud-ops.json
clusterCACertPath: bmctl-workspace/.sa-keys/cluster_ca_cert.pem
clusterCAPrivateKeyPath: bmctl-workspace/.sa-keys/cluster_ca_key.pem
etcdCACertPath: bmctl-workspace/.sa-keys/etcd_ca_cert.pem
etcdCAPrivateKeyPath: bmctl-workspace/.sa-keys/etcd_ca_key.pem
frontProxyCACertPath: bmctl-workspace/.sa-keys/front_proxy_ca_cert.pem
frontProxyCAPrivateKeyPath: bmctl-workspace/.sa-keys/front_proxy_ca_key.pem
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin-test
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
...

示例 2:仅指定私钥路径

集群配置文件中的以下摘录显示如何仅指定密钥文件的路径。在此示例中,CA 私钥文件与服务帐号 JSON 密钥文件位于同一目录中。相应的 CA 证书文件也必须位于 /.sa-keys 目录中。证书文件的文件名与密钥文件相同,但扩展名为 .crt。因此,etcd CA 证书文件的名称为 etcd_ca.crt

gcrKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-gcr.json
...
cloudOperationsServiceAccountKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-cloud-ops.json
clusterCAPrivateKeyPath: bmctl-workspace/.sa-keys/cluster_ca_key.pem
etcdCAPrivateKeyPath: bmctl-workspace/.sa-keys/etcd_ca_key.pem
frontProxyCAPrivateKeyPath: bmctl-workspace/.sa-keys/front_proxy_ca_key.pem
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin-test
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
...

示例 3:重复使用一对 CA 证书和密钥文件

集群配置文件中的以下摘录显示如何仅指定密钥文件的路径。在此示例中,单个证书/密钥对用于所有集群 CA。CA 证书和私钥文件都位于 /custom-ca 目录中。按照命名惯例,CA 证书的文件名为 custom_ca.crt

gcrKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-gcr.json
...
cloudOperationsServiceAccountKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-cloud-ops.json
clusterCAPrivateKeyPath: /custom-ca/custom_ca.key
etcdCAPrivateKeyPath: /custom-ca/custom_ca.key
frontProxyCAPrivateKeyPath: /custom-ca/custom_ca.key
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin-test
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
...

在 CA 轮替期间使用自定义 CA

轮替 CA 时,您可以指定自定义集群 CA 证书和私钥文件的路径。您可以采用的选项类似于在创建集群期间指定自定义集群 CA 的选项。运行 bmctl update credentials certificate-authorities rotate 命令时,您可以使用以下选项:

  • 指定自定义 CA 证书文件和私钥文件的路径。
  • 仅指定自定义 CA 私钥文件的路径。相应的 CA 证书文件必须位于同一目录中,与密钥文件同名,并且具有 .crt 文件扩展名。
  • 通过为多个集群 CA 指定相同的证书和密钥路径,重复使用 CA 证书/密钥对。
  • 省略自定义 CA 路径的参数。如果您在轮替 CA 时未指定自定义 CA 路径,GKE on Bare Metal 将创建并使用标准集群 CA。

示例 1:指定 CA 证书和私钥路径

bmctl update credentials certificate-authorities rotate \
    --cluster CLUSTER_NAME \
    --kubeconfig ADMIN_KUBECONFIG \
    --cluster-ca-cert-path=CLUSTER_CA_CERT_PATH \
    --cluster-ca-private-key-path=CLUSTER_CA_KEY_PATH \
    --etcd-ca-cert-path=ETCD_CA_CERT_PATH \
    --etcd-ca-private-key-path=ETCD_CA_KEY_PATH \
    --front-proxy-ca-cert-path=FRONT_PROXY_CA_CERT_PATH \
    --front-proxy-ca-private-key-path=FRONT_PROXY_CA_KEY_PATH

替换以下内容:

  • CLUSTER_NAME:要为其轮替 CA 的集群的名称。
  • ADMIN_KUBECONFIG:管理员集群 kubeconfig 文件的路径。对于自行管理的集群,此文件是集群的 kubeconfig 文件。
  • CLUSTER_CA_CERT_PATH:集群 CA 证书文件的路径。
  • CLUSTER_CA_KEY_PATH:集群 CA 私钥文件的路径。
  • ETCD_CA_CERT_PATH:etcd CA 证书文件的路径。
  • ETCD_CA_KEY_PATH:etcd CA 私钥文件的路径。
  • FRONT_PROXY_CA_CERT_PATH:前端代理证书文件的路径。
  • FRONT_PROXY_CA_KEY_PATH:前端代理私钥文件的路径。

示例 2:仅指定私钥路径

bmctl update credentials certificate-authorities rotate \
    --cluster CLUSTER_NAME \
    --kubeconfig ADMIN_KUBECONFIG \
    --cluster-ca-private-key-path=CLUSTER_CA_KEY_PATH \
    --etcd-ca-private-key-path=ETCD_CA_KEY_PATH \
    --front-proxy-ca-private-key-path=FRONT_PROXY_CA_KEY_PATH

替换以下内容:

  • CLUSTER_NAME:要为其轮替 CA 的集群的名称。
  • ADMIN_KUBECONFIG:管理员集群 kubeconfig 文件的路径。对于自行管理的集群,此文件是集群的 kubeconfig 文件。
  • CLUSTER_CA_KEY_PATH:集群 CA 私钥文件的路径。
  • ETCD_CA_KEY_PATH:etcd CA 私钥文件的路径。
  • FRONT_PROXY_CA_KEY_PATH:前端代理私钥文件的路径。