存取叢集
本主題討論與叢集互動的多種方式。
首次使用 kubectl 存取
首次存取 Kubernetes API 時,我們建議使用 Kubernetes CLI,kubectl
。
若要存取叢集,您需要知道叢集的位置並具有存取它的認證。通常,當您完成開始入門指南時,或其他人設定叢集並提供您認證和位置時,這會自動設定。
使用此命令檢查 kubectl 知道的位置和認證
kubectl config view
許多範例提供了 kubectl
使用的簡介,完整的說明文件可在 kubectl 參考中找到。
直接存取 REST API
Kubectl 處理定位和驗證到 apiserver。如果您想要使用 http 用戶端 (如 curl 或 wget) 或瀏覽器直接存取 REST API,則有幾種方法可以定位和驗證
- 在代理模式下執行 kubectl。
- 建議方法。
- 使用儲存的 apiserver 位置。
- 使用自我簽署憑證驗證 apiserver 的身分。不可能進行 MITM。
- 驗證到 apiserver。
- 未來,可能會進行智慧型用戶端負載平衡和容錯移轉。
- 直接將位置和認證提供給 http 用戶端。
- 替代方法。
- 適用於某些會因使用代理而感到困惑的用戶端程式碼類型。
- 需要將根憑證匯入您的瀏覽器以防止 MITM。
使用 kubectl proxy
下列命令在 kubectl 中以反向代理身分運作的模式下執行 kubectl。它處理定位 apiserver 和驗證。像這樣執行它
kubectl proxy --port=8080
請參閱 kubectl proxy 以取得更多詳細資訊。
然後您可以使用 curl、wget 或瀏覽器探索 API,將 localhost 替換為 IPv6 的 [::1],如下所示
curl http://localhost:8080/api/
輸出類似於這樣
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
沒有 kubectl proxy
使用 kubectl apply
和 kubectl describe secret...
來建立具有 grep/cut 的預設服務帳戶的權杖
首先,建立密鑰,請求預設 ServiceAccount 的權杖
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: default-token
annotations:
kubernetes.io/service-account.name: default
type: kubernetes.io/service-account-token
EOF
接下來,等待權杖控制器使用權杖填入密鑰
while ! kubectl describe secret default-token | grep -E '^token' >/dev/null; do
echo "waiting for token..." >&2
sleep 1
done
擷取和使用產生的權杖
APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
TOKEN=$(kubectl describe secret default-token | grep -E '^token' | cut -f2 -d':' | tr -d " ")
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
輸出類似於這樣
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
使用 jsonpath
APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
TOKEN=$(kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode)
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
輸出類似於這樣
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
上述範例使用 --insecure
旗標。這使其容易受到 MITM 攻擊。當 kubectl 存取叢集時,它會使用儲存的根憑證和用戶端憑證來存取伺服器。(這些安裝在 ~/.kube
目錄中)。由於叢集憑證通常是自我簽署的,因此可能需要特殊組態才能讓您的 http 用戶端使用根憑證。
在某些叢集上,apiserver 不需要身份驗證;它可能會在 localhost 上提供服務,或受到防火牆保護。沒有針對此的標準。控制對 API 的存取 說明叢集管理員如何設定此項。
程式化存取 API
Kubernetes 官方支援 Go 和 Python 用戶端程式庫。
Go 用戶端
- 若要取得程式庫,請執行下列命令:
go get k8s.io/client-go@kubernetes-<kubernetes-version-number>
,請參閱 INSTALL.md 以取得詳細的安裝指示。請參閱 https://github.com/kubernetes/client-go 以查看支援哪些版本。 - 在 client-go 用戶端之上撰寫應用程式。請注意,client-go 定義了自己的 API 物件,因此如果需要,請從 client-go 匯入 API 定義,而不是從主要儲存庫匯入,例如,
import "k8s.io/client-go/kubernetes"
是正確的。
Go 用戶端可以使用與 kubectl CLI 相同的 kubeconfig 檔案 來定位和驗證到 apiserver。請參閱此 範例。
如果應用程式部署為叢集中的 Pod,請參閱下一節。
Python 用戶端
若要使用 Python 用戶端,請執行下列命令:pip install kubernetes
。請參閱 Python 用戶端程式庫頁面 以取得更多安裝選項。
Python 用戶端可以使用與 kubectl CLI 相同的 kubeconfig 檔案 來定位和驗證到 apiserver。請參閱此 範例。
其他語言
有 用戶端程式庫 可用於從其他語言存取 API。請參閱其他程式庫的文件,以了解它們如何驗證身分。
從 Pod 存取 API
從 Pod 存取 API 時,定位和驗證到 API 伺服器的方式有些不同。
請查看 從 Pod 內部存取 API 以取得更多詳細資訊。
存取在叢集上執行的服務
上一節說明如何連接到 Kubernetes API 伺服器。如需有關連接到在 Kubernetes 叢集上執行的其他服務的資訊,請參閱 存取叢集服務。
請求重新導向
重新導向功能已被淘汰並已移除。請改用代理 (請參閱下方)。
這麼多代理
使用 Kubernetes 時,您可能會遇到幾個不同的代理
- 在使用者的桌面或 Pod 中執行
- 從 localhost 位址代理到 Kubernetes apiserver
- 用戶端到代理使用 HTTP
- 代理到 apiserver 使用 HTTPS
- 定位 apiserver
- 新增身份驗證標頭
- 是內建在 apiserver 中的堡壘
- 將叢集外部的使用者連接到否則可能無法連線的叢集 IP
- 在 apiserver 程序中執行
- 用戶端到代理使用 HTTPS (或 http,如果 apiserver 如此設定)
- 代理到目標可能會使用 HTTP 或 HTTPS,由代理使用可用資訊選擇
- 可用於連線到節點、Pod 或服務
- 當用於連線到服務時,會執行負載平衡
- 在每個節點上執行
- 代理 UDP 和 TCP
- 不理解 HTTP
- 提供負載平衡
- 僅用於連線服務
位於 API 伺服器 (apiserver) 前方的代理/負載平衡器
- 存在和實作方式因叢集而異(例如 nginx)
- 位於所有用戶端和一個或多個 API 伺服器之間
- 如果有多個 API 伺服器,則充當負載平衡器。
外部服務的雲端負載平衡器
- 由一些雲端供應商提供(例如 AWS ELB、Google Cloud Load Balancer)
- 當 Kubernetes 服務類型為
LoadBalancer
時自動建立 - 僅使用 UDP/TCP
- 實作方式因雲端供應商而異。
Kubernetes 使用者通常不需要擔心前兩種類型以外的任何事情。叢集管理員通常會確保後面的類型設定正確。