コンテンツにスキップ

リソース定義@Kyverno

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. セットアップ

インストール

▼ チャートとして

チャートリポジトリからチャートをインストールし、Kubernetesリソースを作成する。

$ helm repo add <チャートリポジトリ名> https://kyverno.github.io/kyverno/

$ helm repo update

$ kubectl create namespace kyverno

$ helm install <Helmリリース名> <チャートリポジトリ名>/kyverno -n kyverno --version <バージョンタグ>


02. ClusterPolicy

validationFailureAction

▼ validationFailureActionとは

ルールに則っていないKubernetesリソースの作成/更新があった場合に、これを拒否するか、または許可するが監査ログを記録するかを設定する。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: foo-policy
  namespace: kyverno
spec:
  validationFailureAction: enforce


background

▼ backgroundとは

Kyvernoの導入後に作成/更新されるKubernetesだけでなく、導入前の既存のKubernetesリソースもKyvernoの検査対象とするかを設定する。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: foo-policy
  namespace: kyverno
spec:
  background: "false"


rules

▼ rulesとは

Webhook時に実行するKyvernoのルールを設定する。

▼ Mutateルールの場合

*実装例*

コンテナイメージのタグ名が『latest』だった場合に、マニフェストにimagePullPolicyキーを追加する。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: foo-policy
  namespace: kyverno
spec:
  rules:
    - name: pod-image-pull-policy-mutator
      match:
        any:
          - resources:
              kinds:
                - Pod
      mutate:
        patchStrategicMerge:
          spec:
            containers:
              - (image): "*:latest"
                imagePullPolicy: "IfNotPresent"

▼ Validateルールの場合

*実装例*

Podのマニフェストのmetadata.labelsキー以下に、app.kubernetes.io/nameキーがあるか否かを検証する。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: foo-policy
  namespace: kyverno
spec:
  rules:
    - name: pod-labels-validator
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "Label ('app.kubernetes.io/name') is required"
        pattern:
          metadata:
            labels:
              app.kubernetes.io/name: "?*"

*実装例*

Podのマニフェストの.spec.containersキー以下に、resourcesキーがあるか否かを検証する。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: foo-policy
  namespace: kyverno
spec:
  rules:
    - name: pod-container-resources-validator
      match:
        resources:
          kinds:
            - Pod
          namespaces:
            - foo
      validate:
        message: "Container resources is required"
        pattern:
          spec:
            containers:
              - name: "*"
                resources:
                  limits:
                    memory: "?*"
                    cpu: "?*"
                  requests:
                    memory: "?*"
                    cpu: "?*"