ImagePolicyWebhookを試す

ImagePolicyWebhookを有効にする手順を確認したメモ。実装はないので動かない。手順の確認のみ。

参考リンク

手順

EKSの場合は、有効にされているAdmission Controllerは以下に記載があり、ImagePolicyWebhookは有効になっていないし、勝手に有効にすることもできない。

kubeadmで作成したクラスターの場合は、kube-apiserverのマニフェスト(/etc/kubernetes/manifests/kube-apiserver.yaml)を変更して有効にすればよい。

先にAdmission Controllerの設定ファイルを作成する。

root@cks-master:/etc/kubernetes/admission# ls -l
total 24
-rw-r--r-- 1 root root  298 Jan  1 18:16 admission_config.yaml
-rw-r--r-- 1 root root 1135 Jan  1 18:16 apiserver-client-cert.pem
-rw-r--r-- 1 root root 1703 Jan  1 18:16 apiserver-client-key.pem
-rw-r--r-- 1 root root 1132 Jan  1 18:16 external-cert.pem
-rw-r--r-- 1 root root 1703 Jan  1 18:16 external-key.pem
-rw-r--r-- 1 root root  815 Jan  1 18:16 kubeconf

admission_config.yamlが設定ファイルで、実装への接続情報を記載するkubeconfgフォーマットのファイルのパスを指定する。

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
  - name: ImagePolicyWebhook
    configuration:
      imagePolicy:
        kubeConfigFile: /etc/kubernetes/admission/kubeconf
        allowTTL: 50
        denyTTL: 50
        retryBackoff: 500
        defaultAllow: false

kubeconfが実装への接続のための情報で、kubeconfigフォーマットで指定している。TLSを使う必要がある。

apiVersion: v1
kind: Config

# clusters refers to the remote service.
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/admission/external-cert.pem  # CA for verifying the remote service.
    server: https://external-service:1234/check-image                   # URL of remote service to query. Must use 'https'.
  name: image-checker

contexts:
- context:
    cluster: image-checker
    user: api-server
  name: image-checker
current-context: image-checker
preferences: {}

# users refers to the API server's webhook configuration.
users:
- name: api-server
  user:
    client-certificate: /etc/kubernetes/admission/apiserver-client-cert.pem     # cert for the webhook admission controller to use
    client-key:  /etc/kubernetes/admission/apiserver-client-key.pem             # key matching the cert

kube-apiserverのマニフェストを変更する。ボリュームのマウントが必要なことに注意。

(省略)
    # - --enable-admission-plugins=NodeRestriction
    - --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
    - --admission-control-config-file=/etc/kubernetes/admission/admission_config.yaml
(省略)
    volumeMounts:
    - mountPath: /etc/kubernetes/admission
      name: k8s-admission
      readOnly: true
(省略)
  volumes:
  - hostPath:
      path: /etc/kubernetes/admission
      type: DirectoryOrCreate

動作を試す。実装に接続できないのでエラーになる。

root@cks-master:/etc/kubernetes/manifests# k run test --image=nginx
Error from server (Forbidden): pods "test" is forbidden: Post "https://external-service:1234/check-image?timeout=30s": dial tcp: lookup external-service on 169.254.169.254:53: no such host

デフォルトの挙動をdefaultAllow: trueに変更する。

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
  - name: ImagePolicyWebhook
    configuration:
      imagePolicy:
        kubeConfigFile: /etc/kubernetes/admission/kubeconf
        allowTTL: 50
        denyTTL: 50
        retryBackoff: 500
        defaultAllow: false

kube-apiserverを再起動してもう一度試す。

root@cks-master:/etc/kubernetes/manifests# k run test --image=nginx
pod/test created