コンテンツにスキップ

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

本手順では、K8sクラスターにWallarm Ingressコントローラーをデプロイし、すでに環境で稼働している他のコントローラーとチェーン構成にする方法を説明します。

本ソリューションが対応する課題

Wallarmは、Community Ingress NGINX Controller上に構築されたIngress Controllerなど、複数のフォームファクターでノードソフトウェアを提供します。

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

Ingressコントローラーのチェーン構成により、エンドユーザーからのリクエストを既存のコントローラーでクラスターに取り込み、必要なアプリケーション保護を提供するための追加のWallarm Ingressコントローラーをデプロイできます。

要件

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

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

  • US CloudまたはEU CloudのWallarm ConsoleでAdministratorロールを持つアカウントへのアクセス

  • 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へのアクセス。ファイアウォールでアクセスがブロックされていないことを確認します

  • 攻撃検知ルールやAPI仕様の更新をダウンロードし、さらに国、地域、データセンターごとの正確なIPを取得するために、以下のIPアドレスへのアクセス(allowlisted, denylisted, or graylistedの対象に対して)

    node-data0.us1.wallarm.com - 34.96.64.17
    node-data1.us1.wallarm.com - 34.110.183.149
    us1.api.wallarm.com - 35.235.66.155
    34.102.90.100
    34.94.156.115
    35.235.115.105
    
    node-data1.eu1.wallarm.com - 34.160.38.183
    node-data0.eu1.wallarm.com - 34.144.227.90
    api.wallarm.com - 34.90.110.226
    
  • Ingressコントローラーが稼働しているKubernetesクラスターがデプロイ済みであること

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

Wallarm Ingressコントローラーをデプロイして追加のコントローラーとチェーン構成にするには、次の手順を実行します。

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

  2. 次の条件でWallarm専用のIngressオブジェクトを作成します。

    • Wallarm Ingress Helmチャートのvalues.yamlに指定したものと同じingressClass
    • 既存のIngressコントローラーと同様に構成されたIngressコントローラーのリクエストルーティングルール。

    Wallarm Ingressコントローラーはクラスター外部には公開されません

    Wallarm Ingressコントローラーは、サービスにClusterIPを使用します。つまり、クラスター外部には公開されません。

  3. 既存のIngressコントローラーを再構成し、アプリケーションサービスではなく、新しいWallarm Ingressコントローラーに着信リクエストを転送します。

  4. Wallarm Ingressコントローラーの動作をテストします。

Step 1: Wallarm Ingressコントローラーをデプロイする

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

    1. Wallarm Console → SettingsAPI tokens( US Cloud または EU Cloud )を開きます。
    2. 使用タイプがNode deployment/Deploymentの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 6.4.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コントローラーが起動して稼働中であることを確認します:

    kubectl get pods -n wallarm-ingress
    

    WallarmポッドのステータスはSTATUS: RunningREADY: N/Nである必要があります:

    NAME                                                                  READY   STATUS    RESTARTS   AGE
    ingress-controller-wallarm-ingress-controller-6d659bd79b-952gl        3/3     Running   0          8m7s
    ingress-controller-wallarm-ingress-controller-wallarm-wstore-7ddmgbfm 3/3     Running   0          8m7s
    

Step 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

Step 3: 既存のIngressコントローラーを再構成してWallarmにリクエストを転送する

既存のIngressコントローラーを再構成し、アプリケーションサービスではなく新しいWallarm Ingressコントローラーに着信リクエストを転送するには、次のようにします。

  • ingressClass名がnginxとなるIngressオブジェクトを作成します。これはデフォルト値です。異なる場合は自身の値に置き換えることができます。

  • IngressオブジェクトはWallarm Ingressチャートと同じネームスペースに配置する必要があります。この例ではwallarm-ingressです。

  • spec.rules[0].http.paths[0].backend.service.nameの値は、Helmリリース名と.Values.nameOverrideで構成されるWallarm Ingressコントローラーのサービス名である必要があります。

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

    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

Step 4: Wallarm Ingressコントローラーの動作をテストする

既存の外部Ingressコントローラーのロードバランサーのパブリック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}')

既存のIngressコントローラーのアドレスにテストリクエストを送信し、期待どおりに動作していることを確認します:

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