本主題說明如何在具有獨立管理叢集的 Tanzu Kubernetes Grid (TKG) 中,啟用及設定身分識別管理。
您可以設定 LDAPS 或 OIDC 身分識別提供者,以便在管理叢集部署期間或之後,啟用身分識別管理。啟用身分識別管理後所建立的任何工作負載叢集,都會自動設定成使用與管理叢集相同的身分識別提供者。若要追溯設定最近啟用身分識別管理的現有工作負載叢集,請遵循在工作負載叢集上啟用身分識別管理。
啟用和設定身分識別管理包括以下步驟。如果要使用標準的非管理員 kubeconfig
檔案,來存取管理和工作負載叢集,在完成本主題中的步驟後,還必須依照設定 RBAC 中的指示,來設定角色型存取控制 (RBAC)。
(建議) 在管理叢集部署期間,啟用和設定身分識別管理:
如需相關指示,請參閱下面的 (建議) 在管理叢集部署期間,啟用和設定身分識別管理。
在管理叢集部署之後,啟用和設定身分識別管理:
如需相關指示,請參閱下面的在現有部署中啟用和設定身分識別管理。
本節說明如何在管理叢集部署期間,啟用和設定身分識別管理。
您必須先要有身分識別提供者,才能啟用身分識別管理。Tanzu Kubernetes Grid 支援 LDAPS 和 OIDC 身分識別提供者。
若要使用 Okta 作為 OIDC 提供者,您必須在 Okta 中建立帳戶,並使用您的帳戶登錄一個 Tanzu Kubernetes Grid 應用程式:
http://localhost:8080/callback
。在部署管理叢集後,您將以實際 URL 來更新此 URL。使用上述取得的詳細資料,在 Tanzu Kubernetes Grid 中設定 LDAPS 或 OIDC:
如果要從組態檔來部署管理叢集,請在組態檔中設定 LDAP_*
或 OIDC_*
變數。
例如:
LDAP:
IDENTITY_MANAGEMENT_TYPE: ldap
LDAP_BIND_DN: ""
LDAP_BIND_PASSWORD: ""
LDAP_GROUP_SEARCH_BASE_DN: dc=example,dc=com
LDAP_GROUP_SEARCH_FILTER: (objectClass=posixGroup)
LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: memberUid
LDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn
LDAP_GROUP_SEARCH_USER_ATTRIBUTE: uid
LDAP_HOST: ldaps.example.com:636
LDAP_ROOT_CA_DATA_B64: ""
LDAP_USER_SEARCH_BASE_DN: ou=people,dc=example,dc=com
LDAP_USER_SEARCH_FILTER: (objectClass=posixAccount)
LDAP_USER_SEARCH_NAME_ATTRIBUTE: uid
LDAP_USER_SEARCH_USERNAME: uid
OIDC:
IDENTITY_MANAGEMENT_TYPE: oidc
OIDC_IDENTITY_PROVIDER_CLIENT_ID: 0oa2i[...]NKst4x7
OIDC_IDENTITY_PROVIDER_CLIENT_SECRET: 331!b70[...]60c_a10-72b4
OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: groups
OIDC_IDENTITY_PROVIDER_ISSUER_URL: https://dev-[...].okta.com
OIDC_IDENTITY_PROVIDER_SCOPES: openid,groups,email
OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: email
如需如何準備管理叢集組態檔的指示,請參閱建立管理叢集組態檔。
附註每次 Dex TLS 憑證過期 (預設為 90 天) 時,都必須手動輪換 Dex Pod。您可以使用
CERT_DURATION
延長憑證持續時間。要重新啟動 Dex Pod,請執行kubectl rollout restart deployments/dex -n tanzu-system-auth
。
部署管理叢集後,請依照以下各節所述的程序,來完成身分識別管理的設定:
kubectl
連線至管理叢集。kubeconfig
檔案,來存取管理叢集,請為管理叢集設定 RBAC。kubectl
連線至管理叢集若要設定身分識別管理,您必須取得並使用管理叢集的 admin
內容:
取得管理叢集的 admin
內容。本主題中的程序使用名為 id-mgmt-test
的管理叢集。
tanzu mc kubeconfig get id-mgmt-test --admin
如果您的管理叢集命名為 id-mgmt-test
,應該會看到下列確認:Credentials of workload cluster 'id-mgmt-test' have been saved. You can now access the cluster by running 'kubectl config use-context id-mgmt-test-admin@id-mgmt-test'
。有了叢集的 admin
內容,您對叢集就擁有完整存取權,而無需利用 IDP 進行驗證。
將 kubectl
設定為管理叢集的 admin
內容:
kubectl config use-context id-mgmt-test-admin@id-mgmt-test
Tanzu Kubernetes Grid 會使用 Pinniped 來整合叢集與 OIDC 身分識別服務。啟用 OIDC 時,Tanzu Kubernetes Grid 會在 pinniped-supervisor
命名空間中建立 pinniped-supervisor
服務,並在 pinniped-concierge
命名空間中建立 pinniped-concierge
。遵循以下步驟,檢查 Pinniped 服務的狀態,並記下公開該服務的 EXTERNAL-IP
位址。
取得正在管理叢集中執行的服務的相關資訊。身分識別管理服務會在 pinniped-supervisor
命名空間中執行:
kubectl get services -n pinniped-supervisor
您可能會在輸出中看到以下項目:
具有 NSX Advanced Load Balancer (ALB) 的 vSphere:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/pinniped-supervisor LoadBalancer 100.70.70.12 20.52.230.18 5556:31234/TCP 84m
Amazon Web Services (AWS):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/pinniped-supervisor LoadBalancer 100.69.13.66 ab1[...]71.eu-west-1.elb.amazonaws.com 443:30865/TCP 56m
Azure:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/pinniped-supervisor LoadBalancer 100.69.169.220 20.54.226.44 443:30451/TCP 84m
沒有 NSX ALB 的 vSphere:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/pinniped-supervisor NodePort 100.70.70.12 <none> 5556:31234/TCP 84m
請記下以下資訊:
pinniped-supervisor
服務的外部位址,如 EXTERNAL-IP
下所列。pinniped-supervisor
服務執行所在的連接埠。在上述範例中,此連接埠為 31234
。檢查管理叢集中的所有服務是否正在執行。
kubectl get pods -A
Pinniped 服務可能需要幾分鐘才能啟動並執行。例如,在 AWS 和 Azure 部署中,該服務必須等待 LoadBalancer
IP 位址準備就緒。等看到 pinniped-post-deploy-job
已完成後,再繼續後續步驟。
NAMESPACE NAME READY STATUS RESTARTS AGE
[...]
pinniped-supervisor pinniped-post-deploy-job-hq8fc 0/1 Completed 0 85m
附註您能夠執行
kubectl get pods
,因為對於管理叢集,您使用的是admin
內容。如果使用者嘗試使用一般內容來連線至管理叢集,將無法存取其資源,因為他們尚未獲授權如此做。
Tanzu Kubernetes Grid 會使用 Pinniped,來整合叢集與 LDAP 身分識別服務,並使用 Dex 來公開服務端點。啟用 LDAP 時,Tanzu Kubernetes Grid 會在 pinniped-supervisor
命名空間中建立 pinniped-supervisor
服務,在 pinniped-concierge
命名空間中建立 pinniped-concierge
,以及在 tanzu-system-auth
命名空間中建立 dexsvc
。遵循以下步驟,檢查 LDAP 服務的狀態,並記下公開該服務的 EXTERNAL-IP
位址。
取得正在 tanzu-system-auth
命名空間的管理叢集中執行的服務的相關資訊:
kubectl get services -n tanzu-system-auth
您可能會在輸出中看到以下項目:
使用 NSX ALB 的 vSphere:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dexsvc LoadBalancer 100.70.70.12 20.52.230.18 443:30167/TCP 84m
AWS:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dexsvc LoadBalancer 100.65.184.107 a6e[...]74.eu-west-1.elb.amazonaws.com 443:32547/TCP 84m
Azure:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dexsvc LoadBalancer 100.69.169.220 20.54.226.44 443:30451/TCP 84m
沒有 NSX ALB 的 vSphere:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dexsvc NodePort 100.70.70.12 <none> 5556:30167/TCP 84m
檢查管理叢集中的所有服務是否正在執行:
kubectl get pods -A
Pinniped 服務可能需要幾分鐘才能啟動並執行。例如,在 AWS 和 Azure 部署中,該服務必須等待 LoadBalancer
IP 位址準備就緒。等看到 pinniped-post-deploy-job
已完成後,再繼續後續步驟。
NAMESPACE NAME READY STATUS RESTARTS AGE
[...]
pinniped-supervisor pinniped-post-deploy-job-hq8fc 0/1 Completed 0 85m
附註您能夠執行
kubectl get pods
,因為對於管理叢集,您使用的是admin
內容。如果使用者嘗試使用一般內容來連線至管理叢集,將無法存取其資源,因為他們尚未獲授權如此做。
如果您將管理叢集設定為使用 OIDC 驗證,則必須將該管理叢集的回撥 URI 提供給 OIDC 身分識別提供者。例如,如果您使用 OIDC,且您的 IDP 為 Okta,請執行以下步驟:
在 [登入 (Login)] 下,更新登入重新導向 URI (Login redirect URIs),以包含 pinniped-supervisor
執行所在節點的位址:
使用 NSX ALB 的 vSphere、AWS 和 Azure:新增您在上述程序中記下的 pinniped-supervisor
服務的外部 IP 位址和連接埠號碼:
https://EXTERNAL-IP/callback
沒有 NSX ALB 的 vSphere:新增您設定為 API 端點的 IP 位址,以及您在上述程序中記下的 pinniped-supervisor
連接埠號碼:
https://API-ENDPOINT-IP:31234/callback
在所有情況下,都必須指定 https
,而不是 http
。
如果您打算使用標準的非管理員 kubeconfig
檔案來存取管理叢集,請在完成身分識別管理的組態後,遵循 為管理叢集設定 RBAC 中的指示來設定 RBAC。
本節說明如何在現有部署中啟用和設定身分識別管理。
遵循上方取得身分識別提供者的詳細資料中的指示。
此程序會設定 Pinniped 附加元件,並在管理叢集中部署驗證元件。若要為 Pinniped 附加元件產生 Kubernetes 密碼,請執行下列動作:
將 kubectl
的內容設定為您的管理叢集。例如,對於名稱是 id-mgmt-test
的管理叢集:
kubectl config use-context id-mgmt-test-admin@id-mgmt-test
將您在部署管理叢集時所定義的組態設定複製到新檔案,以建立叢集組態檔。將以下設定新增到管理叢集組態檔,其中包括 OIDC 或 LDAP 身分識別提供者的詳細資料:
附註您只需要為管理叢集設定這些變數。
# Identity management type. This must be "oidc" or "ldap".
IDENTITY_MANAGEMENT_TYPE:
# Explicitly set the namespace, which for management clusters is "tkg-system".
NAMESPACE: tkg-system
# Set these variables if you want to configure OIDC.
OIDC_IDENTITY_PROVIDER_CLIENT_ID:
OIDC_IDENTITY_PROVIDER_CLIENT_SECRET:
OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM:
OIDC_IDENTITY_PROVIDER_ISSUER_URL:
OIDC_IDENTITY_PROVIDER_SCOPES: "email,profile,groups"
OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM:
# Set these variables if you want to configure LDAP.
LDAP_BIND_DN:
LDAP_BIND_PASSWORD:
LDAP_GROUP_SEARCH_BASE_DN:
LDAP_GROUP_SEARCH_FILTER:
LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE:
LDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn
LDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN
LDAP_HOST:
LDAP_ROOT_CA_DATA_B64:
LDAP_USER_SEARCH_BASE_DN:
LDAP_USER_SEARCH_EMAIL_ATTRIBUTE: DN
LDAP_USER_SEARCH_FILTER:
LDAP_USER_SEARCH_ID_ATTRIBUTE: DN
LDAP_USER_SEARCH_NAME_ATTRIBUTE:
LDAP_USER_SEARCH_USERNAME: userPrincipalName
# Set these variables if you want to configure certificate duration
CERT_DURATION: 2160h
CERT_RENEW_BEFORE: 360h
若要查看其中哪些變數是選用的且可以忽略,請移至用來設定身分識別提供者的變數 - OIDC 和用來設定身分識別提供者的變數 - LDAP。
如果您的管理叢集位於 Proxy 後面,請確定新的組態檔包含 Proxy 組態的詳細資料:
TKG_HTTP_PROXY:
TKG_HTTPS_PROXY:
TKG_NO_PROXY:
如需這些變數的詳細資訊,請參閱 Proxy 組態。
vSphere:將 VSPHERE_CONTROL_PLANE_ENDPOINT
組態設定變更成一個未用的 IP 位址來作為虛設值,以通過內部檢查。
請確定您的本機環境已將 IDENTITY_MANAGEMENT_TYPE
設定為 oidc
或 ldap
,而不是設定為 none
:
echo $IDENTITY_MANAGEMENT_TYPE
如果此變數設定為 none
,請執行 export
命令,以重設為 oidc
或 ldap
。
將 _TKG_CLUSTER_FORCE_ROLE
環境變數設定為 management
:
export _TKG_CLUSTER_FORCE_ROLE="management"
在 Windows 中,使用 SET
命令。
將 FILTER_BY_ADDON_TYPE
環境變數設定為 authentication/pinniped
,以便 tanzu cluster create
僅在與 Pinniped 相關的物件上運作:
export FILTER_BY_ADDON_TYPE="authentication/pinniped"
為 Pinniped 附加元件產生密碼:
tanzu cluster create CLUSTER-NAME --dry-run -f CLUSTER-CONFIG-FILE > CLUSTER-NAME-example-secret.yaml
其中:
CLUSTER-NAME
是目標管理叢集的名稱。CLUSTER-CONFIG-FILE
是您在上面所建立的組態檔。環境變數設定會使 tanzu cluster create --dry-run
產生 Kubernetes 密碼,而不是完整的叢集資訊清單。
檢閱密碼,然後將其套用至管理叢集。例如:
kubectl apply -f CLUSTER-NAME-example-secret.yaml
套用密碼後,執行 kubectl get app
命令,以檢查 Pinniped 附加元件的狀態:
$ kubectl get app CLUSTER-NAME-pinniped -n tkg-system
NAME DESCRIPTION SINCE-DEPLOY AGE
pinniped Reconcile succeeded 3m23s 7h50m
如果傳回的狀態為 Reconcile failed
,請執行以下命令,以取得有關失敗的詳細資料:
kubectl get app CLUSTER-NAME-pinniped -n tkg-system -o yaml
遵循上方完成身分識別管理的組態中的指示。
只要是您在管理叢集中啟用身分識別管理時建立的工作負載叢集,都會自動設定成使用相同的身分識別管理服務。
如果啟動機器是 Jumpbox 或是沒有顯示器的其他機器,則可以執行於本機機器上的瀏覽器,對叢集進行驗證。其作法取決於叢集的 Pinniped 版本,該版本來自叢集所依據的 Tanzu Kubernetes 版本:
叢集 TKr 版本 | 無瀏覽器驗證程序 |
---|---|
TKr v1.23.10 (Tanzu Kubernetes Grid v1.6.1 的預設值) 或更新版本 | 遵循以下指示 |
叢集是以較舊的 TKr 為基礎,或由舊版 Tanzu Kubernetes Grid 所建立 | 請遵循 Tanzu Kubernetes Grid v1.4 說明文件中的在沒有瀏覽器的機器上驗證使用者程序 |
附註Tanzu Kubernetes Grid v2.2 不支援根據非互動式帳戶或密碼授與,在無瀏覽器下進行 CLI 登入。
從本機機器上的終端機視窗中,執行 ssh
,以遠端登入啟動機器。
設定 TANZU_CLI_PINNIPED_AUTH_LOGIN_SKIP_BROWSER=true
環境變數。這會將 --skip-browser
選項新增到叢集的 kubeconfig
。
# Linux
export TANZU_CLI_PINNIPED_AUTH_LOGIN_SKIP_BROWSER=true
# Windows
set TANZU_CLI_PINNIPED_AUTH_LOGIN_SKIP_BROWSER=true
將叢集的標準 kubeconfig
匯出至本機檔案。請注意,此命令不包含 --admin
選項,因此所匯出的 kubeconfig
是標準 kubeconfig
,而不是 admin
版本。例如,若要將 kubeconfig
檔案匯出到 /tmp/my-cluster-kubeconfig
,請執行下列動作:
對於管理叢集,請執行:
tanzu mc kubeconfig get --export-file /tmp/my-cluster-kubeconfig
您會看到以下的確認:You can now access the cluster by specifying '--kubeconfig /tmp/my-mgmt-cluster-kubeconfig' flag when using 'kubectl' command
。
對於工作負載叢集,請執行:
tanzu cluster kubeconfig get my-cluster --export-file /tmp/my-cluster-kubeconfig
使用新建立的 kubeconfig
檔案來連線至叢集:
kubectl get pods -A --kubeconfig /tmp/my-cluster-kubeconfig
CLI 會輸出您身分識別提供者的登入連結。例如:
Log in by visiting this link:
https://10.180.105.166:31234/oauth2/authorize?access_type=offline&client_id=pinniped-cli&code_challenge=-aJ617vJZXZeEnHPab1V2_VHPmc5VwspFig5QQKyTwg&code_challenge_method=S256&nonce=cafaf8f4d2cb714ef8fb3320c1b088ba&redirect_uri=http%3A%2F%2F127.0.0.1%3A33087%2Fcallback&response_mode=form_post&response_type=code&scope=offline_access+openid+pinniped%3Arequest-audience&state=fff3d4d46b36359d5ba2f24fad471dd8
Optionally, paste your authorization code:
複製連結並貼到本機機器上的瀏覽器。
在瀏覽器中,登入您的身分識別提供者。此時會顯示頁面,提示您將授權碼貼到 CLI 中:
在出現 Optionally, paste your authorization code:
提示後,複製授權碼並貼到 CLI 中。
沿用您先前所用的相同 kubeconfig
檔案,再次連線至叢集:
kubectl get pods -A --kubeconfig FILE-PATH
如果您已為經過驗證的使用者,在叢集上設定了角色繫結,則輸出會顯示網繭資訊。
如果您未在叢集上設定角色繫結,您將看到一則訊息,指出拒絕使用者帳戶存取網繭:Error from server (Forbidden): pods is forbidden: User "[email protected]" cannot list resource "pods" in API group "" at the cluster scope
。發生這種情況的原因是,使用者已成功通過驗證,但他們尚未獲授權存取叢集上的任何資源。若要授權使用者存取叢集資源,您必須建立叢集角色繫結,以在叢集上設定 RBAC:
Pinniped 元件會將 Dex 用於 LDAP 身分識別提供者。對於 OIDC 身分識別提供者,則不使用 Dex。
如果您要在管理叢集 Pinniped 密碼的 values.yaml
區段中,更新以 dex.
開頭的設定,則必須執行以下步驟:
dex.
設定。請參閱自動管理套件 values.yaml 設定中的表格。在 Pinniped 密碼中,更新您在上面所識別的一或多個 dex.
設定,並遵循以下步驟進行:
dex.dns.INFRASTRUCTURE-PROVIDER.ipAddresses
和 dex.config.dns.INFRASTRUCTURE-PROVIDER.dnsNames
陣列組態設定。這些欄位可以設定為具有任何單一項目 (非空白) 的陣列,例如,0.0.0.0
,因為它們是自動更新的。pinniped.upstream_oidc_issuer_url
組態設定設為非空白的字串,且開頭是 https
。例如,https://0.0.0.0
。稍後將自動更新此欄位。dex.config.staticClients
陣列組態設定設為具有單一項目。此設定可以是至少具有 name
、id
和 secret
索引鍵的任何對應,例如 {name: "example-name", id: "example-id", secret: "example-secret"}
,因為它會自動更新。將下列覆疊新增到 Pinniped 密碼:
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"metadata": {"name" : "upstream-oidc-identity-provider"}})
---
metadata:
annotations:
#@overlay/remove
kapp.k14s.io/update-strategy: always-replace
套用 Pinniped 密碼。
tanzu-system-auth
命名空間。若要重新啟動命名空間,可以刪除 Namespace
,並等待 pinniped
App
重新建立它。套用 Pinniped 密碼後,您可能需要重新啟動 pinniped-supervisor
Namespace
中的 pinniped-post-deploy-job
Job
。為此,您可以刪除 Job
,並等待 pinniped
App
重新建立它。若要在啟用了身分識別管理的現有部署中停用身分識別管理,請執行以下動作:
將 kubectl
的內容設定為您的管理叢集。例如,對於名稱是 id-mgmt-test
的管理叢集:
kubectl config use-context id-mgmt-test-admin@id-mgmt-test
擷取管理叢集組態檔並進行編輯以設定 IDENTITY_MANAGEMENT_TYPE: none
。
執行帶有 --dry-run
的 tanzu management-cluster create
,並篩選 Pinniped 的相關物件,以產生 Pinniped 密碼定義。
FILTER_BY_ADDON_TYPE=authentication/pinniped tanzu management-cluster create --dry-run CLUSTER-CONFIG > PINNIPED-SECRET
其中,CLUSTER-CONFIG
是叢集組態檔,PINNIPED-SECRET
是您針對產生的 Pinniped Secret
定義所提供的名稱,例如 mc-no-idp.yaml
。
套用新密碼,以在管理叢集上停用 Pinniped:
kubectl apply -f PINNIPED-SECRET
在管理叢集上停用 Pinniped 後,會自動停用其以類別為基礎的叢集,但您需要手動停用其舊版叢集:
列出管理叢集內容中剩餘的任何 Pinniped 密碼:
kubectl get secret -A | grep pinniped-addon
使用所列出的密碼名稱和命名空間,來調查 kubectl get secret
輸出 (若有的話) 中的密碼:
kubectl get secret SECRET-NAME -n SECRET-NAMESPACE -o yaml
刪除包含以下任一項的密碼:
type: tkg.tanzu.vmware.com/addon
- 這些是舊版叢集密碼kubectl delete secret SECRET-NAME
其中,SECRET-NAME
是設定於 Secret
規格中的 metadata.name
值。
如果您打算使用標準的非管理員 kubeconfig
檔案,授與使用者對管理叢集和工作負載叢集的存取權,您必須設定 RBAC 授權: