マルチテナント対応の Kubernetes クラスターを構成する: パート 2

この「マルチテナント対応の Kubernetes クラスターを構成する」シリーズの第 1 回 では IBM Cloud を例に、複数のテナントで共有する Kubernetes クラスターをセットアップする方法を説明しました。

1 つの Kubernetes クラスターが複数のテナントで共有される状態になったら、無許可のアクセスからデータを保護するために、データを探索し、テナントごとにデータを分離する必要があります。

クラウド・ネイティブ環境用の Sysdig というセキュアな DevOps プラットフォームでは、チーム のコンセプトによって、環境内でのテナントの分離を実現することができます。チームは、テナントごとに可視になるリソースを指定するための手段です。管理者は Sysdig サービス・インスタンス用に複数のチームを構成して、どのテナントがどの特定のリソースのメトリックを確認できるかを定義できます。

IBM Cloud 環境を使用している場合、Sysdig の機能は IBM Cloud Monitoring with SysdigIBM Cloud Identity and Access Management (IAM) に組み込まれています。チームを作成した後、管理者は IAM を使用してユーザーをチームに追加できます。

このチュートリアルの第 2 回では、IBM Cloud Monitoring with Sysdig を利用してマルチテナント対応の Kubernetes クラスターをモニタリングする例を紹介します。

前提条件

このチュートリアルの手順に取り組むための準備として、以下のタスクを行う必要があります。

  • マルチテナント対応の Kubernetes クラスターを作成します。チュートリアル「マルチテナント対応の Kubernetes クラスターを構成する、第 1 回」で説明している手順に従って、複数のテナントで共有する Kubernetes クラスターをセットアップしてください。
    クラスターの構成では、クラスター管理者を sam@company.com に設定し、テナントとして devprod の 2 つを追加します。
    dev テナントにはテナント管理者 john@company.com とテナント・ユーザー tom@company.com を含めます。
    prod テナントにはテナント管理者 mark@company.com とテナント・ユーザー cherry@company.com を含めます。
  • このチュートリアルで使用するすべてのユーザー ID (sam@company.com 他) は、同じ IBM アカウント下で作成します。したがって、これらのユーザーが同じ Kubernetes クラスターと同じ Sysdig インスタンスにアクセスできます。
  • ユーザーのうちの少なくとも 1 人は IBM アカウント所有者でなければなりません。あるいは、少なくとも 1 人のユーザーに管理者プラットフォーム権限と IBM Cloud Monitoring with Sysdig インスタンスの管理者役割を付与します。このチュートリアルでは、クラスター管理者ユーザー sam@company.com が IBM アカウント所有者であり、IBM Cloud 内でサービス・インスタンスを作成、表示、削除する権限を持つことを前提とします。

所要時間

このチュートリアルの手順を最初から最後まで完了するには、約 30 分かかります。

手順

以下で説明する手順では、IBM Cloud Monitoring with Sysdig を利用して Sysdig インスタンスをプロビジョニングする方法、Sysdig エージェントを構成して Kubernetes クラスター上にデプロイする方法、Sysdig チームとアクセス制御を手作業で構成する方法、そして Kubernetes 名前空間の設定に従って自動的に Sysdig チームを構成する方法を説明します。

Sysdig インスタンスをプロビジョニングする

このチュートリアルではユーザー sam@company.com がクラスターを作成することを前提とします。Sam はクラスター全体の管理者です。Sam のような管理者は、「カタログからの Sysdig インスタンスのプロビジョニング」で説明している手順に従って、IBM Cloud カタログから Sysdig インスタンスをプロビジョニングできます。別の方法として、IBM Cloud コマンド・ライン・インターフェースを使用して Sysdig インスタンスを作成することもできます。その場合は、以下の手順に従ってください。

  1. IBM Cloud にログインします。

     #  ibmcloud login --sso
    
  2. リソース・グループを設定します。

     #  ibmcloud target -g default
    
  3. Sysdig インスタンスを作成します。

     #  ibmcloud resource service-instance-create <NAME> sysdig-monitor <SERVICE_PLAN_NAME> <LOCATION>
    

    以下はその一例です。

     #  ibmcloud resource service-instance-create sysdig-instance-01 sysdig-monitor lite us-south
    
  4. インスタンスにアクセスするためのサービス・キーを作成します。以下のコマンドを使用すると、ユーザー役割がコンソールからインスタンスの Sysdig アクセス・キーにアクセスできるようになります。

     #  ibmcloud resource service-key-create <NAME> <ROLE_NAME> --instance-name <SERVICE_INSTANCE_NAME>
    

    以下はその一例です。

     #  ibmcloud resource service-key-create sysdig-key Administrator --instance-name sysdig-instance-01
    

Sysdig エージェントを構成して Kubernetes クラスター上にデプロイします。

インスタンスをプロビジョニングした後は、クラスター管理者兼アカウント所有者の sam@company.com が IBM Cloud ダッシュボード (「Observability Monitoring (プログラム識別情報モニタリング) 」ダッシュボード) から Sysdig インスタンスを表示できるようになります。続いて、sam@company.com は Sysdig エージェントを構成し、マルチテナント対応 Kubernetes クラスターにエージェントをデプロイする必要があります。

  1. Sysdig サービス・コンソールからインストール・スクリプトを取得します。

    前の手順で作成した Sysdig インスタンスを見つけて「Edit Resources (リソースの編集)」をクリックし、スクリプトをコピーします (以下のスクリーン・キャプチャーを参照)。このスクリプトを、マルチテナント対応の Kubernetes クラスター内で実行します。

    IBM Cloud の「Edit Resources (リソースの編集)」を示す画面のスクリーン・キャプチャー

  2. クラスター管理者兼アカウント所有者として、sam@company.com は Sysdig ダッシュボード上ですべてのリソースとすべての名前空間をデフォルトで表示できます (以下のスクリーン・キャプチャーを参照)。

    IBM Cloud の「New Grouping (新規グループ化)」画面のスクリーン・キャプチャー

Sysdig チームとアクセス制御を手作業で構成する

  1. Sysdig チームを作成するために、2 つの異なる名前空間に devprod という 2 つのチームを作成します。この作業は、クラスター管理者または IBM Cloud Monitoring with Sysdig インスタンスの管理者が行う必要があります。

    前に説明したように、デフォルトで sam@company.com には Sysdig チームを作成するための適切な権限が付与されています。Sam は Sysdig Web インターフェースを使い、「チームの作成」で説明されている手順に従ってチームを作成できます。

  2. チーム内で作業するためのユーザー権限を付与するために、Sam は IAM を使用して、「Sysdig UI の起動や REST API の呼び出しを行う権限の付与」と「特定のチーム内で作業するための権限の付与」の手順に従ってチームにアクセス制御を設定し、それぞれのテナント・ユーザーを対応するチームに割り当てます。

    • アクセス・グループを作成して必要な IAM ポリシーを設定します。例えば、Sam は sysdig-dev という名前のアクセス・グループを作成します。このグループには 2 つのポリシーを含める必要があります。1 つは、IBM Cloud コンソールからデフォルト・リソース・グループ内の Sysdig リソースを表示するための Viewer プラットフォーム権限です。もう 1 つのポリシーでは、sysdig-instance-01 Sysdig インスタンスに対する Viewer プラットフォーム権限と Writer サービス権限を付与し、KW-namespace_dev Sysdig チームのみを表示および編集できるようにします。

    • team にアクセスするアクセス・グループにユーザーを招待します。これで、Sam はテナント管理者 john@company.com を IAM 内の sysdig-dev アクセス・グループに追加できます。それには、「sysdig-dev group」を選択してから「Add users (ユーザーを追加)」をクリックします。権限が付与されると、john@company.com は Sysdig ダッシュボード内で KW-namespace_dev チームを表示して、このチームにアクセスできるようになります (以下のスクリーン・キャプチャーを参照)。

      すべてのリソースとすべての名前空間が表示された画面のスクリーン・キャプチャー

    • Sam は上記の手順を繰り返して、KW-namespace_prod という名前の Sysdig チーム (この場合は、scope を名前空間 prod に設定) と、このチームのアクセス・ポリシーを設定したアクセス・グループも作成できます。その後、prod テナント管理者 mark@company.com をこのアクセス・グループに招待すると、Mark が名前空間 prod 内のリソースのみを表示できるようになります。

Kubernetes 名前空間の設定に応じて自動的に Sysdig チームを構成する

前のセクションでは、Sysdig コンソールから手作業で Sysdig チームを作成する方法を紹介しました。 こうした手作業による手順は、Kubernetes クラスター内に少数のテナントしかない場合に適しています。一方、多数のテナントがセットアップされているとしたら、手作業による手順では非効率的です。その場合は、team のオンボーディング手順を自動化することをお勧めします。

sysdig-kube-watcher Python スクリプトを使用すると、Kubernetes 名前空間の設定と Sysdig のチーム設定を自動的に同期できます。

  1. 名前空間を特定のアノテーションで修飾します。

    以下のサンプル名前空間 YAML ファイルでは、アノテーション sysdigTeamMembers が使用されています。

     cat <<EOF | kubectl apply -f -
           apiVersion: v1
           kind: Namespace
           metadata:
             name: prod
             annotations:
               sysdigTeamMembers: mark@company.com,cherry@company.com
     EOF
    

    この例では、sysdig-kube-watchersysdigTeamMembers アノテーションを認識すると、Sysdig API を介して Sysdig に変更を加え、この名前空間の Sysdig チームを作成します。

  2. sysdig-kube-watcher スクリプトをマルチテナント対応 Kubernetes クラスターにデプロイします。

    ユーザー管理手法の違いにより、sysdig-kube-watcher に含まれる関数の一部は IBM Cloud Monitoring with Sysdig では機能しません。以下の手順を IBM Cloud で有効にするためには、プル・リクエスト #12 に基づくコードを利用してください。

    sysdig-kube-watcher はクラスター全体のコントローラーであり、すべての名前空間とアノテーションをモニタリングします。したがって、Sam は Github にある Kubewatcher コードのクローンを作成します。

     # git clone https://github.com/draios/sysdig-kube-watcher.git
    

    次に、Sam は Kuberwatcher をマルチテナント対応 Kubernetes クラスターにインストールします。

     cat <<EOF | kubectl apply -f -
     ---
     apiVersion: extensions/v1beta1
     kind: Deployment
     metadata:
       name: kubewatcher-deployment
     spec:
       replicas: 1
       template:
        metadata:
          labels:
            app: kubewatcher
        spec:
          containers:
          - name: kubewatcher
            image: sysdig/kubewatcher:0.1.1
           env:
           - name: SDC_ADMIN_TOKEN
             value: <Sysdig Monitor API Token>
           - name: SDC_URL
             value:  https://<YOUR-API-SERVER-HOSTNAME-OR-IP>
           - name: SDC_SSL_VERIFY
             value: "false"
           - name: KUBE_URL
             value: https://<YOUR-KUBERNETES-MASTER-URL>
           - name: TEAM_PREFIX
             value: KW-
     EOF
    

    上記の例に示されている kubewatcher.yaml ファイル内で、いくつかのパラメーターを変更する必要があります。

    image に設定されているデフォルト・イメージは sysdig/kubewatcher:0.1.1 ですが、プル・リクエスト #12 に基づくコードを使用して新しいイメージをビルドする必要があります。

     cd sysdig-kube-watcher
     docker build -t kubewatcher:v1.0
     docker tag kubewatcher:v1.0  <your image registry>/kubewatcher:v1.0
     docker  push <your image registry>/kubewatcher:v1.0
    

    SDC_ADMIN_TOKEN を、環境内の管理者ユーザーの IBM Cloud Monitoring with Sysdig API トークンで置き換えます。このトークンを確認するには、Sysdig コンソールで「Settings (設定)」 > 「User Profile (ユーザー・プロファイル)」 > 「Sysdig Monitor API」の順にクリックします。

    SDC_URL を、Sysdig クラウドにアクセスするために使用する URL で置き換えます。IBM Cloud Monitoring with Sysdig を使用している場合は、Sysdig エンドポイントを確認してください。

    SDC_SSL_VERIFY は Kubewatcher が SDC_URL に接続するときに SSL 証明書の検証を行うかどうかを指定するパラメーターです。デフォルト値は "true" ですが、Kubernetes 上にデプロイする場合は一般に "false" に設定する必要があります。

    KUBE_URL を、Kubernetes API サーバーにアクセスするための URL で置き換えます。この URL を確認するには、以下のコマンドを実行します。

     #  ibmcloud cs cluster-get <CLUSTER-NAME> |grep "Master URL"
    

    TEAM_PREFIX (省略可) を、チーム名のプレフィックスで置き換えます。生成されるチーム名は '<TEAM_PREFIX>-namespace_<namespace_name>' のようになります (例: 'KW-namespace_prod')。

    しばらく待った後、Sam は新しく作成されたチームを Sysdig Web インターフェース内で確認できます。

  3. IBM Cloud コマンド・ライン・インターフェースを使用して、テナント・ユーザーをチームに招待します。

    前述のように、チームが正常に作成された後は、クラスター管理者 Sam は IBM Cloud コンソール上で、IAM 内の他のユーザーを Sysdig チームに招待できます。このプロセスを自動化するために、以下のコマンドを使用してユーザーをチームに招待することもできます。

    • アクセス・グループを作成します。

      # ibmcloud iam access-group-create GROUP_NAME [-d, --description DESCRIPTION]
      

      例:

      #  ibmcloud iam access-group-create sysdig-prod
      
    • ポリシーをアクセス・グループに割り当てます。

      プラットフォーム閲覧者の役割をユーザーに付与して、ユーザーがコンソールから Sysdig インスタンスを表示できるようにします。

      # ibmcloud iam access-group-policy-create sysdig-prod --roles Viewer --resource-group-name default --service-name sysdig-monitor
      

      次に、チーム・ポリシーを作成します。

      # ibmcloud iam access-group-policy-create sysdig-prod --file policy.json
      

      以下の JSON ファイルを使用します。

        {
        "type": "access",
        "subjects": [
            {
                "attributes": [
                    {
                        "name": "access_group_id",
                        "value": "<Access-Group-Guid>"
                    }
                ]
            }
        ],
        "roles" : [
        {
                "role_id" : "crn:v1:bluemix:public:iam::::serviceRole:Reader"
        },
        {
                "role_id" : "crn:v1:bluemix:public:iam::::platformRole:Reader"
        }
        ],
        "resources": [
            {
                "attributes": [
                    {
                        "name": "accountId",
                        "value": "<Account-Guid>"
                    },
                    {
                        "name": "serviceName",
                        "value": "sysdig-monitor"
                    },
                    {
                        "name": "serviceInstance",
                        "value": "<Instance-Guid>"
                    },
                    {
                        "name": "sysdigTeam",
                        "value": "<Sysdig-TeamID>"
                    }
                ]
            }
        ]
      }
      

      以下のプレースホルダ―の値を置き換えます。

      <Access-Group-Guid>: get IAM Access Group Guid#ibmcloud iam access-group sysdig-prod --id で置き換えます。

      <Instance-Guid> : get Instance GUID#ibmcloud resource service-instance sysdig-instance-01 | grep GUID で置き換えます。

      <Account-Guid>: get Account ID# ibmcloud account show|grep "Account ID" で置き換えます。

      <Sysdig-TeamID>: get Sysdig team ID# curl -k https://us-south.monitoring.cloud.ibm.com/api/teams/KW-namespace_prod -H 'Authorization: Bearer <SYSDIG_API_TOKEN>' -H 'Content-Type: application/json' で置き換えます。

    • グループにアクセスするユーザーを招待します。

      # ibmcloud iam access-group-user-add sysdig-prod  mark@company.com  cherry@company.com
      

      これで手作業による操作と同じように、mark@company.comcherry@company.comKW-namespace_prod チーム内のリソースを表示できるようになりました。

まとめ

このチュートリアルでは、複数のテナントをモニタリングするように IBM Cloud Monitoring with Sysdig を構成する例を紹介しました。チームを使用することで、テナントごとにデータを分離できます。また、可視にするリソースを制御し、リソースを表示して変更できるユーザーを制御することもできます。

IBM Cloud Monitoring with Sysdig には、このチュートリアルでは取り上げ切れない多数の機能があり、例えばアラートとカスタム・ダッシュボードを作成することもできます。Sysdig の詳細については、Sysdig Monitor のドキュメントをご覧ください。