存取叢集

本主題討論與叢集互動的多種方式。

首次使用 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 applykubectl 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 官方支援 GoPython 用戶端程式庫。

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 時,您可能會遇到幾個不同的代理

  1. kubectl proxy

    • 在使用者的桌面或 Pod 中執行
    • 從 localhost 位址代理到 Kubernetes apiserver
    • 用戶端到代理使用 HTTP
    • 代理到 apiserver 使用 HTTPS
    • 定位 apiserver
    • 新增身份驗證標頭
  2. apiserver 代理

    • 是內建在 apiserver 中的堡壘
    • 將叢集外部的使用者連接到否則可能無法連線的叢集 IP
    • 在 apiserver 程序中執行
    • 用戶端到代理使用 HTTPS (或 http,如果 apiserver 如此設定)
    • 代理到目標可能會使用 HTTP 或 HTTPS,由代理使用可用資訊選擇
    • 可用於連線到節點、Pod 或服務
    • 當用於連線到服務時,會執行負載平衡
  3. kube proxy

    • 在每個節點上執行
    • 代理 UDP 和 TCP
    • 不理解 HTTP
    • 提供負載平衡
    • 僅用於連線服務
  4. 位於 API 伺服器 (apiserver) 前方的代理/負載平衡器

    • 存在和實作方式因叢集而異(例如 nginx)
    • 位於所有用戶端和一個或多個 API 伺服器之間
    • 如果有多個 API 伺服器,則充當負載平衡器。
  5. 外部服務的雲端負載平衡器

    • 由一些雲端供應商提供(例如 AWS ELB、Google Cloud Load Balancer)
    • 當 Kubernetes 服務類型為 LoadBalancer 時自動建立
    • 僅使用 UDP/TCP
    • 實作方式因雲端供應商而異。

Kubernetes 使用者通常不需要擔心前兩種類型以外的任何事情。叢集管理員通常會確保後面的類型設定正確。

上次修改時間:2024 年 1 月 1 日下午 9:15 PST:修正多個連結錯誤 (8b46ec4047)