問題
FalcoのPodが以下のerrorログをはいていることを確認しました。
% k logs falco-daemonset-2fcxr -n kube-support |grep error
k8s_handler (k8s_replicationcontroller_handler_state::collect_data()[https://172.20.0.1] an error occurred while receiving data from k8s_replicationcontroller_handler_state, m_blocking_socket=1, m_watching=0, SSL Socket handler (k8s_replicationcontroller_handler_state): Connection closed.
k8s_handler (k8s_service_handler_state::collect_data()[https://172.20.0.1] an error occurred while receiving data from k8s_service_handler_state, m_blocking_socket=1, m_watching=0, SSL Socket handler (k8s_service_handler_state): Connection closed.
k8s_handler (k8s_replicaset_handler_state::collect_data()[https://172.20.0.1] an error occurred while receiving data from k8s_replicaset_handler_state, m_blocking_socket=1, m_watching=0, SSL Socket handler (k8s_replicaset_handler_state): Connection closed.
k8s_handler (k8s_deployment_handler_state::collect_data()[https://172.20.0.1] an error occurred while receiving data from k8s_deployment_handler_state, m_blocking_socket=1, m_watching=0, SSL Socket handler (k8s_deployment_handler_state): Connection closed.
このerrorログは大規模環境だとパフォーマンスの問題で発生してしまうfalcoの既知の問題のようです。
昨日の記事のEKS Upgrade作業中にたまたま発見しました。
ワークアラウンド
Helmを使用している場合
GitHubのissueで同様の事象が報告されており、ワークアラウンドも紹介されていました。
A workaround is to disable the k8s metadata collection and only rely on fields available from the container runtimes.
metadataのcollectionをdisableすることでいったんは、エラーがでなくなるようです。
しかしながら、具体的な方法がわからなかったので、質問してみたところHelmを使っている場合の回答が返ってきました。
Helmを使用していない場合
ZOZOの場合は、Helmを使用せず、GitHub上で公開されているテンプレートファイルをもとにyamlファイルを記述し、リソースを作成しています。
上記の回答よると、Helmの場合はkubernetes.enabledをfalseにするそうです。このkubernetes.enabledの値はここのif文で使用されていて、trueの場合は -K
をつけるようです。
ただし、注意するべき点として、falseにするとID, name, namespace, labelsしか取得できなくなるとのことです。我々はfalco_rules.yamlにて k8s.pod.name と k8s.ns.name しか使用していないため問題ありませんでした。
ちなみに、Filed Classの一覧は以下です。
https://falco.org/docs/reference/rules/supported-fields/#field-class-k8s
また、ここの記載的に、 -k
でも -K
でもどちらでもよいらしいので、どちらも削除しました。
When using Falco with Kubernetes, you can enable this functionality by using the
-k
or-K
command-line flag.
最終的にやったこと
今回は /usr/bin/falco
のargsの -K
と -k
を削除しました。
根本解決
以下のIssueで対応中とのことです。
https://github.com/falcosecurity/libs/issues/987