コンテンツにスキップ

同一Kubernetesクラスタ内でのWallarmと追加Ingress Controllerのチェーン構成

この手順では、K8sクラスタにWallarm Ingress Controllerをデプロイし、すでに稼働中の他のControllerとチェーン構成する手順を示します。

ソリューションで解決する問題

WallarmはCommunity Ingress NGINX Controller上に構築されたIngress Controllerを含む、さまざまな形態のノードソフトウェアを提供します。

既にIngress Controllerを使用している場合、既存のIngress Controller(例:AWS ALB Ingress Controller)をWallarm Controllerに置き換えるのは困難な場合があります。この場合、Wallarm Sidecarソリューションを検討できますが、インフラに合わない場合は複数のIngress Controllerをチェーン構成することも可能です。

Ingress Controllerのチェーン構成により、既存のControllerを利用してエンドユーザーリクエストをクラスタに届け、追加のWallarm Ingress Controllerをデプロイして必要なアプリケーション保護を提供できます。

必要条件

  • Kubernetesプラットフォームバージョン 1.24-1.30

  • Helmパッケージマネージャー

  • Wallarm ConsoleでAdministratorロールを持ち、二要素認証が無効化されたアカウントにアクセスできること(US CloudまたはEU Cloud

  • US Wallarm Cloudで作業する場合はhttps://us1.api.wallarm.com、EU Wallarm Cloudで作業する場合はhttps://api.wallarm.comにアクセスできること

  • Wallarm Helmチャートを追加するためにhttps://charts.wallarm.comにアクセスできること。ファイアウォールでアクセスがブロックされていないことを確認してください

  • Docker Hub上のWallarmリポジトリhttps://hub.docker.com/r/wallarmにアクセスできること。ファイアウォールでアクセスがブロックされていないことを確認してください

  • 以下のIPアドレスにアクセスできること。これにより、攻撃検出ルールのアップデートおよびAPI仕様の取得、さらにホワイトリスト、ブラックリスト、またはグレイリストに登録された国、地域、データセンターの正確なIPを取得できます

    34.96.64.17
    34.110.183.149
    35.235.66.155
    34.102.90.100
    34.94.156.115
    35.235.115.105
    
    34.160.38.183
    34.144.227.90
    34.90.110.226
    
  • Ingress Controllerが稼働しているKubernetesクラスタがデプロイされていること

Wallarm Ingress Controllerのデプロイと追加Ingress Controllerとのチェーン構成

Wallarm Ingress Controllerをデプロイし、追加Controllerとチェーン構成するには、以下の手順に従います。

  1. 既存のIngress Controllerと異なるIngressクラスの値を使用して、公式Wallarm ControllerのHelmチャートをデプロイします。

  2. 以下の条件を満たすWallarm専用Ingressオブジェクトを作成します:

    • Wallarm Ingress Helmチャートのvalues.yamlで指定したのと同じingressClassを使用
    • 既存のIngress Controllerと同様にIngress Controllerリクエストルーティングルールを構成

    Wallarm Ingress Controllerはクラスタ外に公開されません

    Wallarm Ingress ControllerはそのサービスにClusterIPを使用するため、クラスタ外に公開されないことにご注意ください。

  3. 既存のIngress Controllerを再構成し、アプリケーションサービスの代わりに新しいWallarm Ingress Controllerへリクエストを転送するように設定します。

  4. Wallarm Ingress Controllerの動作をテストします。

手順1: Wallarm Ingress Controllerのデプロイ

  1. 適切なタイプのフィルタリングノードトークンを生成します:

    1. Wallarm Console → SettingsAPI tokensにアクセスし、US CloudまたはEU Cloudから操作します。
    2. DeployソースロールのAPIトークンを見つけるか作成します。
    3. このトークンをコピーします。
    1. Wallarm Console → Nodesにアクセスし、US CloudまたはEU Cloudから操作します。
    2. Wallarm nodeタイプのフィルタリングノードを作成し、生成されたトークンをコピーします。

      Wallarmノードの作成

  2. Wallarm Helmチャートリポジトリを追加します:

    helm repo add wallarm https://charts.wallarm.com
    helm repo update
    

  3. 以下のWallarm構成を含むvalues.yamlファイルを作成します:

    controller:
      wallarm:
        enabled: true
        token: "<NODE_TOKEN>"
        apiHost: us1.api.wallarm.com
        # nodeGroup: defaultIngressGroup
      config:
        use-forwarded-headers: "true"  
      ingressClass: wallarm-ingress
      ingressClassResource:
        name: wallarm-ingress
        controllerValue: "k8s.io/wallarm-ingress"
      service:
        type: ClusterIP
    nameOverride: wallarm-ingress
    
    controller:
      wallarm:
        enabled: true
        token: "<NODE_TOKEN>"
        # nodeGroup: defaultIngressGroup
      config:
        use-forwarded-headers: "true"
      ingressClass: wallarm-ingress
      ingressClassResource:
        name: wallarm-ingress
        controllerValue: "k8s.io/wallarm-ingress"
      service:
        type: "ClusterIP"
    nameOverride: wallarm-ingress
    
    • <NODE_TOKEN>はWallarmノードトークンです。
    • APIトークンを使用する場合は、nodeGroupパラメータにノードグループ名を指定します。ノードはこのグループに割り当てられ、Wallarm ConsoleのNodesセクションに表示されます。デフォルトのグループ名はdefaultIngressGroupです。

    詳細な構成オプションについては、こちらのリンクをご参照ください。

  4. Wallarm Ingress Helmチャートをインストールします:

    helm install --version 5.3.0 internal-ingress wallarm/wallarm-ingress -n wallarm-ingress -f values.yaml --create-namespace
    

    • internal-ingressはHelmリリースの名前です
    • values.yamlは前ステップで作成したHelmの値を含むYAMLファイルです
    • wallarm-ingressはHelmチャートをインストールする名前空間で、存在しない場合は作成されます
  5. Wallarm Ingress Controllerが起動していることを確認します:

    kubectl get pods -n wallarm-ingress
    

    各PodのステータスはSTATUS: RunningまたはREADY: N/Nである必要があります。例:

    NAME                                                             READY   STATUS    RESTARTS   AGE
    internal-ingress-wallarm-ingress-controller-6d659bd79b-952gl      3/3     Running   0          8m7s
    internal-ingress-wallarm-ingress-controller-wallarm-tarant64m44   4/4     Running   0          8m7s
    

手順2: Wallarm専用のingressClassNameを利用したIngressオブジェクトの作成

前の手順でvalues.yamlに設定したのと同じingressClass名でIngressオブジェクトを作成します。

Ingressオブジェクトは、アプリケーションがデプロイされているのと同じ名前空間に配置する必要があります。例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/wallarm-application: "1"
    nginx.ingress.kubernetes.io/wallarm-mode: monitoring
  name: myapp-internal
  namespace: myapp
spec:
  ingressClassName: wallarm-ingress
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp
            port:
              number: 80

手順3: 既存のIngress Controllerを再構成し、リクエストをWallarmに転送する

既存のIngress Controllerを再構成し、アプリケーションサービスの代わりに新しいWallarm Ingress Controllerへリクエストを転送する設定は、次の手順で実施します:

  • ingressClass名をnginxに設定したIngressオブジェクトを作成します。これはデフォルト値ですが、異なる場合はご自身の値に置き換えてください。

  • IngressオブジェクトはWallarm Ingress Chartと同じ名前空間(本例ではwallarm-ingress)に配置します。

  • spec.rules[0].http.paths[0].backend.service.nameの値は、Helmリリース名と.Values.nameOverrideで構成されるWallarm Ingress Controllerサービスの名前でなければなりません。

    名前を取得するには、以下のコマンドを使用できます:

    kubectl get svc -l "app.kubernetes.io/component=controller" -n wallarm-ingress -o=jsonpath='{.items[0].metadata.name}'
    

    本例では、名前はinternal-ingress-wallarm-ingress-controllerです。

以下は構成例です:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-external
  namespace: wallarm-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: www.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: internal-ingress-wallarm-ingress-controller
                port:
                  number: 80

手順4: Wallarm Ingress Controllerの動作テスト

既存の外部Ingress ControllerのLoad BalancerのパブリックIPを取得します。例として、ingress-nginx名前空間にデプロイされているとします:

LB_IP=$(kubectl get svc -l "app.kubernetes.io/component=controller" -n ingress-nginx -o=jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

取得したLBのアドレスに対してテストリクエストを送信し、システムが期待通りに動作していることを確認します:

curl -H "Host: www.example.com" ${LB_IP}/etc/passwd