Falcosidekick + Kubeless = a Kubernetes Response Engine
2年前、私たちは Falco
をベースにした Kubernetes Response Engine
を紹介しました。そのアイデアは、感染したポッドを削除したり、Sysdig
のキャプチャを開始したり、GCP PubSub
にイベント
を転送したりするために、Kubeless
のserverless functionをトリガーすることでした。READMEを参照してください。
このカスタムスタックを維持することを避けるために、私たちはコミュニティと協力して、すべてのコンポーネントを Falcosidekick
に統合し、UXを改善するために努力しました。
最後のリリース [2.20.0
]](https://github.com/falcosecurity/falcosidekick/releases/tag/2.20.0) で、最後の仕上げとして Kubeless
をネイティブ出力として統合しました。詳細は 2020年の回顧 をご覧ください。
今回のブログ記事では、スタック Falco
+ Falcosidekick
+ Kubeless
を用いて、独自のレスポンスエンジンを K8S に統合するための基本的な考え方を説明します。
必要条件
少なくとも 1.17
リリースの kubernetes
クラスタが動作しており、helm
と kubectl
がインストールされている必要があります。
Kubelessのインストール
公式のクイックスタートページをフォローしてください:
数秒後、コントローラが起動していることを確認できます:
Falcoのインストール
まず、Falco
と Falcosidekick
の両方のネームスペースを作成します。
helm
のrepoを追加します:
実際のプロジェクトでは、helm pull falcosecurity/falco --untar
でチャート全体を取得し、values.yaml
を設定する必要があります。このチュートリアルでは、できるだけ簡単な設定を心がけ、helm install
コマンドで直接設定を行います。
このような出力が得られるはずです。
そして、新しいFalco
ポッドを見ることができます:
引数 --set falco.jsonOutput=true -set falco.httpOutput.enabled=true -set falco.httpOutput.url=http://falcosidekick:2801
は、イベントのフォーマットと Falco
がイベントを送信するURLを設定するものです。Falco
と Falcosidekick
は同じネームスペースにあるので、サービス名 (falcosidekick
) を直接使うことができます。
Falcosidekickをインストールする
過程は全く同じです:
このような出力が得られるはずです。
ログを確認します。
Kubeless
が出力可能と表示されているので、全て順調です👍。
パラメータについて簡単に説明します。
config.kubeless.namespace
:Kubeless
が実行されるネームスペース。config.kubeless.function
: はKubeless function
の名前です。
以上、本当に素敵なUXを手に入れようとしました 😉。
Kubeless functionをインストールする
ここでは Kubeless
関数の書き方や動作については説明しませんが、詳細は公式の ドキュメント を参照してください。
私たちの本当に基本的な関数は、Falcoidekick
によって Falco
からイベントを受信し、トリガーされたルールが Terminal Shell in container であるかどうかをチェックし(ruleを参照)、イベントのフィールドから namespace と pod name を抽出して、該当するポッドを削除します。
基本的なプロセスは、:
functionをデプロイする前に、functionのServiceAccount
を作成する必要があります。これは、任意のネームスペースのポッドを削除する権限が必要になるためです:
残っているのはfunction自体のインストールだけです:
ネームスペースkubelessでKubeless
functionを実行していて、ポート8080のサービスdelete-podで起動できるようになっています。
functionをテストする
dumbポッドを作るところから始めます:
内部でshellコマンドを実行して、何が起こるか見てみましょう:
As expected we got the result of our command, but, if get the status of the pod now:
💥 削除されました。 💥
これでコンポーネントのログを確認できるようになりました。
For Falco
:
For Falcosidekick
:
(このfunctionは何も返さないことに注意してください。これがメッセージログが空である理由です)
For delete-pod
function:
まとめ
この本当にシンプルな例では、可能性の表面を掻きむしっただけですが、すべてが可能になりました。また、いつでもコントリビュートを歓迎します。
ボーナス: Kubernetes
の外で Falcosidekick
を実行しているが、Kubeless
の出力を使いたいと思っていませんか? 問題ありません。READMEを参照してください。
ボーナス2: Kubeless
の代わりに Knative
を使いたい人のために、Kubeless
は近日中にリリースされる予定です。 😉。
エンジョイ