Контроллеры доступа - это то, что вы ищете.
Контроллеры доступа перехватывают операции для проверки того, что должно произойти, прежде чем операция будет совершена api-сервером.
Примером является ImagePolicyWebhook , контроллер доступа, который перехватывает операции Image для проверки, следует ли ему разрешить или отклонить.
Он вызовет конечную точку REST с такой полезной нагрузкой, как:
{
"apiVersion":"imagepolicy.k8s.io/v1alpha1",
"kind":"ImageReview",
"spec":{
"containers":[
{
"image":"myrepo/myimage:v1"
},
{
"image":"myrepo/myimage@sha256:beb6bd6a68f114c1dc2ea4b28db81bdf91de202a9014972bec5e4d9171d90ed"
}
],
"annotations":[
"mycluster.image-policy.k8s.io/ticket-1234": "break-glass"
],
"namespace":"mynamespace"
}
}
и ответ API: Разрешено :
{
"apiVersion": "imagepolicy.k8s.io/v1alpha1",
"kind": "ImageReview",
"status": {
"allowed": true
}
}
или Отклонено :
{
"apiVersion": "imagepolicy.k8s.io/v1alpha1",
"kind": "ImageReview",
"status": {
"allowed": false,
"reason": "image currently blacklisted"
}
}
Конечная точкаэто может быть лямбда-функция или контейнер, работающий в кластере.
В этом репозитории github github.com / flavio / kube-image-bouncer реализован пример с использованием ImagePolicyWebhook для отбраковки контейнеров с помощью тега «Последние».
Существует также возможность использовать флаг registry-whitelist
при запуске, чтобы передать список разрешенных реестров через запятую, это будет использоваться ValidatingAdmissionWebhook для проверки, если реестр внесен в белый список.
.
Другой альтернативой является проект Открытый агент политики [OPA].
OPA - это гибкий механизм, используемый для создания политик, основанных на правилах, для сопоставления ресурсов и принятия решений в соответствии с результатами этих выражений.Это мутирующий и проверяющий веб-крючок, который вызывается для сопоставления запросов сервера Kubernetes API от контроллера доступа, упомянутого выше.Таким образом, операция будет работать так же, как описано выше, с той лишь разницей, что правила пишутся как конфигурация, а не как код.Тот же пример вышеописанного переписывателя для использования OPA будет похож на это:
package admission
import data.k8s.matches
deny[{
"id": "container-image-whitelist", # identifies type of violation
"resource": {
"kind": "pods", # identifies kind of resource
"namespace": namespace, # identifies namespace of resource
"name": name # identifies name of resource
},
"resolution": {"message": msg}, # provides human-readable message to display
}] {
matches[["pods", namespace, name, matched_pod]]
container = matched_pod.spec.containers[_]
not re_match("^registry.acmecorp.com/.+$", container.image) # The actual validation
msg := sprintf("invalid container registry image %q", [container.image])
}
Вышеприведенное означает: запретить любой модуль, если изображение контейнера не соответствует следующему реестру registry.acmecorp.com