使用自訂叢集憑證授權單位

叢集憑證授權單位 (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、控制器管理工具和排程器。

  • 前端 Proxy CA:前端 Proxy CA 的憑證可確保與匯總 API 的通訊安全。

您可以為每個 CA 提供專屬的憑證金鑰配對,也可以為多個 CA 重複使用一組憑證金鑰配對。

您會在叢集建立期間 (僅限 bmctl 方法)CA 輪替期間套用憑證金鑰配對。自訂叢集 CA 功能適用於所有叢集類型:管理員、使用者、混合和獨立。

必要條件

您應負責根據下列規則準備自己的根 CA:

  • 自訂 CA 是根 CA,每個 CA 都包含自簽憑證檔案和私密金鑰檔案。

  • 建議您使用唯一編碼規則 (DER) 格式的憑證 (請參閱 ASN.1 編碼規則的建議 X.690)。憑證檔案應包含採用 Base64 編碼的資料,且前面加上 ‑‑‑‑‑BEGIN CERTIFICATE‑‑‑‑‑,後面加上 ‑‑‑‑END CERTIFICATE‑‑‑‑‑

  • 私密金鑰建議使用公開金鑰密碼編譯標準 (PKCS) #1 格式。金鑰檔案應包含以 Base64 編碼的資料,前面加上 ‑‑‑‑BEGIN RSA PRIVATE KEY‑‑‑‑,後面加上 ‑‑‑‑END RSA PRIVATE KEY‑‑‑‑

  • 為盡量減少叢集可能發生的中斷情形,自訂 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 憑證和私密金鑰檔案都位於 /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:前端 Proxy 憑證檔案的路徑。
  • FRONT_PROXY_CA_KEY_PATH:前端 Proxy 私密金鑰檔案的路徑。

範例 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:前端 Proxy 私密金鑰檔案的路徑。

中繼憑證授權單位

1.29 版叢集支援使用中繼 CA 做為預先發布版功能。這項功能在所有支援的產品版本中,並非處於相同的發布階段:

與自訂 CA 的根 CA 需求類似,如要使用中繼 CA,您必須準備三組 CA。每個 CA 都包含 CA 憑證檔案和對應的私密金鑰檔案。您要為下列每個必要叢集 CA 提供 CA 憑證和金鑰檔案配對:

  • etcd CA
  • 叢集 CA
  • 前端 Proxy CA

與根 CA 相同,您可以為每個 CA 提供一組專屬的憑證金鑰,也可以在 CA 設定中指定相同檔案路徑,為多個 CA 重複使用一組憑證金鑰。

使用中繼 CA 時,CA 憑證檔案應包含整個憑證鏈結,包括從中繼 CA 到根 CA 的憑證。憑證會依簽署順序反向列出,最上方是最後一個中繼 CA 憑證,最下方則是根 CA 憑證。

在以下範例中 (從底部的根 CA 開始),順序表示:

  • 根 CA 簽署了中繼 CA-A 憑證
  • 中繼 CA-A 簽署中繼 CA-B 憑證
  • 鏈結會繼續向上延伸,直到最終的 Intermediate-Y CA 憑證,該憑證是由 Intermediate-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