Kubernetes エージェント + モジュール

この例では、Next-Gen WAF エージェントが Docker サイドカーにデプロイされ、アプリケーションにデプロイされたモジュールと通信します。

Next-Gen WAF エージェントを統合する

エージェントコンテナイメージの統合を参照してください。

Web アプリケーションと Next-Gen WAF モジュールがインストールされた Next-Gen WAF エージェント

このデプロイ例では、helloworld アプリケーションを設定し、RPC 経由で sigsci-agent を使用するように設定します。また、sigsci-agent コンテナをサイドカーとしてデプロイして、これらの RPC リクエストを処理します。

このデプロイタイプで Next-Gen WAF を設定するには、次のことを行う必要があります。

  • アプリケーションを修正して、適切な Next-Gen WAF モジュールを追加し、RPC 経由で sigsci-agent と通信するように設定します。

  • RPC モードで設定された Pod に sigsci-agent コンテナを追加します。

  • emptyDir{} ボリュームを追加し、それを sigsci-agent が一時データを書き込む場所として使用し、RPC アドレスを共有します。

アプリケーションコンテナを修正および設定する

helloworld の例は、sigsci-agent との RPC による通信を可能にするために既に修正された言語ベースのモジュール (Golang) です (そのように設定されている場合)。この設定は、helloworld の例示アプリケーションに渡される引数によって次のように行われます。

  • リスニングアドレス (デフォルトは localhost:8000)。

  • オプションの Next-Gen WAF エージェントの RPC アドレス (デフォルトでは sigsci-agent は使用しません)。他の言語ベースのモジュールも同様です。Web サーバーベースのモジュールでは、Next-Gen WAF モジュールをコンテナに追加する必要があります。

この helloworld アプリケーションが sigsci-agent で動作するためには、sigsci-agent アドレスが2番目のプログラム引数として設定され、sigsci-tmp ボリュームがマウントされてソケットファイルに書き込めるようにする必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
containers:
# Example helloworld app running on port 8000 against sigsci-agent via UDP /sigsci/tmp/sigsci.sock
- name: helloworld
image: signalsciences/example-helloworld:latest
imagePullPolicy: IfNotPresent
args:
# Address for the app to listen on
- localhost:8000
# Address sigsci-agent RPC is listening on
- /sigsci/tmp/sigsci.sock
ports:
- containerPort: 8000
volumeMounts:
# Shared mount with sigsci-agent container where the socket is shared via emptyDir volume
- name: sigsci-tmp
mountPath: /sigsci/tmp

エージェントコンテナをサイドカーとして追加および設定する

sigsci-agent コンテナはデフォルトで RPC モードになり、/sigsci/tmp/sigsci.sock に Unix ドメインソケット (UDS) ファイルが配置されます。このソケットファイルをキャプチャするには、/sigsci/tmp に一時的なボリュームがマウントされている必要があり、Pod と共有されていなければなりません。Web アプリケーションは、この UDS ソケットを介して sigsci-agent と通信するように設定されている必要があります。デプロイ YAML は、上記の例から修正し、2番目の引数を追加して /sigsci/tmp/sigsci.socksigsci-agent RPC アドレスを指定する必要があります。

ヒント:sigsci-agent RPC に TCP ベースのリスナーを使用することもできますが、パフォーマンス上の理由からお勧めしません。TCP が必要な場合 (または Windows などで UDS が使用できない場合)、RPC アドレスは UDS パスの代わりに ip:port または host:port として指定できます。この場合、ボリュームをアプリと共有する必要はありませんが、地理データなどの一時データを書き込む場所として、sigsci-agent コンテナ用にボリュームを作成する必要があります。

sigsci-agent コンテナをサイドカーとして追加する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
...
containers:
# Example helloworld app running on port 8000 against sigsci-agent via UDP /sigsci/tmp/sigsci.sock
- name: helloworld
image: signalsciences/example-helloworld:latest
imagePullPolicy: IfNotPresent
args:
# Address for the app to listen on
- localhost:8000
# Address sigsci-agent RPC is listening on
- /sigsci/tmp/sigsci.sock
ports:
- containerPort: 8000
volumeMounts:
# Shared mount with sigsci-agent container where the socket is shared via emptyDir volume
- name: sigsci-tmp
mountPath: /sigsci/tmp
# Next-Gen WAF agent running in default RPC mode
- name: sigsci-agent
image: signalsciences/sigsci-agent:latest
imagePullPolicy: Always
env:
- name: SIGSCI_ACCESSKEYID
valueFrom:
secretKeyRef:
# This secret needs added (see docs on sigsci secrets)
name: sigsci.my-site-name-here
key: accesskeyid
- name: SIGSCI_SECRETACCESSKEY
valueFrom:
secretKeyRef:
# This secret needs added (see docs on sigsci secrets)
name: sigsci.my-site-name-here
key: secretaccesskey
# If required (default is /sigsci/tmp/sigsci.sock for the container)
#- name: SIGSCI_RPC_ADDRESS
# value: /path/to/socket for UDS OR host:port if TCP
securityContext:
# The sigsci-agent container should run with its root filesystem read only
readOnlyRootFilesystem: true
volumeMounts:
# Default volume mount location for sigsci-agent writeable data
# NOTE: Also change `SIGSCI_SHARED_CACHE_DIR` (default `/sigsci/tmp/cache`)
# if mountPath is changed, but best not to change.
- name: sigsci-tmp
mountPath: /sigsci/tmp

注:上記の sigsci-agent 設定は、sigsci のシークレットが上記のシステムセクションに追加されたことを前提としています。

Deployment にエージェント用の一時ボリュームの定義を追加する

最後に、Pod 内の他のコンテナで使用できるようにエージェント用の一時ボリュームを定義する必要があります。ここでは、組み込みの emptyDir: {} ボリュームタイプを使用しています。

...
volumes:
# Define a volume where sigsci-agent will write temp data and share the socket file,
# which is required with the root filesystem is mounted read only
- name: sigsci-tmp
emptyDir: {}