Kubernetes 訪問集群

2022-06-15 11:00 更新

使用 kubectl 完成集群的第一次訪問

當(dāng)你第一次訪問 Kubernetes API 的時(shí)候,我們建議你使用 Kubernetes CLI 工具 ?kubectl?。

訪問集群時(shí),你需要知道集群的地址并且擁有訪問的憑證。通常,這些在你通過 啟動(dòng)安裝安裝集群時(shí)都是自動(dòng)安裝好的,或者其他人安裝時(shí) 也應(yīng)該提供了憑證和集群地址。

通過以下命令檢查 kubectl 是否知道集群地址及憑證:

kubectl config view

直接訪問 REST API

Kubectl 處理 apiserver 的定位和身份驗(yàn)證。 如果要使用 curl 或 wget 等 http 客戶端或?yàn)g覽器直接訪問 REST API,可以通過 多種方式查找和驗(yàn)證:

  • 以代理模式運(yùn)行 kubectl。
    • 推薦此方式。
    • 使用已存儲(chǔ)的 apiserver 地址。
    • 使用自簽名的證書來驗(yàn)證 apiserver 的身份。杜絕 MITM 攻擊。
    • 對(duì) apiserver 進(jìn)行身份驗(yàn)證。
    • 未來可能會(huì)實(shí)現(xiàn)智能化的客戶端負(fù)載均衡和故障恢復(fù)。
  • 直接向 http 客戶端提供位置和憑據(jù)。
    • 可選的方案。
    • 適用于代理可能引起混淆的某些客戶端類型。
    • 需要引入根證書到你的瀏覽器以防止 MITM 攻擊。

使用 kubectl proxy

以下命令以反向代理的模式運(yùn)行 kubectl。它處理 apiserver 的定位和驗(yàn)證。 像這樣運(yùn)行:

kubectl proxy --port=8080

參閱 kubectl proxy 獲取更多詳細(xì)信息。

然后,你可以使用 curl、wget 或?yàn)g覽器訪問 API,如果是 IPv6 則用 [::1] 替換 localhost, 如下所示:

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 和剪切操作來為 default 服務(wù)帳戶創(chuàng)建令牌,如下所示:

首先,創(chuàng)建 Secret,請(qǐng)求默認(rèn) 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 ?方法實(shí)現(xiàn):

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? 參數(shù),這使得它很容易受到 MITM 攻擊。 當(dāng) kubectl 訪問集群時(shí),它使用存儲(chǔ)的根證書和客戶端證書來訪問服務(wù)器 (它們安裝在 ?~/.kube? 目錄中)。 由于集群證書通常是自簽名的,因此可能需要特殊配置才能讓你的 http 客戶端使用根證書。

在一些集群中,apiserver 不需要身份驗(yàn)證;它可能只服務(wù)于 localhost,或者被防火墻保護(hù), 這個(gè)沒有一定的標(biāo)準(zhǔn)。

以編程方式訪問 API

Kubernetes 官方提供對(duì) Go 和 Python 的客戶端庫支持。

Go 客戶端 

  • 想要獲得這個(gè)庫,請(qǐng)運(yùn)行命令:?go get k8s.io/client-go@kubernetes-<kubernetes-version-number>?, 有關(guān)詳細(xì)安裝說明,請(qǐng)參閱 INSTALL.md。 請(qǐng)參閱  https://github.com/kubernetes/client-go 以查看支持的版本。
  • 基于這個(gè) client-go 客戶端庫編寫應(yīng)用程序。 請(qǐng)注意,client-go 定義了自己的 API 對(duì)象,因此如果需要,請(qǐng)從 client-go 而不是從主存儲(chǔ)庫 導(dǎo)入 API 定義,例如,?import "k8s.io/client-go/kubernetes"? 才是對(duì)的。

Go 客戶端可以像 kubectl CLI 一樣使用相同的 kubeconfig 文件 來定位和驗(yàn)證 apiserver??蓞㈤?nbsp;示例

Python 客戶端

如果想要使用 Python 客戶端, 請(qǐng)運(yùn)行命令:?pip install kubernetes?。參閱 Python Client Library page 以獲得更詳細(xì)的安裝參數(shù)。

Python 客戶端可以像 kubectl CLI 一樣使用相同的 kubeconfig 文件 來定位和驗(yàn)證 apiserver,可參閱 示例。

從 Pod 中訪問 API 

當(dāng)你從 Pod 中訪問 API 時(shí),定位和驗(yàn)證 API 服務(wù)器會(huì)有些許不同。

請(qǐng)求重定向

重定向功能已棄用并被刪除。請(qǐng)改用代理(見下文)。

多種代理

使用 Kubernetes 時(shí)可能會(huì)遇到幾種不同的代理:

  1. kubectl 代理:
    • 在用戶的桌面或 Pod 中運(yùn)行
    • 代理從本地主機(jī)地址到 Kubernetes apiserver
    • 客戶端到代理將使用 HTTP
    • 代理到 apiserver 使用 HTTPS
    • 定位 apiserver
    • 添加身份驗(yàn)證頭部
  2. apiserver 代理:
    • 內(nèi)置于 apiserver 中
    • 將集群外部的用戶連接到集群 IP,否則這些 IP 可能無法訪問
    • 運(yùn)行在 apiserver 進(jìn)程中
    • 客戶端代理使用 HTTPS(也可配置為 http)
    • 代理將根據(jù)可用的信息決定使用 HTTP 或者 HTTPS 代理到目標(biāo)
    • 可用于訪問節(jié)點(diǎn)、Pod 或服務(wù)
    • 在訪問服務(wù)時(shí)進(jìn)行負(fù)載平衡
  3. kube proxy:
    • 運(yùn)行在每個(gè)節(jié)點(diǎn)上
    • 代理 UDP 和 TCP
    • 不能代理 HTTP
    • 提供負(fù)載均衡
    • 只能用來訪問服務(wù)
  4. 位于 apiserver 之前的 Proxy/Load-balancer:
    • 存在和實(shí)現(xiàn)因集群而異(例如 nginx)
    • 位于所有客戶和一個(gè)或多個(gè) apiserver 之間
    • 如果有多個(gè) apiserver,則充當(dāng)負(fù)載均衡器
  5. 外部服務(wù)上的云負(fù)載均衡器:
    • 由一些云提供商提供(例如 AWS ELB,Google Cloud Load Balancer)
    • 當(dāng) Kubernetes 服務(wù)類型為 ?LoadBalancer ?時(shí)自動(dòng)創(chuàng)建
    • 只使用 UDP/TCP
    • 具體實(shí)現(xiàn)因云提供商而異。

除了前兩種類型之外,Kubernetes 用戶通常不需要擔(dān)心任何其他問題。 集群管理員通常會(huì)確保后者的正確配置。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)