設定頭燈附加元件

Headlamp 是 Kubernetes 的儀表板,提供圖形化使用者介面來管理和監控您的群集資源。 適用於 IBM Cloud® Kubernetes Service 的 Headlamp 附加元件可無縫安裝 Headlamp,並提供自動生命週期管理,以及與 IBM Cloud Identity and Access Management (IAM) 整合以進行驗證。

瞭解頭燈附加元件

建議使用 Headlamp 附加元件取代已歸檔的 kubernetes-dashboard 專案。 Headlamp 提供現代化、友善的使用者介面,可檢視和管理群集中的 Kubernetes 資源。

頭燈附加元件的主要功能包括

  • IAM OIDC 身份驗證:使用 IAM OIDC 無縫驗證您的 IBM Cloud 帳戶。
  • 獨立的生命週期管理:附加元件版本與群集主 BOM 版本解耦,允許獨立更新。
  • 可隨時存取:該附加元件會透過一個 Ingress 資源自動曝露在您集群的預設公共 ingress 主機名稱上,並附有 headlamp 子網域。
  • 安全存取:每個群集都會收到唯一的 OIDC 用戶端 ID,以防止認證詐騙攻擊。

必要條件

安裝頭燈附加元件之前,請確保您的群組符合下列要求:

安裝頭燈附加元件

Headlamp 附加元件目前只能透過 CLI 使用。 您無法從 IBM Cloud 主控台安裝或管理附加元件。

使用 CLI 安裝 Headlamp 附加元件

  1. 將「container-service」外掛程式更新至最新版本。
    ibmcloud update && ibmcloud plugin update container-service
    
  2. 針對您的群集。
    ibmcloud ks cluster config --cluster CLUSTER_NAME_OR_ID
    
  3. 啟用「headlamp」附加元件。
    ibmcloud ks cluster addon enable headlamp --cluster CLUSTER_NAME_OR_ID
    
  4. 確認 Headlamp 附加元件的狀態為 Addon Ready。
    ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID
    
    輸出範例:
    NAME       Version   Health State   Health Status
    headlamp   0.1.0     normal         Addon Ready
    
  5. 請確認頭燈模組是否正常運作。
    kubectl get pods -n ibm-system -l app.kubernetes.io/name=addon-headlamp
    

存取頭燈儀表板

安裝 Headlamp 附加元件後,您可以透過群集的預設入口主機名稱存取儀表板。

  1. 取得群集的預設入口主機名稱。

    ibmcloud ks cluster get --cluster <cluster_name_or_ID> | grep "Ingress Subdomain"
    
  2. 開啟瀏覽器並導航至 https://headlamp.<ingress_subdomain>,其中 <ingress_subdomain> 是您群集的預設入口主機名稱。

    範例: https://headlamp.mycluster-abc123-0000.us-south.containers.appdomain.cloud

  3. 按一下登入,以 IBM Cloud IAM 進行驗證。

  4. 如果您尚未登入 IBM Cloud,您會被重定向到 IAM 登入頁面。 驗證完成後,您會重新回到 Headlamp 面板。

  5. 經過認證後,您就可以透過 Headlamp 介面檢視和管理群集資源。

從 kubernetes-dashboard 遷移

Kubernetes 社群已將 kubernetes-dashboard 專案歸檔。 安裝 Headlamp 附加元件後,如果 kubernetes-dashboard 部署正在群集中執行,您可以縮小其規模。

要在安裝 Headlamp 後縮小 kubernetes-dashboard 部署的規模:

kubectl scale deployment -n kube-system kubernetes-dashboard --replicas=0
kubectl scale deployment -n kube-system dashboard-metrics-scraper --replicas=0

瞭解頭燈認證

Headlamp 附加元件使用 IBM Cloud IAM OIDC 身份驗證,以確保叢集資源的存取安全。

啟用 Headlamp 附加元件時,會自動設定下列驗證元件:

  • 唯一的用戶端 ID:會為您的群集建立唯一的 OIDC 用戶端 ID,並儲存在 ibm-system 命名空間中的 Kubernetes secret 中。
  • 混合式私有-公有 OIDC:Headlamp 使用私有 IAM 端點處理後端通道請求,而前端通道(在瀏覽器中登入)則透過公有 IAM 端點進行。
  • 令牌管理:驗證標記儲存於瀏覽器 cookie 中,並自動包含在對 Kubernetes API 伺服器的要求中。

驗證流程如下:

  1. 當您存取 Headlamp 面板時,您會看到登入頁面。
  2. 按一下登入會將您重定向至公開 IBM Cloud IAM 授權端點。
  3. 驗證成功後,IAM 會將您重新導向回 Headlamp,並提供授權碼。
  4. Headlamp 透過私人網路將授權代碼交換成存取標記。
  5. 存取權限用於驗證對 Kubernetes API 伺服器的要求。

您對群集資源的存取權限由您的 IBM Cloud IAM 角色和 Kubernetes API 伺服器強制執行的 Kubernetes RBAC 權限決定。

更新頭燈附加元件

Headlamp 附加元件會在新版本發行時自動更新。 您可以隨時檢查附加元件的目前版本和健康狀態。

要檢查附加元件版本:

ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>

停用頭燈附加元件

如果您不再需要 Headlamp 面板,可以停用此附加元件。

停用 Headlamp 附加元件時,會移除下列資源:

  • 頭燈部署和吊艙
  • 頭燈維修與進氣資源
  • OIDC 用戶端 ID 和相關機密

使用 CLI 停用 Headlamp 附加元件

  1. 停用 Headlamp 附加元件。
    ibmcloud ks cluster addon disable headlamp --cluster <cluster_name_or_ID>
    
  2. 請確認該附加元件已移除。
    ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>
    

透過 VPC 群組上的私有入口存取 Headlamp

設定您的 VPC 群集,透過專用入口而非公開入口存取 Headlamp,以加強安全性。

當您選擇從私人網路存取 Headlamp,例如透過 VPC VPN,您可以透過下列步驟重新設定群集:

  1. 停用群集的公用 ALB。

    ibmcloud ks ingress alb disable --cluster <cluster_name_or_ID> --alb <public_ALB_ID>
    
  2. 啟用私人入口。

    ibmcloud ks ingress alb enable vpc-gen2 --cluster <cluster_name_or_ID> --alb <private_ALB_ID>
    
  3. 將網域註冊至私人 ALB。

    ibmcloud ks ingress domain create --cluster <cluster_name_or_ID> --hostname $<private_ALB_ID_hostname>
    
  4. 將新網域設定為預設值。

    ibmcloud ks ingress domain default replace --cluster <cluster_name_or_ID> --domain <new_domain>
    

IBM Cloud 後端會在大約 5 分鐘內更新頭燈。 更新完成後,儀表板可在新的預設入口主機名稱上使用,子網域為 headlamp.。

透過 Istio 入侵閘道器公開頭燈

如果您的叢集是透過 Istio 入口閘道來路由外部流量,您可以停用 Headlamp 附加元件所建立的預設 Ingress 資源,並改以 Istio Gateway 和 VirtualService 來公開 Headlamp。

您必須透過 IBM 提供的子網域,在 *.containers.appdomain.cloud 網域中公開 Headlamp。 您叢集的 OIDC 客戶端 ID 已搭配一個與該網域相符的重定向 URI 進行註冊。 原始的 istio-ingressgateway 負載平衡器主機名稱並不在該網域中,若直接使用該主機名稱,驗證將會失敗。

開始之前

  • 啟用受管理的 Istio add-on。
  • 將 kubectl 設定為以該叢集為目標。
  1. 開啟 headlamp-values ConfigMap 進行編輯,以停用 Headlamp 附加元件所建立的預設 Ingress 資源。

    kubectl edit cm -n ibm-system headlamp-values
    

    請在 data 區段中加入以下內容,以防止此附加元件建立預設的 NGINX 及 Traefik Ingress 資源。

    data:
      values.yaml: |-
        createDefaultPublicIngressNginx: false
        createDefaultPrivateIngressNginx: false
        createDefaultPublicIngressTraefik: false
        createDefaultPrivateIngressTraefik: false
    
  2. 請等待最多 5 分鐘,讓更新後的數值傳播至叢集。

  3. 請確認已移除預設的 Ingress 資源。

    kubectl get ingress -n ibm-system
    
  4. 取得 istio-ingressgateway 負載平衡器的 IP 位址(傳統叢集)或主機名稱(VPC 叢集)。

    • 標準叢集:
        kubectl get service istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
        ```
    * VPC 叢集:
    ```sh {: pre}
        kubectl get service istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
        ```
    若該指令傳回空值,表示負載平衡器尚未完成配置。 請確認該服務是否具有外部 IP,並檢查服務事件中是否存在錯誤,例如負載平衡器的配額限制。
    {: note}
    
    ```sh {: pre}
    kubectl describe service istio-ingressgateway -n istio-system
    
  5. 透過建立由 IBM 提供的子網域,來註冊負載平衡器的 IP 位址(傳統模式)或主機名稱(VPC)。 請為 TLS 機密指定 istio-system 命名空間,以便 TLS 憑證可供 istio-ingressgateway`` 使用。

    • 標準叢集:
        ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_ID> --ip <istio_ingressgateway_IP> --secret-namespace istio-system
        ```
    * VPC 叢集:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <istio_ingressgateway_hostname> --secret-namespace istio-system
        ```
    
  6. 請確認子網域已建立,並記錄下該子網域以及 SSL 憑證的機密名稱。

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_ID>
    

    標準叢集的輸出範例:

    Subdomain                                                                               IP(s)              SSL Cert Status   SSL Cert Secret Name                            Secret Namespace
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      created           mycluster-a1b2cdef345678g9hi012j3kl4567890-0001 istio-system
    

    VPC 叢集的輸出範例:

    Subdomain                                                                               Target(s)                                     SSL Cert Status   SSL Cert Secret Name                            Secret Namespace
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     1234abcd-us-south.lb.appdomain.cloud          created           mycluster-a1b2cdef345678g9hi012j3kl4567890-0001 istio-system
    

    如果叢集中有多個 NLB-DNS 項目,請透過將「Target(s)」或「IP(s)」欄位與「istio-ingressgateway」負載平衡器位址進行比對,並確認「Secret Namespace」欄位顯示為「istio-system」,來辨識您在上一步驟中建立的子網域。

  7. 建立一個名為 headlamp-istio.yaml 的檔案,用以定義Headlamp的 Gateway 與 VirtualService。 請將 <subdomain> 替換為上一步驟中的子網域,並將 <ssl_cert_secret_name> 替換為 SSL 的憑證機密名稱。

    TLS 的憑證機密是建立在 istio-system 命名空間中的。 istio-ingressgateway 會從該命名空間中讀取 credentialName 欄位中所指定的密鑰。 請勿將憑證值複製到「Gateway」資源中。

    apiVersion: networking.istio.io/v1
    kind: Gateway
    metadata:
      name: headlamp-gateway
      namespace: ibm-system
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: <ssl_cert_secret_name>
        hosts:
        - <subdomain>
    ---
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: headlamp
      namespace: ibm-system
    spec:
      hosts:
      - <subdomain>
      gateways:
      - headlamp-gateway
      http:
      - route:
        - destination:
            host: headlamp.ibm-system.svc.cluster.local
            port:
              number: 80
    
  8. 請運用「Gateway」及「VirtualService」這兩項資源。

    kubectl apply -f headlamp-istio.yaml
    
  9. 請使用您在第 6 步驟中記錄的子網域,在網頁瀏覽器中開啟 Headlamp 儀表板。

    https://<subdomain>
    

    若要從命令列驗證連線狀態,請執行以下指令。 請使用 -k 選項,僅在測試期間跳過憑證驗證 — 請勿在生產環境中使用 -k 。

    curl -k -s -o /dev/null -w "%{http_code}\n" https://<subdomain>
    

Kubernetes 由附加元件建立的資源

Headlamp 附加元件會在您的群集中建立數個 Kubernetes 資源,這些資源需要適當的網路設定。

如果您有自訂的防火牆或網路設定,您需要將其設定為允許下列資源之間的通訊:

  • 4 項 Ingress 資源
    • 私人 private-iks-k8s-nginx ingressClass
    • 公用 public-iks-k8s-nginx ingressClass
    • private 搭配 private-iks-traefik ingressClass
    • public 搭配 public-iks-traefik ingressClass
  • 1 服務 ( ClusterIP on 連接埠 80 → 4466)
  • 1 部署
    • 頭燈容器 (port 4466)
    • nginx sidecar 容器

透過公共端點為 Headlamp 附加元件啟用 OIDC

如果您的叢集無法連線至私有 IAM 端點,請覆寫 OIDC 端點設定,改為使用公開端點。

這些步驟假設叢集能夠存取 IAM 公開端點。

開始之前,請確保已為該叢集設定 kubectl。

  1. 開啟 headlamp-values ConfigMap 進行編輯:

    kubectl edit cm -n ibm-system headlamp-values
    

    在編輯器中,請在 data 區段中加入以下內容。 請將 <account_id> 替換為部署該叢集之帳戶的 ID。

    data:
      values.yaml: |-
        oidc:
          overrides:
            tokenEndpointUrl: "https://iam.cloud.ibm.com/identity/token?account=<account_id>"
            jwksUri: "https://iam.cloud.ibm.com/identity/keys"
    
  2. 請等待最多 5 分鐘,讓更新後的數值傳播至叢集。

  3. 重新啟動頭燈的部署:

    kubectl rollout restart deployment/headlamp -n ibm-system
    

排除頭燈附加元件的故障

使用下列資訊排除頭燈附加元件的常見問題。

無法存取頭燈儀表板

如果無法存取 Headlamp 面板,請確認下列事項:

  1. 檢查附加元件是否已安裝且健康。
    ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>
    
  2. 請確認頭燈模組是否正常運作。
    kubectl get pods -n ibm-system -l app.kubernetes.io/name=addon-headlamp
    
  3. 檢查入口資源的設定是否正確。
    kubectl get ingress -n ibm-system
    
  4. 對於僅限公開存取的叢集,請確認網路安全規則允許向外建立 HTTPS 連線至公開的 IAM 端點。 如有需要,請參閱《 透過公共端點為 Headlamp 附加元件啟用 OIDC 》,以更新 OIDC 設定。

驗證失敗

如果存取 Headlamp 面板時驗證失敗:

  1. 確認您擁有存取群集所需的 IAM 權限。

  2. 檢查您的瀏覽器是否可以存取 https://iam.cloud.ibm.com。

  3. 清除瀏覽器 cookie 並重試。

  4. 驗證 OIDC 用戶端 ID 秘密是否存在於群集中。

    kubectl get secret clientid-secrets -n ibm-system
    

Pods 未執行

如果頭燈吊艙未啟動:

  1. 檢查 pod 狀態和事件。
    kubectl describe pods -n ibm-system -l app.kubernetes.io/name=addon-headlamp
    
  2. 請檢查 Pod 日誌是否有錯誤。
    kubectl logs -n ibm-system -l app.kubernetes.io/name=addon-headlamp