跳至主要内容

Kubeconfig

Kubeconfig 資源​

Kubeconfig 是一個 Rancher 資源 kubeconfigs.ext.cattle.io,允許產生 v1.Config kubeconfig 檔案,用於與 Rancher 和由 Rancher 管理的叢集互動。

kubectl api-resources --api-group=ext.cattle.io

要取得 Kubeconfig 資源的欄位和結構的描述,請執行:

kubectl explain kubeconfigs.ext.cattle.io

建立 Kubeconfig​

只有有效且啟用的 Rancher 使用者才能建立 Kubeconfig。例如,嘗試使用 system:admin 服務帳戶建立 Kubeconfig 將導致錯誤:

kubectl create -o jsonpath='{.status.value}' -f -<<EOF
apiVersion: ext.cattle.io/v1
kind: Kubeconfig
EOF
Error from server (Forbidden): error when creating "STDIN": kubeconfigs.ext.cattle.io is forbidden: user system:admin is not a Rancher user
重要

kubeconfig 內容在 Kubeconfig 成功建立時會產生並僅一次在 .status.value 欄位中回傳,因為它包含所建立 token 的機密值。因此,必須使用適當的輸出選項來擷取它,例如 -o jsonpath='{.status.value}' 或 -o yaml。

可以一次為多個叢集建立 kubeconfig,方法是在 spec.clusters 欄位中指定叢集名稱列表。您可以透過列出 clusters.management.cattle.io 資源來查詢叢集名稱。

kubectl get clusters.management.cattle.io -o=jsonpath="{.items[*]['metadata.name', 'spec.displayName']}{'\n'}"
local local
c-m-p66cdvlj downstream1

metadata.name 和 metadata.generateName 欄位會被忽略,新 Kubeconfig 的名稱會使用前綴 kubeconfig- 自動產生。

您可以使用 spec.currentContext 欄位來設定叢集名稱,它用於設定 kubeconfig 中的當前上下文。如果您未設定 spec.currentContext 欄位,則 spec.clusters 列表中的第一個叢集將用作當前上下文。對於未設定 FQDN 的啟用 ACE 的叢集,第一個控制平面節點將用作當前上下文。

對於啟用 ACE 的叢集,如果設定了 FQDN,則該 FQDN 將用作 kubeconfig 中的叢集項目;否則,將為所有控制平面節點建立項目。

kubectl create -o jsonpath='{.status.value}' -f -<<EOF
apiVersion: ext.cattle.io/v1
kind: Kubeconfig
spec:
clusters: [c-m-p66cdvlj, c-m-fcd3g5h]
description: My Kubeconfig
currentContext: c-m-p66cdvlj
EOF

如果在 spec.clusters 欄位中將 "*" 指定為第一個項目,則將為使用者有權存取的所有叢集建立 kubeconfig (如果有的話)。

kubectl create -o jsonpath='{.status.value}' -f -<<EOF
apiVersion: ext.cattle.io/v1
kind: Kubeconfig
spec:
clusters: ["*"]
description: My Kubeconfig
EOF

如果未指定 spec.ttl,則 Kubeconfig 的 token 將使用 kubeconfig-default-token-ttl-minutes 設定中定義的過期時間建立,預設為 30 天。如果指定了 spec.ttl,則應大於 0 且小於或等於以秒為單位表示的 kubeconfig-default-token-ttl-minutes 設定值。

kubectl create -o jsonpath='{.status.value}' -f -<<EOF
apiVersion: ext.cattle.io/v1
kind: Kubeconfig
spec:
clusters: [c-m-p66cdvlj] # Downstream cluster
ttl: 7200 # 2 hours
EOF

列出 Kubeconfig​

列出先前產生的 Kubeconfig 對於清理後端 token 非常有用,如果不再需要 Kubeconfig (例如,它是暫時發行的)。管理員可以列出所有 Kubeconfig,而一般使用者只能檢視自己的。

kubectl get kubeconfig
NAME TTL TOKENS STATUS AGE
kubeconfig-zp786 30d 2/2 Complete 18d
kubeconfig-7zvzp 30d 1/1 Complete 12d
kubeconfig-jznml 30d 1/1 Complete 12d

Use -o wide to get more details:

kubectl get kubeconfig -o wide
NAME TTL TOKENS STATUS AGE USER CLUSTERS DESCRIPTION
kubeconfig-zp786 30d 2/2 Complete 18d user-w5gcf * all clusters
kubeconfig-7zvzp 30d 1/1 Complete 12d u-w7drc *
kubeconfig-jznml 30d 1/1 Complete 12d u-w7drc *

檢視 Kubeconfig​

管理員可以取得任何 Kubeconfig,而一般使用者只能取得自己的。

kubectl get kubeconfig kubeconfig-zp786
NAME TTL TOKENS STATUS AGE
kubeconfig-zp786 30d 2/2 Complete 18d

Use -o wide to get more details:

kubectl get kubeconfig kubeconfig-zp786 -o wide
NAME TTL TOKENS STATUS AGE USER CLUSTERS DESCRIPTION
kubeconfig-zp786 30d 2/2 Complete 18d user-w5gcf * all clusters

刪除 Kubeconfig​

管理員可以刪除任何 Kubeconfig,而一般使用者只能刪除自己的。當刪除 Kubeconfig 時,kubeconfig token 也會被刪除。

kubectl delete kubeconfig kubeconfig-zp786
kubeconfig.ext.cattle.io "kubeconfig-zp786" deleted

To delete a Kubeconfig using preconditions:

cat <<EOF | k delete --raw /apis/ext.cattle.io/v1/kubeconfigs/kubeconfig-zp786 -f -
{
"apiVersion": "v1",
"kind": "DeleteOptions",
"preconditions": {
"uid": "52183e05-d382-47d2-b4b9-d0735823ce90",
"resourceVersion": "31331505"
}
}
EOF

刪除 Kubeconfig 集合​

管理員可以刪除任何 Kubeconfig,而一般使用者只能刪除自己的。

要刪除所有 Kubeconfig:

kubectl delete --raw /apis/ext.cattle.io/v1/kubeconfigs

要依標籤刪除 Kubeconfig 集合:

kubectl delete --raw /apis/ext.cattle.io/v1/kubeconfigs?labelSelector=foo%3Dbar

更新 Kubeconfig​

只有 metadata (例如新增標籤或註解) 和 spec.description 欄位可以更新。所有其他 spec 欄位都是不可變的。

要編輯 Kubeconfig:

kubectl edit kubeconfig kubeconfig-zp786

要修補 Kubeconfig 並更新其描述:

kubectl patch kubeconfig kubeconfig-zp786 -type merge -p '{"spec":{"description":"Updated description"}}'
kubeconfig.ext.cattle.io/kubeconfig-zp786 patched

kubectl get kubeconfig kubeconfig-fdcpl -o jsonpath='{.spec.description}'
Updated description

要修補 Kubeconfig 並新增標籤:

kubectl patch kubeconfig kubeconfig-zp786 -type merge -p '{"metadata":{"labels":{"foo":"bar"}}}'
kubeconfig.ext.cattle.io/kubeconfig-zp786 patched

kubectl get kubeconfig kubeconfig-zp786 -o jsonpath='{.metadata.labels.foo}'
bar