AKS で Kyverno を動かしてみる
CNCF のブログポストに Kyverno に関する投稿がされていました。
名前は聞いていたのですが実際に触ったことが無かったので、少し調べつつ触ってみました。
概要
Kyverno は、Kubernetes 用のポリシーエンジンであり、いわば Azure Policy のように「この条件に合致していないリソースは作成できない」といった環境のガードレールを作ることができるツールです。
環境・準備
- Azure Kubernetes Service (v1.24.9)
- WSL2 (Ubuntu 20.04)
- Azure CLI (v2.46.0)
- Helm (v3.11.2)
- Kyverno (v1.9.1)
リソースグループ名とクラスター名の変数登録
WSL2 の bash にて、下記を実行して変数に登録しておきます。
RGNAME=<リソースグループ名>
CLNAME=<クラスター名>
クラスターの作成
下記のコマンドを実行し、新規に「リソースグループ」と「AKS クラスター」を作成します。
az group create --name $RGNAME --location japaneast
az aks create --name $CLNAME --resource-group $RGNAME \
--node-vm-size Standard_D4s_v3 --node-count 3 \
--generate-ssh-keys
クラスターの作成が完了したら、クラスターへの接続情報を取得しておきます。
az aks get-credentials --resource-group $RGNAME --name $CLNAME
Kyverno のインストール
こちらの公式マニュアルにある通りに実行すれば OK です。
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno -n kyverno \
--create-namespace --set replicaCount=3
下記のような出力が確認できれば大丈夫だと思います。
NAME: kyverno
LAST DEPLOYED: Fri Mar 10 23:32:43 2023
NAMESPACE: kyverno
STATUS: deployed
REVISION: 1
NOTES:
Chart version: 2.7.1
Kyverno version: v1.9.1
Thank you for installing kyverno! Your release is named kyverno.
動作確認
ポリシーを適用する
下記の yaml ファイルを用意しておきます。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: Enforce
rules:
- name: check-for-labels
match:
any:
- resources:
kinds:
- Pod
validate:
message: "label 'app.kubernetes.io/name' is required"
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"
yaml ファイルに記載のイメージは下記の通りです。
- kind: ポリシーであることを示しています。
- spec.validationFailureAction: ポリシーに違反した際は拒否する動作となる "Enforce" を指定しています。なお、"Audit" と指定すると監査のみで動作自体は可能になります。
- spec.rules: Pod の "app.kubernetes.io/name" というラベルに任意の値が入っていることを条件としています。
その他の記載方法を含む、より詳しい情報については公式ドキュメントを参照してくださいませ。
この yaml ファイルを AKS へデプロイします。
kubectl create -f sample-policy.yaml
条件に合致しない Pod を作ってみる
下記のコマンドを実行して nginx の Deployment を作成してみます。ここでは、条件のラベルを付与していないため、作成できないことが期待値です。
kubectl create deployment nginx --image=nginx
すると、下記のエラーが表示されました。
error: failed to create deployment: admission webhook "validate.kyverno.svc-fail" denied the request:
policy Deployment/default/nginx for resource violation:
require-labels:
autogen-check-for-labels: 'validation error: label ''app.kubernetes.io/name'' is required. rule autogen-check-for-labels failed at path /spec/template/metadata/labels/app.kubernetes.io/name/'
「require-labels:」以降にて、"app.kubernetes.io/name" ラベルが必要だが無かった旨が通知されていますね!
Pod の作成状況を確認しても、とくに新しい Pod は作成されていませんでした。成功です🤗
kubectl get pods -A | grep nginx
条件に合致する Pod を作ってみる
下記のコマンドを実行して、"app.kubernetes.io/name" ラベルを持つ nginx の Deployment を作成してみます。もちろん、作成できることが期待値です。
kubectl run nginx --image nginx --labels app.kubernetes.io/name=nginx
先ほどとは変わって、下記のメッセージが出力されました。上手くいっていそうです。
pod/nginx created
Pod の作成状況を確認すると、無事作成されていました。こちらも成功🤗
kubectl get pods -A | grep nginx
default nginx 1/1 Running 0 96s
まとめ
ということで、AKS 上でも Kyverno の動作確認を行うことができました。
AKS 上でポリシーというと Azure Policy も用意されています。が、他の環境へのポータビリティ性を考えると、Azure Policy ではなく Kyverno などのサードパーティ製のプロダクトを使うという選択肢はアリだと考えています。
運用に向けても Grafana と連携した Dashboard の機能も用意されており、使い倒してみたい Kubernetes 周辺プロダクトのひとつだなぁと感じています😎
Discussion