訪問叢集
本文討論與叢集互動的多種方式。
首次使用 kubectl 訪問
首次訪問 Kubernetes API 時,我們建議使用 Kubernetes CLI,kubectl
。
要訪問叢集,你需要知道叢集的位置並擁有訪問它的憑據。通常,當你完成入門指南時,這會自動設定,或者由其他人設定叢集併為你提供憑據和位置。
使用此命令檢查 kubectl 知道的位置和憑據
kubectl config view
許多示例都提供了 kubectl
的入門介紹,完整文件可在 kubectl 參考中找到。
直接訪問 REST API
Kubectl 負責查詢 apiserver 並進行身份驗證。如果你想使用 curl 或 wget 等 http 客戶端,或使用瀏覽器直接訪問 REST API,有幾種方法可以查詢和進行身份驗證
- 以代理模式執行 kubectl。
- 推薦方法。
- 使用儲存的 apiserver 位置。
- 使用自簽名證書驗證 apiserver 身份。不可能發生 MITM 攻擊。
- 向 apiserver 進行身份驗證。
- 未來,可能會進行智慧的客戶端負載均衡和故障轉移。
- 直接向 http 客戶端提供位置和憑據。
- 替代方法。
- 適用於某些因使用代理而混淆的客戶端程式碼型別。
- 需要將根證書匯入瀏覽器以防止 MITM 攻擊。
使用 kubectl proxy
以下命令以反向代理模式執行 kubectl。它負責查詢 apiserver 並進行身份驗證。像這樣執行它
kubectl proxy --port=8080
有關更多詳細資訊,請參閱kubectl proxy。
然後你可以使用 curl、wget 或瀏覽器探索 API,對於 IPv6,將 localhost 替換為 [::1],如下所示
curl https://:8080/api/
輸出類似於:
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
不使用 kubectl 代理
使用 kubectl apply
和 kubectl describe secret...
為預設服務賬戶建立令牌,並結合 grep/cut
首先,建立 Secret,請求為預設 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
接下來,等待令牌控制器用令牌填充 Secret
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(如果 apiserver 配置為 http,則使用 http)
- 代理到目標可以根據可用資訊選擇使用 HTTP 或 HTTPS
- 可用於訪問 Node、Pod 或 Service
- 用於訪問 Service 時進行負載均衡
- 在每個節點上執行
- 代理 UDP 和 TCP
- 不理解 HTTP
- 提供負載均衡
- 僅用於訪問服務
apiserver(s) 前的代理/負載均衡器
- 存在和實現因叢集而異(例如 nginx)
- 位於所有客戶端和一個或多個 apiserver 之間
- 如果存在多個 apiserver,則充當負載均衡器。
外部服務上的雲負載均衡器
- 由一些雲提供商提供(例如 AWS ELB、Google Cloud Load Balancer)
- 當 Kubernetes 服務的型別為
LoadBalancer
時自動建立 - 僅使用 UDP/TCP
- 實現因雲提供商而異。
Kubernetes 使用者通常只需要關心前兩種代理型別。叢集管理員通常會確保後幾種代理型別已正確設定。