マルチクラスタVerrazzanoのインストール

マルチクラスタVerrazzano環境の設定方法

前提条件

作業を開始する前に、マルチクラスタ環境でのVerrazzanoを参照してください。

概要

マルチクラスタVerrazzano環境を設定するには、2つ以上のKubernetesクラスタが必要です。これらのクラスタの1つは管理クラスタで、その他のクラスタは管理対象クラスタになります。

ここでの手順では、管理クラスタと単一の管理対象クラスタが想定されます。追加の管理対象クラスタごとに、管理対象クラスタの手順を繰り返します。

Verrazzanoのインストール

各KubernetesクラスタにVerrazzanoをインストールします。

  • 1つのクラスタで、devまたはprodプロファイルを使用してVerrazzanoをインストールします。これは管理クラスタになります。
  • 他のクラスタで、managed-clusterプロファイルを使用してVerrazzanoをインストールします。これは管理対象クラスタになります。managed-clusterプロファイルには、管理対象クラスタに必要なコンポーネントのみが含まれます。
  • 環境変数KUBECONFIG_ADMINKUBECONTEXT_ADMINKUBECONFIG_MANAGED1およびKUBECONTEXT_MANAGED1を作成し、それぞれ、管理クラスタおよび管理対象クラスタのkubeconfigファイルおよびコンテキストを指定します。これらの環境変数は、以降の管理対象クラスタの登録ステップで使用します。次に、これらの環境変数を設定する方法の例を示します。
    $ export KUBECONFIG_ADMIN=/path/to/your/adminclusterkubeconfig
    $ export KUBECONFIG_MANAGED1=/path/to/your/managedclusterkubeconfig
    
    # lists the contexts in each kubeconfig file
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN config get-contexts -o=name
    my-admin-cluster-context
    some-other-cluster-context
    
    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 config get-contexts -o=name
    my-managed-cluster-context
    some-other-cluster2-context
    
    # Choose the right context name for your admin and managed clusters from the output shown and set the KUBECONTEXT
    # environment variables
    $ export KUBECONTEXT_ADMIN=<admin-cluster-context-name>
    $ export KUBECONTEXT_MANAGED1=<managed-cluster-context-name>
    

特定のプロファイルを使用してKubernetesクラスタにVerrazzanoをインストールしてカスタマイズする方法の詳細は、インストレーション・ガイドおよびインストール・プロファイルを参照してください。

管理クラスタへの管理対象クラスタの登録

次の項では、管理対象クラスタを管理クラスタに登録する方法を示します。示されているように、管理クラスタで実行するステップと管理対象クラスタで実行するステップがあります。示されているコマンドは、前に設定した環境変数を使用して適切なクラスタに接続します。

登録前の設定

管理対象クラスタを登録する前に、まず次の項目を設定する必要があります:

  • 管理対象クラスタのCA証明書を含むシークレット。管理対象クラスタで既知のCAを使用している場合、このシークレットのcacrtフィールドは空にできます。管理対象クラスタが自己署名証明書を使用する場合にのみ必要です。このCA証明書は、アプリケーションとVerrazzanoコンポーネントの両方について、管理対象クラスタからメトリックをスクレイピングするために管理クラスタによって使用されます。
  • 管理クラスタの外部から到達可能なアドレスを含むConfigMap。これは、管理クラスタに接続できるように、登録中に管理対象クラスタに対して提供されます。

次の登録前設定ステップに従います:

  1. 管理者クラスタに必要な場合は、管理対象クラスタのCA証明書を取得します。管理クラスタは、管理対象クラスタのPrometheusエンドポイントからメトリックをスクレイピングします。管理対象クラスタVerrazzanoインストールで自己署名証明書を使用する場合は、https接続をするために、管理クラスタで管理対象クラスタのCA証明書が必要になります。

    • 管理対象クラスタ上のVerrazzanoインストールで自己署名証明書を使用するか、既知の認証局によって署名された証明書を使用するかに応じて、適切な手順を選択します。

    • 使用する証明書のタイプが不明な場合は、管理対象クラスタのverrazzano-systemネームスペースでsystem-tlsシークレットのca.crtフィールドを確認します。

      # On the managed cluster
      $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 --context $KUBECONTEXT_MANAGED1 \
           -n verrazzano-system get secret system-tls -o jsonpath='{.data.ca\.crt}'
      

      この値が空の場合、管理対象クラスタは既知の認証局によって署名された証明書を使用しています。それ以外の場合、管理対象クラスタは自己署名証明書を使用しています。


      このケースでは、次のように、cacrtフィールドに空の値を持つmanaged1.yamlというファイルを作成します:

      $ kubectl create secret generic "ca-secret-managed1" -n verrazzano-mc \
           --from-literal=cacrt="" --dry-run=client -o yaml > managed1.yaml;
      

      管理対象クラスタの証明書が自己署名の場合、cacrtフィールドの値として、管理対象クラスタのCA証明書を含むmanaged1.yamlというファイルを作成します。次のコマンドでは、管理対象クラスタのCA証明書がMGD_CA_CERTという環境変数に保存されます。次に、kubectlコマンドの--dry-runオプションを使用して、managed1.yamlファイルを生成します。

      # On the managed cluster
      $ MGD_CA_CERT=$(kubectl --kubeconfig $KUBECONFIG_MANAGED1 --context $KUBECONTEXT_MANAGED1 \
           get secret system-tls \
           -n verrazzano-system \
           -o jsonpath="{.data.ca\.crt}" | base64 --decode)
      $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 --context $KUBECONTEXT_MANAGED1 \
        create secret generic "ca-secret-managed1" \
        -n verrazzano-mc \
        --from-literal=cacrt="$MGD_CA_CERT" \
        --dry-run=client \
        -o yaml > managed1.yaml
      
  2. 管理対象クラスタのCA証明書を含む管理クラスタにシークレットを作成します。このシークレットは、管理対象クラスタからのメトリックのスクレイピングに使用されます。前のステップで作成されたファイルmanaged1.yamlは、このステップへの入力を提供します。

    # On the admin cluster
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
         apply -f managed1.yaml
    
    # Once the command succeeds, you may delete the managed1.yaml file
    $ rm managed1.yaml
    
  3. 次の手順を使用して、管理クラスタのKubernetes APIサーバー・アドレスを取得します。このアドレスは、管理対象クラスタからアクセスできる必要があります。


    Kindクラスタを除くほとんどのタイプのKubernetesクラスタでは、管理クラスタの外部からアクセス可能なAPIサーバー・アドレスをkubeconfigファイルから見つけることができます。

    # View the information for the admin cluster in your kubeconfig file 
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN config view --minify
    apiVersion: v1
    kind: Config
    clusters:
    - cluster:
      certificate-authority-data: DATA+OMITTED
      server: https://11.22.33.44:6443
      name: my-admin-cluster
    contexts:
    ....
    ....
    

    このコマンドの出力では、serverエントリから管理クラスタAPIサーバーのURLを見つけることができます。ADMIN_K8S_SERVER_ADDRESS変数の値をこのURLに設定します。

    export ADMIN_K8S_SERVER_ADDRESS=<the server address from the config output>
    

    KindクラスタはDockerコンテナ内で実行されます。管理クラスタと管理対象クラスタがKindクラスタの場合、kubeconfigファイル内の管理クラスタのAPIサーバー・アドレスは、通常ホスト・マシン上のローカル・アドレスであり、管理対象クラスタからはアクセスできません。kindコマンドを使用して、管理クラスタの内部のkubeconfigを取得します。これには、同じマシン上の他のKindクラスタからアクセス可能な(つまり、同じDockerネットワークでアクセス可能な)サーバー・アドレスが含まれます。

    $ kind get kubeconfig --internal --name <your-admin-cluster-name>
    

    このコマンドの出力では、serverエントリから管理クラスタAPIサーバーのURLを見つけることができます。ADMIN_K8S_SERVER_ADDRESS変数の値をこのURLに設定します。

    export ADMIN_K8S_SERVER_ADDRESS=<the server address from the config output>
    
  4. 管理クラスタで、前のステップで見つかった外部からアクセス可能な管理クラスタKubernetesサーバー・アドレスを含むConfigMapを作成します。

    # On the admin cluster
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
        apply -f <<EOF -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: verrazzano-admin-cluster
      namespace: verrazzano-mc
    data:
      server: "${ADMIN_K8S_SERVER_ADDRESS}"
    EOF
    

登録ステップ

最初の3つの登録ステップを管理クラスタで実行し、最後のステップを管理対象クラスタで実行します。コマンドを実行するクラスタは、各コード・ブロックに示されます。

管理クラスタで

  1. managed1という名前の管理対象クラスタの登録プロセスを開始するには、管理クラスタでVerrazzanoManagedClusterオブジェクトを適用します。

    # On the admin cluster
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
        apply -f <<EOF -
    apiVersion: clusters.verrazzano.io/v1alpha1
    kind: VerrazzanoManagedCluster
    metadata:
      name: managed1
      namespace: verrazzano-mc
    spec:
      description: "Test VerrazzanoManagedCluster object"
      caSecret: ca-secret-managed1
    EOF
    
  2. VerrazzanoManagedClusterリソースがReadyステータスになるまで待ちます。その時点で、登録プロセスを完了するために管理対象クラスタに適用する必要があるYAMLファイルが生成されています。

    # On the admin cluster
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
        wait --for=condition=Ready \
        vmc managed1 -n verrazzano-mc
    
  3. 管理対象クラスタを登録するために、作成されたYAMLファイルをエクスポートします。

    # On the admin cluster
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
        get secret verrazzano-cluster-managed1-manifest \
        -n verrazzano-mc \
        -o jsonpath={.data.yaml} | base64 --decode > register.yaml
    

管理対象クラスタで

前のステップでエクスポートした登録ファイルを管理対象クラスタに適用します。

# On the managed cluster
$ kubectl --kubeconfig $KUBECONFIG_MANAGED1 --context $KUBECONTEXT_MANAGED1 \
    apply -f register.yaml

# Once the command succeeds, you may delete the register.yaml file
$ rm register.yaml

このステップの後、管理対象クラスタは管理クラスタへの定期的な接続を開始します。管理対象クラスタが管理クラスタに接続すると、次の情報を使用して、この管理対象クラスタのVerrazzanoManagedClusterリソースのStatusフィールドが更新されます:

  • 管理対象クラスタから行われた最新接続のタイムスタンプ(lastAgentConnectTimeステータス・フィールド)。
  • 管理対象クラスタで実行されているPrometheusインスタンスのホスト・アドレス(prometheusHostステータス・フィールド)。これは、その後管理クラスタが管理対象クラスタからメトリックをスクレイピングするために使用されます。
  • 管理対象クラスタのAPIアドレス(apiUrlステータス・フィールド)。これは、管理クラスタのAPIプロキシが、管理対象クラスタ情報の受信リクエストを管理対象クラスタのAPIプロキシにルーティングするために使用されます。

管理対象クラスタの登録が完了したことの検証

管理クラスタですべての検証ステップを実行できます。

  1. 管理対象クラスタが管理クラスタに接続できることを確認します。管理クラスタのVerrazzanoManagedClusterリソースのステータスを表示し、lastAgentConnectTimeprometheusUrl,およびapiUrlフィールドが移入されているかどうかを確認します。これは、登録ステップの完了後、最大で2分かかる場合があります。

    # On the admin cluster
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
        get vmc managed1 -n verrazzano-mc -o yaml
       
    # Sample output showing the status field
    spec:
      ....
      ....
    status:
      apiUrl: https://verrazzano.default.172.18.0.211.nip.io
      conditions:
      - lastTransitionTime: "2021-07-07T15:49:43Z"
        message: Ready
        status: "True"
        type: Ready
      lastAgentConnectTime: "2021-07-16T14:47:25Z"
      prometheusHost: prometheus.vmi.system.default.172.18.0.211.nip.io
    
  2. 管理対象クラスタがRancherに正常に登録されていることを確認します。登録ステップを実行すると、Verrazzanoは管理対象クラスタをRancherに登録します。管理クラスタでRancher UIを表示します。Rancherへの登録が成功した場合、クラスタはRancherのクラスタ・リストにリストされ、Active状態になります。Verrazzanoへのアクセスの手順に従って、クラスタのRancher UI URLを見つけることができます。

管理対象クラスタのメトリックが収集されていることの検証

管理クラスタが管理対象クラスタからメトリックを収集していることを確認します。Prometheusの出力には、管理対象クラスタの名前を含むレコードが含まれます(managed_clusterとラベル付けされます)。

Verrazzanoへのアクセスの手順に従って、クラスタのPrometheus UI URLを見つけることができます。メトリック(node_disk_io_time_seconds_totalなど)の問合せを実行します。

Prometheus問合せの出力例

Prometheus

Prometheus UIを使用する別の方法は、コマンドラインからメトリックを問い合せることです。次に示す例は、コマンドラインからPrometheusメトリックを取得する方法です。問合せの出力で、managaged_clusterフィールドが管理対象クラスタの名前に設定されているレスポンスを探します。

# On the admin cluster
$ prometheusUrl=$(kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
                 get verrazzano -o jsonpath='{.items[0].status.instance.prometheusUrl}')
$ VZPASS=$(kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
           get secret verrazzano --namespace verrazzano-system \
           -o jsonpath={.data.password} | base64 --decode; echo)
$ curl --user verrazzano:${VZPASS} "${prometheusUrl}/api/v1/query?query=node_disk_io_time_seconds_total"

管理対象クラスタのログが収集されていることの検証

管理クラスタが管理対象クラスタからログを収集していることを確認します。出力には、cluster_nameフィールドに管理対象クラスタの名前があるレコードが含まれます。

Verrazzanoへのアクセスの手順に従って、クラスタのKibana UI URLを見つけることができます。verrazzano-namespace-verrazzano-systemの索引を作成します。一部のログ・レコードでは、cluster_nameフィールドに管理対象クラスタの名前が移入されます。

Kibana画面の出力例

Kibana

Kibana UIを使用する別の方法は、コマンドラインからElasticsearchを問い合せることです。次に示す例は、コマンドラインからログ・レコードを取得する方法です。問合せの出力で、cluster_nameフィールドが管理対象クラスタの名前に設定されているレスポンスを探します。

# On the admin cluster
$ KIBANA_URL=$(kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
                 get verrazzano -o jsonpath='{.items[0].status.instance.kibanaUrl}')
$ VZPASS=$(kubectl --kubeconfig $KUBECONFIG_ADMIN --context $KUBECONTEXT_ADMIN \
           get secret verrazzano --namespace verrazzano-system \
           -o jsonpath={.data.password} | base64 --decode; echo)
$ curl -k --user verrazzano:${VZPASS} -X POST -H 'kbn-xsrf: true' "${KIBANA_URL}/elasticsearch/verrazzano-namespace-verrazzano-system/_search?size=25"

マルチクラスタVerrazzanoでのアプリケーションの実行

Verrazzanoマルチクラスタ設定が完了し、マルチクラスタHello World Helidonサンプル・アプリケーションに従ってアプリケーションをデプロイできます。

管理クラスタUIの使用

管理クラスタは、管理対象クラスタへのアプリケーションの登録とデプロイを行う中心点として機能します。

管理クラスタのVerrazzano UIでは、次を表示できます:

  • この管理クラスタに登録されている管理対象クラスタ。
  • この管理クラスタまたはその登録済管理対象クラスタ(あるいはその両方)にあるVerrazzanoProjects。
  • この管理クラスタまたはその登録済管理対象クラスタ(あるいはその両方)にあるアプリケーション。