訪問叢集

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

首次使用 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 applykubectl 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 正式支援 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 代理

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

    • 是內建在 apiserver 中的堡壘機
    • 將叢集外部的使用者連線到可能無法訪問的叢集 IP
    • 執行在 apiserver 程序中
    • 客戶端到代理使用 HTTPS(如果 apiserver 配置為 http,則使用 http)
    • 代理到目標可以根據可用資訊選擇使用 HTTP 或 HTTPS
    • 可用於訪問 Node、Pod 或 Service
    • 用於訪問 Service 時進行負載均衡
  3. kube 代理

    • 在每個節點上執行
    • 代理 UDP 和 TCP
    • 不理解 HTTP
    • 提供負載均衡
    • 僅用於訪問服務
  4. apiserver(s) 前的代理/負載均衡器

    • 存在和實現因叢集而異(例如 nginx)
    • 位於所有客戶端和一個或多個 apiserver 之間
    • 如果存在多個 apiserver,則充當負載均衡器。
  5. 外部服務上的雲負載均衡器

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

Kubernetes 使用者通常只需要關心前兩種代理型別。叢集管理員通常會確保後幾種代理型別已正確設定。

上次修改時間為 2024 年 1 月 1 日太平洋標準時間晚上 9:15:修復多處連結錯誤 (8b46ec4047)