目的
- ImagePolicyWebhook を理解する
手段
killercodaで手を動かす
環境
killercoda
ImagePolicyWebhook とは
kube-apiserver に実装可能な admission control の1つです。admission control は kube-apiserver に対する通信に適用できるルールのようなものです。ImagePolicyWebhook の場合、kube-apiserver が外部のコンテナレジストリからコンテナイメージをダウンロードする動作を制御するものです。必要な設定ファイルは以下の通りです。
- admission_config.json: kube-apiserver とバックエンドの通信に適用される設定ファイル
controlplane:/etc/kubernetes/policywebhook$ cat admission_config.json
{
"apiVersion": "apiserver.config.k8s.io/v1",
"kind": "AdmissionConfiguration",
"plugins": [
{
"name": "ImagePolicyWebhook",
"configuration": {
"imagePolicy": {
"kubeConfigFile": "/etc/kubernetes/policywebhook/kubeconf", # ImagePolicyWebhookで利用する設定ファイルを指定します
"allowTTL": 100, # TTLを設定します
"denyTTL": 50,
"retryBackoff": 500,
"defaultAllow": false # バックエンドとの通信が失敗した場合、ダウンロード可否を設定します。falseはダウンロードを禁止します
}
}
}
]
}```
- admission_config.json: kube-apiserver とバックエンドの通信に適用される設定ファイル
```bash
controlplane:/etc/kubernetes/policywebhook$ cat kubeconf
apiVersion: v1
kind: Config
# clusters refers to the remote service.
clusters: # ImagePolicyWebhook を適用するバックエンドのサービスを定義します
- cluster:
certificate-authority: /etc/kubernetes/policywebhook/external-cert.pem # CA for verifying the remote service.
server: https://localhost:1234 # 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: # バックエンドとの通信に利用する TLS 証明書を設定します
- name: api-server
user:
client-certificate: /etc/kubernetes/policywebhook/apiserver-client-cert.pem # cert for the webhook admission controller to use
client-key: /etc/kubernetes/policywebhook/apiserver-client-key.pem # key matching the cert
kube-apiserver に対しては下記二つの設定が必要になります。
controlplane:/etc/kubernetes/manifests$ cat kube-apiserver.yaml |grep -E "Policy|admission"
- --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook # ImagePolicyWebhook を追加します
- --admission-control-config-file=/etc/kubernetes/policywebhook/admission_config.json # ImagePolicyWebhook で利用する設定ファイルを指定します
コンテナを起動します。
ontrolplane:/etc/kubernetes/manifests$ k run nginx --image=nginx
Error from server (Forbidden): pods "nginx" is forbidden: Post "https://localhost:1234/?timeout=30s": dial tcp 127.0.0.1:1234: connect: connection refused
controlplane:/etc/kubernetes/manifests$
# バックエンドとの TLS 通信に失敗したため、コンテナイメージのダウンロードに失敗します。
あとがき
もう一つくらい書きたい。