從 Pod 存取 Kubernetes API
本指南示範如何從 Pod 內存取 Kubernetes API。
開始之前
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未作為控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 操場之一
從 Pod 內存取 API
從 Pod 內存取 API 時,定位和驗證 API 伺服器與外部用戶端案例略有不同。
從 Pod 使用 Kubernetes API 最簡單的方式是使用官方的 用戶端程式庫 之一。這些程式庫可以自動探索 API 伺服器並進行驗證。
使用官方用戶端程式庫
從 Pod 內,連線至 Kubernetes API 的建議方式如下
對於 Go 用戶端,請使用官方的 Go 用戶端程式庫。
rest.InClusterConfig()
函數會自動處理 API 主機探索和驗證。請參閱 此處的範例。對於 Python 用戶端,請使用官方的 Python 用戶端程式庫。
config.load_incluster_config()
函數會自動處理 API 主機探索和驗證。請參閱 此處的範例。還有許多其他程式庫可用,請參閱 用戶端程式庫 頁面。
在每種情況下,Pod 的服務帳戶認證都用於與 API 伺服器安全地通訊。
直接存取 REST API
在 Pod 中執行時,您的容器可以透過擷取 KUBERNETES_SERVICE_HOST
和 KUBERNETES_SERVICE_PORT_HTTPS
環境變數來為 Kubernetes API 伺服器建立 HTTPS URL。API 伺服器的叢集內位址也會發佈到 default
命名空間中名為 kubernetes
的服務,以便 Pod 可以將 kubernetes.default.svc
參考為本機 API 伺服器的 DNS 名稱。
注意
Kubernetes 不保證 API 伺服器具有主機名稱kubernetes.default.svc
的有效憑證;但是,控制平面預期為主機名稱或 IP 位址提供有效憑證,$KUBERNETES_SERVICE_HOST
代表該主機名稱或 IP 位址。建議的 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"
}
]
}