ヘッドランプアドオンの設定

Headlamp は Kubernetes のダッシュボードで、クラスタリソースの管理と監視のためのグラフィカルユーザインタフェースを提供します。 IBM Cloud® Kubernetes Service 用 Headlamp アドオンは、自動ライフサイクル管理と認証のための IBM Cloud Identity and Access Management (IAM) との統合により、Headlamp のシームレスなインストールを提供します。

ヘッドランプアドオンを理解する

Headlampアドオンは、アーカイブされたkubernetes-dashboardプロジェクトの代替品として推奨されている。 Headlamp は、クラスタ内の Kubernetes リソースを表示および管理するための、モダンでユーザーフレンドリーなインターフェイスを提供します。

ヘッドランプアドオンの主な特徴は以下の通り:

  • IAM OIDC認証 :IAM OIDCを使用して、 IBM Cloud アカウントシームレスに認証できます。
  • 独立したライフサイクル管理 :アドオンバージョンは、クラスタマスターBOMバージョンから切り離され、独立したアップデートが可能です。
  • すぐにアクセスできます :このアドオンは、クラスタのデフォルトのパブリック・イングレス・ホスト名( headlamp サブドメイン付き)のイングレス・リソースを通じて自動的に公開されます。
  • 安全なアクセス各クラスタには一意のOIDCクライアントIDが付与され、認証スプーフィング攻撃を防ぐ。

前提条件

ヘッドランプアドオンを取り付ける前に、クラスタが以下の要件を満たしていることを確認してください:

ヘッドランプアドオンの取り付け

ヘッドランプのアドオンは、現在CLIからのみ利用可能です。 IBM Cloud コンソールからアドオンをインストールまたは管理することはできません。

CLI を使用したヘッドランプアドオンのインストール

  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. 「ヘッドランプ」アドオンのステータスが「 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 ログインページにリダイレクトされます。 認証後、ヘッドランプのダッシュボードに戻ります。

  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 シークレットに格納されます。
  • ハイブリッドプライベートパブリックOIDC: HeadlampはバックチャネルのリクエストにプライベートIAMエンドポイントを使い、フロントチャネル(ブラウザでのログイン)はパブリックIAMエンドポイントを使う。
  • トークンの管理 :認証トークンはブラウザのクッキーに保存され、 Kubernetes APIサーバーへのリクエストに自動的に含まれる。

認証の流れは以下のようになる:

  1. ヘッドランプのダッシュボードにアクセスすると、ログインページが表示されます。
  2. Sign In をクリックすると、公開されている IBM Cloud IAM 認証エンドポイントにリダイレクトされる。
  3. 認証に成功すると、IAMは認証コードとともにHeadlampにリダイレクトします。
  4. ヘッドランプは、認証コードとアクセストークンをプライベートネットワーク上で交換します。
  5. アクセストークンは、 Kubernetes APIサーバーへのリクエストを認証するために使用されます。

クラスタリソースへのアクセスは、 IBM Cloud IAMロールと、 Kubernetes APIサーバによって強制される Kubernetes RBACパーミッションによって決定されます。

ヘッドランプアドオンのアップデート

ヘッドランプアドオンは、新しいバージョンがリリースされると自動的にアップデートされます。 アドオンの現在のバージョンと健康状態はいつでも確認できます。

アドオンのバージョンを確認する:

ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>

ヘッドランプアドオンを無効にする

ヘッドランプダッシュボードが不要になった場合は、アドオンを無効にすることができます。

Headlampアドオンを無効にすると、以下のリソースが削除されます:

  • ヘッドランプの展開とポッド
  • ヘッドランプのサービスと侵入リソース
  • OIDCクライアントIDと関連する秘密

CLIでHeadlampアドオンを無効にする

  1. ヘッドランプアドオンを無効にする。
    ibmcloud ks cluster addon disable headlamp --cluster <cluster_name_or_ID>
    
  2. アドオンが削除されたことを確認します。
    ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>
    

VPCクラスタのプライベート・イングレスでHeadlampにアクセスする

セキュリティを強化するために、パブリックイングレスではなくプライベートイングレスからHeadlampにアクセスするようにVPCクラスタを設定します。

VPC VPNなどのプライベートネットワークからHeadlampにアクセスする場合は、以下の手順でクラスタを再設定できます:

  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を公開することができます。

Headlampは、 *.containers.appdomain.cloud ドメイン内の IBM が提供するサブドメインを通じて公開する必要があります。 お客様のクラスターの OIDC クライアント ID は、そのドメインと一致するリダイレクト URI とともに登録されています。 istio-ingressgateway のロードバランサーのホスト名は、そのドメインに含まれていないため、これを直接使用すると認証に失敗します。

開始前に

  • マネージド Istio アドオンを有効にします。
  • kubectl を設定して、そのクラスターをターゲットに指定します。
  1. headlamp-values ( ConfigMap )を開いて編集し、Headlamp アドオンによって作成されるデフォルトの Ingress リソースを無効にしてください。

    kubectl edit cm -n ibm-system headlamp-values
    

    アドオンがデフォルトの「 NGINX 」および「Traefik Ingress」リソースを作成しないようにするには、 data セクションに以下の内容を追加してください。

    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 でメモしておいたサブドメインを使用して、Web ブラウザで 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 ポート 80 → 4466)
  • 1 展開
    • ヘッドランプコンテナ(ポート4466)
    • nginxサイドカーコンテナ

パブリックエンドポイント経由で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
    

ヘッドランプアドオンのトラブルシューティング

以下の情報を使用して、ヘッドランプアドオンの一般的な問題をトラブルシューティングしてください。

ヘッドランプダッシュボードにアクセスできない

ヘッドランプのダッシュボードにアクセスできない場合は、以下を確認してください:

  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. ingressリソースが正しく設定されていることを確認してください。
    kubectl get ingress -n ibm-system
    
  4. パブリック専用クラスターの場合、ネットワークセキュリティルールで、パブリック IAM エンドポイントへの HTTPS によるアウトバウンド接続が許可されていることを確認してください。 必要に応じて、「 パブリックエンドポイント経由のHeadlampアドオンでOIDCを有効にする 」を参照し、OIDCの設定を更新してください。

認証に失敗

Headlampダッシュボードへのアクセス時に認証に失敗した場合:

  1. クラスタにアクセスするために必要なIAM権限を持っていることを確認します。

  2. ブラウザが https://iam.cloud.ibm.com にアクセスできることを確認してください。

  3. ブラウザのクッキーをクリアして、もう一度お試しください。

  4. OIDCクライアントIDシークレットがクラスタに存在することを確認します。

    kubectl get secret clientid-secrets -n ibm-system
    

ポッドが動作していない

ヘッドランプポッドが作動していない場合:

  1. ポッドのステータスとイベントをチェックする。
    kubectl describe pods -n ibm-system -l app.kubernetes.io/name=addon-headlamp
    
  2. ポッドのログにエラーがないか確認してください。
    kubectl logs -n ibm-system -l app.kubernetes.io/name=addon-headlamp