集群证书授权机构 (CA) 会颁发证书并对其进行签名,以便在集群组件之间实现安全的身份验证和加密。默认情况下,在 Google Distributed Cloud 中,Cluster API 会在您创建新集群时创建集群 CA。本文档介绍如何将自己的证书授权机构用于 Google Distributed Cloud。使用自定义集群 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 都包含一个自签名证书文件和一个私钥文件。
对于证书,我们建议您使用唯一编码规则 (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
命令的管理员工作站上。运行
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 路径,Google Distributed Cloud 会创建并使用标准集群 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:前端代理私钥文件的路径。
中间 CA
1.29 版集群支持使用中间 CA 作为预览版功能。此功能在所有受支持的产品版本中处于不同的发布阶段:
- 1.29:预览版
- 1.28:不可用
- 1.16:不可用
与自定义 CA 的根 CA 要求类似,如需使用中间 CA,您必须准备三组 CA。每个 CA 都包含一个 CA 证书文件及其对应的私钥文件。您需要为以下每个必需的集群 CA 提供一个 CA 证书和密钥文件对:
- etcd CA
- 集群 CA
- 前端代理 CA
与根 CA 一样,您可以为每个 CA 提供唯一的证书-密钥对,也可以通过在 CA 配置中指定相同的文件路径,为多个 CA 重复使用一个证书-密钥对。
使用中间 CA 时,CA 证书文件应包含整个证书链,其中包括从中间 CA 到根 CA 的证书。证书按其签名顺序的反向顺序列出,即最后一个中间 CA 证书位于顶部,根 CA 证书位于底部。
在以下示例中(从底部的根 CA 开始),顺序表示:
- 根 CA 对中间 A CA 证书进行了签名
- 中间 A CA 对中间 B CA 证书进行了签名
- 证书链继续向上,来到了最终的中间 Y CA 证书,该证书由中间 X CA 签名
-----BEGIN CERTIFICATE-----
<Intermediate-Y CA CERT CONTENT>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Intermediate-X CA CERT CONTENT>
-----END CERTIFICATE-----
...
-----BEGIN CERTIFICATE-----
<Intermediate-B CA CERT CONTENT>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Intermediate-A CA CERT CONTENT>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<ROOT CA CERT CONTENT>
-----END CERTIFICATE-----
要继续使用此示例,与中间 Y CA 证书关联的私钥应与 CA 证书链一起传递,就像在自定义 CA 中一样。
-----BEGIN RSA PRIVATE KEY-----
<Intermediate-Y PRIVATE KEY CONTENT>
-----END RSA PRIVATE KEY-----
如需检查集群是否正在使用中间 CA,请检查集群的 CA Secret 中的证书数量:
kubectl get secret CLUSTER_NAME-ca \
--kubeconfig ADMIN_KUBECONFIG
-n cluster-CLUSTER_NAME \
-o jsonpath='{.data.tls\.crt}' | base64 --decode | grep "BEGIN CERTIFICATE" | wc -l