從 Pod 存取 Kubernetes API

本指南示範如何從 Pod 內存取 Kubernetes API。

開始之前

您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未作為控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 操場之一

從 Pod 內存取 API

從 Pod 內存取 API 時,定位和驗證 API 伺服器與外部用戶端案例略有不同。

從 Pod 使用 Kubernetes API 最簡單的方式是使用官方的 用戶端程式庫 之一。這些程式庫可以自動探索 API 伺服器並進行驗證。

使用官方用戶端程式庫

從 Pod 內,連線至 Kubernetes API 的建議方式如下

在每種情況下,Pod 的服務帳戶認證都用於與 API 伺服器安全地通訊。

直接存取 REST API

在 Pod 中執行時,您的容器可以透過擷取 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT_HTTPS 環境變數來為 Kubernetes API 伺服器建立 HTTPS URL。API 伺服器的叢集內位址也會發佈到 default 命名空間中名為 kubernetes 的服務,以便 Pod 可以將 kubernetes.default.svc 參考為本機 API 伺服器的 DNS 名稱。

建議的 API 伺服器驗證方式是使用 服務帳戶 認證。依預設,Pod 與服務帳戶相關聯,並且該服務帳戶的認證 (權杖) 會放置在該 Pod 中每個容器的檔案系統樹狀結構中,位於 /var/run/secrets/kubernetes.io/serviceaccount/token

如果有的話,憑證套件會被放置到每個容器的檔案系統樹狀結構中,路徑為 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt,並且應該用來驗證 API 伺服器的伺服器憑證。

最後,用於命名空間 API 操作的預設命名空間會被放置在每個容器中路徑為 /var/run/secrets/kubernetes.io/serviceaccount/namespace 的檔案中。

使用 kubectl proxy

如果您想要在不使用官方用戶端程式庫的情況下查詢 API,您可以執行 kubectl proxy 作為 Pod 中新的 sidecar 容器的 指令。這樣一來,kubectl proxy 將會向 API 驗證身分,並將其暴露在 Pod 的 localhost 介面上,以便 Pod 中的其他容器可以直接使用它。

不使用 proxy 的情況

可以透過將身份驗證令牌直接傳遞到 API 伺服器來避免使用 kubectl proxy。內部憑證會保護連線安全。

# Point to the internal API server hostname
APISERVER=https://kubernetes.default.svc

# Path to ServiceAccount token
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# Reference the internal certificate authority (CA)
CACERT=${SERVICEACCOUNT}/ca.crt

# Explore the API with TOKEN
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api

輸出結果會類似於這樣

{
  "kind": "APIVersions",
  "versions": ["v1"],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}
上次修改時間為 2023 年 2 月 19 日下午 9:42 PST:Clean up page in tasks/run-application (ba99616c27)