設定身分識別管理

本主題說明如何在具有獨立管理叢集的 Tanzu Kubernetes Grid (TKG) 中,啟用及設定身分識別管理。

關於啟用和設定身分識別管理

您可以設定 LDAPS 或 OIDC 身分識別提供者,以便在管理叢集部署期間或之後,啟用身分識別管理。啟用身分識別管理後所建立的任何工作負載叢集,都會自動設定成使用與管理叢集相同的身分識別提供者。若要追溯設定最近啟用身分識別管理的現有工作負載叢集,請遵循在工作負載叢集上啟用身分識別管理

啟用和設定身分識別管理包括以下步驟。如果要使用標準的非管理員 kubeconfig 檔案,來存取管理和工作負載叢集,在完成本主題中的步驟後,還必須依照設定 RBAC 中的指示,來設定角色型存取控制 (RBAC)。

(建議) 在管理叢集部署期間,啟用和設定身分識別管理:

  1. 取得身分識別提供者的詳細資料。
  2. 使用取得的詳細資料,在 Tanzu Kubernetes Grid 中設定 LDAPS 或 OIDC。
  3. 建立管理叢集後,確認驗證服務正常執行並完成其組態。

如需相關指示,請參閱下面的 (建議) 在管理叢集部署期間,啟用和設定身分識別管理

在管理叢集部署之後,啟用和設定身分識別管理:

  1. 取得身分識別提供者的詳細資料。
  2. 為管理叢集產生 Pinniped 附加元件密碼。
  3. 確認驗證服務正常執行並完成其組態。
  4. 如果管理叢集會管理任何工作負載叢集,請針對啟用身分識別管理之前所建立的每個工作負載叢集,產生 Pinniped 附加元件密碼。

如需相關指示,請參閱下面的在現有部署中啟用和設定身分識別管理

(建議) 在管理叢集部署期間,啟用和設定身分識別管理

本節說明如何在管理叢集部署期間,啟用和設定身分識別管理。

取得身分識別提供者的詳細資料

您必須先要有身分識別提供者,才能啟用身分識別管理。Tanzu Kubernetes Grid 支援 LDAPS 和 OIDC 身分識別提供者。

  • 若要使用您公司的內部 LDAPS 伺服器作為身分識別提供者,請向您的 LDAP 管理員取得 LDAPS 資訊。
  • 若要使用 OIDC 作為身分識別提供者,您必須要有帳戶,且其具有一個支援 OpenID Connect 標準的身分識別提供者,例如 Okta

範例:在 Okta 中登錄 Tanzu Kubernetes Grid 應用程式

若要使用 Okta 作為 OIDC 提供者,您必須在 Okta 中建立帳戶,並使用您的帳戶登錄一個 Tanzu Kubernetes Grid 應用程式:

  1. 如果沒有帳戶,請建立一個 Okta 帳戶。
  2. 按一下管理員 (Admin) 按鈕,移至管理員入口網站。
  3. 移至應用程式 (Applications),然後按兩下建立應用整合 (Create App Integration)
  4. 對於登入方法 (Sign-in method),選擇 OIDC - OpenID Connect ;對於 應用程式類型 (Application type),選擇 Web 應用程式 (Web Application),然後按兩下下一步 (Next)
  5. 為應用程式命名。
  6. 授與類型 (Grant Type) 下,在用戶端代表使用者執行 (Client acting on behalf of a user) 下,確保選擇了授權代碼 (Authorization Code)重新整理 Token (Refresh Token)
  7. 輸入預留位置登入重新導向 URI (Sign-in redirect URI)。例如,輸入http://localhost:8080/authorization-code/callback。在部署管理叢集後,您將以實際 URL 來更新此 URL。
  8. 指派 (Assignments) 下,為應用程式指派人員和群組。指派給應用程式的人員和群組,將成為可以存取您用來部署的管理叢集和工作負載叢集的使用者。
  9. 按一下儲存 (Save)
  10. 在應用程式的一般 (General) 索引標籤中,複製並儲存用戶端識別碼 (Client ID)用戶端密碼 (Client secret)。您在部署管理叢集時,將需要這些認證。
重要

必須設定所有 OIDC 提供者,才能發出重新整理 Token,才能使用 TKG 2.3 或更新版本。

在 Tanzu Kubernetes Grid 中設定 LDAPS 或 OIDC 設定

使用上述取得的詳細資料,在 Tanzu Kubernetes Grid 中設定 LDAPS 或 OIDC:

  • 如果要使用安裝程式介面來部署管理叢集,請在身分識別管理 (Identity Management) 區段中,設定 LDAPSOIDC。如需相關指示,請參閱使用安裝程式介面來部署管理叢集中的設定身分識別管理
  • 如果要從組態檔來部署管理叢集,請在組態檔中設定 LDAP_*OIDC_* 變數。

    例如:

    LDAP:

    IDENTITY_MANAGEMENT_TYPE: ldap
    LDAP_BIND_DN: "cn=bind-user,ou=people,dc=example,dc=com"
    LDAP_BIND_PASSWORD: "example-password"
    LDAP_GROUP_SEARCH_BASE_DN: dc=example,dc=com
    LDAP_GROUP_SEARCH_FILTER: &(objectClass=posixGroup)(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)(uid={})
    LDAP_USER_SEARCH_NAME_ATTRIBUTE: 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,offline_access
    OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: email
    

    如需如何準備管理叢集組態檔的指示,請參閱建立管理叢集組態檔

完成身分識別管理的組態

部署管理叢集後,請依照以下各節所述的程序,來完成身分識別管理的設定:

  1. kubectl 連線至管理叢集
  2. 通過檢查驗證服務的狀態確認其執行正常,如檢查身份管理服務的狀態中所述。
  3. (僅限 OIDC) 將回撥 URI 提供給 OIDC 提供者
  4. 若要支援使用標準的非管理員 kubeconfig 檔案,來存取管理叢集,請為管理叢集設定 RBAC

kubectl 連線至管理叢集

若要設定身分識別管理,您必須取得並使用管理叢集的 admin 內容:

  1. 取得管理叢集的 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 進行驗證。

  2. kubectl 設定為管理叢集的 admin 內容:

    kubectl config use-context id-mgmt-test-admin@id-mgmt-test
    

檢查身分識別管理服務的狀態

Tanzu Kubernetes Grid使用 Pinniped 整合 叢集與 OIDC 和 LDAP 身分識別提供者。當您啟用身分識別管理時,Tanzu Kubernetes Grid 會在 pinniped-supervisor 命名空間中建立 pinniped-supervisor 服務並在 pinniped-concierge 命名空間中建立 pinniped-concierge。遵循以下步驟,檢查 Pinniped 服務的狀態,並記下公開該服務的 EXTERNAL-IP 位址。

  1. 取得正在管理叢集中執行的服務的相關資訊。身分識別管理服務會在 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
    
  2. 請記下以下資訊:

    • 使用 NSX ALB 的 vSphereAWSAzure:記下 pinniped-supervisor 服務的外部位址,如 EXTERNAL-IP 下所列。
    • 沒有 NSX ALB 的 vSphere:記下 pinniped-supervisor 服務執行所在的連接埠。在上述範例中,此連接埠為 31234
  3. 檢查管理叢集中的所有服務是否正在執行。

    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 內容。如果使用者嘗試使用一般內容來連線至管理叢集,將無法存取其資源,因為他們尚未獲授權如此做。

檢查 LDAP 身分識別管理服務的狀態

Tanzu Kubernetes Grid使用 Pinniped 整合 叢集與 LDAP 身分識別服務,以公開服務端點。當您啟用 LDAP 時,Tanzu Kubernetes Grid 會在 pinniped-supervisor 命名空間中建立 pinniped-supervisor 服務並在 pinniped-concierge 命名空間中建立 pinniped-concierge

  1. 檢查管理叢集中的所有服務是否正在執行:

    kubectl get services -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 內容。如果使用者嘗試使用一般內容來連線至管理叢集,將無法存取其資源,因為他們尚未獲授權如此做。

  2. 繼續執行為管理叢集設定 RBAC

(僅限 OIDC) 將回撥 URI 提供給 OIDC 提供者

如果您將管理叢集設定為使用 OIDC 驗證,則必須將該管理叢集的回撥 URI 提供給 OIDC 身分識別提供者。例如,如果您使用 OIDC,且您的 IDP 為 Okta,請執行以下步驟:

  1. 登入您的 Okta 帳戶。
  2. 在主功能表中,移至應用程式 (Applications)
  3. 選取您為 Tanzu Kubernetes Grid 所建立的應用程式。
  4. 在 [一般設定 (General Settings)] 面板中,按一下編輯 (Edit)
  5. 在 [登入 (Login)] 下,更新登入重新導向 URI (Login redirect URIs),以包含 pinniped-supervisor 執行所在節點的位址:

    • 使用 NSX ALB 的 vSphereAWSAzure:新增您在上述程序中記下的 pinniped-supervisor 服務的外部 IP 位址和連接埠號碼:

      https://EXTERNAL-IP/callback
      
    • 沒有 NSX ALB 的 vSphere:新增您設定為 API 端點的 IP 位址,以及您在上述程序中記下的 pinniped-supervisor 連接埠號碼:

      https://API-ENDPOINT-IP:31234/callback
      

      在所有情況下,都必須指定 https,而不是 http

  6. 按一下儲存 (Save)

為管理叢集設定 RBAC

如果您打算使用標準的非管理員 kubeconfig 檔案來存取管理叢集,請在完成身分識別管理的組態後,遵循 為管理叢集設定 RBAC 中的指示來設定 RBAC。

在現有部署中啟用和設定身分識別管理

本節說明如何在現有部署中啟用和設定身分識別管理。

取得身分識別提供者的詳細資料

遵循上方取得身分識別提供者的詳細資料中的指示。

為管理叢集產生 Pinniped 附加元件密碼

此程序會設定 Pinniped 附加元件,並在管理叢集中部署驗證元件。若要為 Pinniped 附加元件產生 Kubernetes 密碼,請執行下列動作:

  1. kubectl 的內容設定為您的管理叢集。例如,對於名稱是 id-mgmt-test 的管理叢集:

    kubectl config use-context id-mgmt-test-admin@id-mgmt-test
    
  2. 將您在部署管理叢集時所定義的組態設定複製到新檔案,以建立叢集組態檔。將以下設定新增到管理叢集組態檔,其中包括 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,offline_access"
    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_NAME_ATTRIBUTE: dn
    LDAP_GROUP_SEARCH_USER_ATTRIBUTE: dn
    LDAP_HOST:
    LDAP_ROOT_CA_DATA_B64:
    LDAP_USER_SEARCH_BASE_DN:
    LDAP_USER_SEARCH_FILTER:
    LDAP_USER_SEARCH_ID_ATTRIBUTE: dn
    LDAP_USER_SEARCH_NAME_ATTRIBUTE:
    
    # 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 位址來作為虛設值,以通過內部檢查。

  3. 請確定您的本機環境已將 IDENTITY_MANAGEMENT_TYPE 設定為 oidcldap,而不是設定為 none

    echo $IDENTITY_MANAGEMENT_TYPE
    

    如果此變數設定為 none,請執行 export 命令,以重設為 oidcldap

  4. FILTER_BY_ADDON_TYPE 環境變數設定為 authentication/pinniped,以便 tanzu management-cluster create 僅在與 Pinniped 相關的物件上運作:

    export FILTER_BY_ADDON_TYPE="authentication/pinniped"
    
  5. 為 Pinniped 附加元件產生密碼:

    tanzu management-cluster create CLUSTER-NAME --dry-run -f CLUSTER-CONFIG-FILE > CLUSTER-NAME-example-secret.yaml
    

    其中:

    • CLUSTER-NAME 是目標管理叢集的名稱。
    • CLUSTER-CONFIG-FILE 是您在上面所建立的組態檔。

    環境變數設定會使 tanzu management-cluster create --dry-run 產生 Kubernetes 密碼,而不是完整的叢集資訊清單。

  6. 檢閱密碼,然後將其套用至管理叢集。例如:

    kubectl apply -f CLUSTER-NAME-example-secret.yaml
    
  7. 套用密碼後,執行 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.4 不支援以非互動式帳戶或密碼授與為基礎的無瀏覽器 CLI 登入。

  1. 從本機機器上的終端機視窗中,執行 ssh,以遠端登入啟動機器。

  2. 設定 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
    
  3. 將叢集的標準 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
      
  4. 使用新建立的 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:
    
  5. 複製連結並貼到本機機器上的瀏覽器。

  6. 在瀏覽器中,登入您的身分識別提供者。此時會顯示頁面,提示您將授權碼貼到 CLI 中:

    完成登入

  7. 在出現 Optionally, paste your authorization code: 提示後,複製授權碼並貼到 CLI 中。

  8. 沿用您先前所用的相同 kubeconfig 檔案,再次連線至叢集:

    kubectl get pods -A --kubeconfig FILE-PATH
    
    • 如果您已為經過驗證的使用者,在叢集上設定了角色繫結,則輸出會顯示網繭資訊。

    • 如果您未在叢集上設定角色繫結,您將看到一則訊息,指出拒絕使用者帳戶存取網繭:Error from server (Forbidden): pods is forbidden: User "user@example.com" cannot list resource "pods" in API group "" at the cluster scope。發生這種情況的原因是,使用者已成功通過驗證,但他們尚未獲授權存取叢集上的任何資源。若要授權使用者存取叢集資源,您必須建立叢集角色繫結,以在叢集上設定 RBAC:

在現有部署中停用身分識別管理

若要在啟用了身分識別管理的現有部署中停用身分識別管理,請執行以下動作:

  1. kubectl 的內容設定為您的管理叢集。例如,對於名稱是 id-mgmt-test 的管理叢集:

    kubectl config use-context id-mgmt-test-admin@id-mgmt-test
    
  2. 擷取管理叢集組態檔並進行編輯以設定 IDENTITY_MANAGEMENT_TYPE: none

  3. 執行帶有 --dry-runtanzu 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

  4. 套用新密碼,以在管理叢集上停用 Pinniped:

    kubectl apply -f PINNIPED-SECRET
    
  5. 在管理叢集上停用 Pinniped 後,會自動停用其以類別為基礎的叢集,但您需要手動停用其舊版叢集:

    1. 列出管理叢集內容中剩餘的任何 Pinniped 密碼:

      kubectl get secret -A | grep pinniped-addon
      
    2. 使用所列出的密碼名稱和命名空間,來調查 kubectl get secret 輸出 (若有的話) 中的密碼:

      kubectl get secret SECRET-NAME -n SECRET-NAMESPACE -o yaml
      
    3. 刪除包含以下任一項的密碼:

      • type: tkg.tanzu.vmware.com/addon - 這些是舊版叢集密碼
      • 任何 OIDC 或 LDAP 組態
      kubectl delete secret SECRET-NAME
      

      其中,SECRET-NAME 是設定於 Secret 規格中的 metadata.name 值。

後續步驟

如果您打算使用標準的非管理員 kubeconfig 檔案,授與使用者對管理叢集和工作負載叢集的存取權,您必須設定 RBAC 授權:

check-circle-line exclamation-circle-line close-line
Scroll to top icon