Вступ :-
Привіт, ентузіасти Kubernetes! Давайте поговоримо про щось, що набирає популярність у світі оркестрації контейнерів: OPA Gatekeeper. Якщо ви, як і я, вже чули цей термін у технічних розмовах, але не зовсім розумієте, про що йдеться, не хвилюйтеся — ми разом розберемо це таким чином, щоб було легко зрозуміти і цікаво досліджувати.
Налаштування Gatekeeper: Виконайте команду для ініціації налаштування Gatekeeper.
kubectl apply -f https://raw.githubusercontent.com/open-agent/gatekeeper/master/deploy/gate.yaml
Наступні об'єкти будуть створені після налаштування: Виконайте команду
kubectl get all -n gatekeeper-system
Перевірка Admission Control:
Після установки сервер API викликає webhook Gatekeeper для створення, оновлення або видалення ресурсів у кластері. Gatekeeper забезпечує комунікацію між сервером API та OPA, забезпечуючи виконання політик, визначених у OPA.
CustomResourceDefinition:
API CustomResourceDefinition (CRD) дозволяє створювати визначення користувацьких ресурсів.
Створення CRD дозволяє визначити новий ресурс згідно з вказаним ім'ям і схемою.
Gatekeeper використовує CRD, що дозволяє нам визначати ConstraintTemplates і Constraints для регулювання політик на ресурсах Kubernetes, таких як Pods, Deployments і Jobs.
Під час установки налаштовуються різні CRD: Виконайте команду
kubectl get crd | grep -i gatekeeper
Ім'я
Час створення
assign.mutations.gatekeeper.sh 2022-11-29T07:04:42Z
assignmetadata.mutations.gatekeeper.sh 2022-11-29T07:04:43Z
configs.config.gatekeeper.sh 2022-11-29T07:04:43Z
constraintpodstatuses.status.gatekeeper.sh 2022-11-29T07:04:43Z
constrainttemplatepodstatuses.status.gatekeeper.sh 2022-11-29T07:04:43Z
constrainttemplates.templates.gatekeeper.sh 2022-11-29T07:04:44Z
expansiontemplate.expansion.gatekeeper.sh 2022-11-29T07:04:44Z
modifyset.mutations.gatekeeper.sh 2022-11-29T07:04:44Z
mutatorpodstatuses.status.gatekeeper.sh 2022-11-29T07:04:44Z
providers.externaldata.gatekeeper.sh 2022-11-29T07:04:44Z
Серед них, constrainttemplates.templates.gatekeeper.sh
дозволяє створювати Constraints і Constraint Templates для Gatekeeper:
З: https://dev.to/ashokan/kubernetes-policy-management-ii-opa-gatekeeper-465g
- ConstraintTemplates описують методи валідації об'єктів Kubernetes у контролері доступу Gatekeeper, що складаються з:
- Rego коду, який визначає порушення політики.
- Схема, яка застосовується до об'єкта Constraint, як інстанція ConstraintTemplate.
- Constraint визначає вимоги, яких повинна дотримуватися система, інструктуючи Gatekeeper щодо виконання ConstraintTemplate.
З: https://grumpygrace.dev/posts/intro-to-gatekeeper-policies/
Нижче наведено зображення відносин між CRD, Constraint Template і Constraint:
Покрокова інструкція:
Для того щоб впровадити політику, яка забезпечує наявність специфічних міток для сутностей Kubernetes (наприклад, pod, namespaces), спочатку сформулюйте ConstraintTemplate, а потім — Constraint:
ConstraintTemplate:
Ось файл ConstraintTemplate.yaml
для створення ConstraintTemplate в кластері Kubernetes:
# ConstraintTemplate.yaml
# ---------------------------------------------------------------
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
# ----------------------------------------------------------------
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
validation:
openAPIV3Schema:
type: object
properties:
labels:
type: array
items:
type: string
# ----------------------------------------------------------------
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels violation[{"msg": msg, "details": {"missing_labels": missing}}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[_]}
missing := required - provided
count(missing) > 0
msg := sprintf("you must provide labels: %v", [missing])
}
# ----------------------------------------------------------------
Для того щоб створити ConstraintTemplate, застосуйте маніфест:
kubectl create -f ConstraintTemplate.yaml
Щоб переглянути доступні ConstraintTemplates:
kubectl get ConstraintTemplate
Constraint: Мітка Pod
Далі створимо Constraint, щоб вказати, що pod повинен містити мітку з назвою "app" під час створення.
Посилайтеся на файл Constraint pod-must-have-app-level.yaml
нижче:
# pod-must-have-app-level.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: pod-must-have-app-level
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
labels: ["app"]
Щоб ініціювати Constraint у кластері Kubernetes:
kubectl create -f pod-must-have-app-level.yaml
Перегляньте поточні Constraints:
kubectl get constraints
Ім'я
Дія виконання
Загальна кількість порушень
pod-must-have-app-level
Створення pod без необхідної мітки:
kubectl run nginx --image=nginx
- Результат: Помилка від сервера (Forbidden): webhook прийому "validation.gatekeeper.sh" відхилив запит: [pod-must-have-app-level] ви повинні надати мітки: {“app”}
Створення pod з необхідною міткою:
kubectl run nginx --image=nginx --labels=app=test
- Створення pod проходить без проблем.
Constraint: Мітка для простору імен (Namespace)
ConstraintTemplate може обслуговувати кілька Constraints. Раніше Constraints вимагали мітку, що стосується pod, аналогічно, Constraints можуть бути спрямовані на простори імен з конкретними мітками.
Використовуйте ns-must-label-state.yaml
для забезпечення мітку простору імен:
# ns-must-label-state.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: ns-must-label-state
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Namespace"]
parameters:
labels: ["state"]
Розгортання визначеного Constraint:
kubectl create -f ns-must-label-state.yaml
Перегляньте поточні Constraints:
kubectl get constraints
Ім'я
Дія виконання
Загальна кількість порушень
ns-must-label-state
pod-must-have-app-level
Спроба створення простору імен без необхідної мітки “state”:
Результат: Помилка від сервера (Forbidden): webhook прийому "validation.gatekeeper.sh" відхилив запит: [ns-must-label-state] ви повинні надати мітки: {“state”}
Успішне створення простору імен з міткою:
# test-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
labels:
state: dev
kubectl create -f test-ns.yaml
- Створення простору імен проходить без проблем.
Перевірка порушень:
Щоб перевірити детальні порушення поточних ресурсів Kubernetes проти Constraints:
kubectl describe
Описати Constraint "ns-must-label-state":
Name: ns-must-label-state
Namespace:
...
...
Статус:
Час аудиту: 2022-11-30T02:32:48Z
За Pod:
UID обмеження: 846a2d86-5d00-4eba-bd6a-669cd27fc703
Виконано: true
Id: gatekeeper-audit-56ddcd8749-htgk5
Спостережуване покоління: 1
Операції:
аудит
статус-мутації
статус
UID обмеження: 846a2d86-5d00-4eba-bd6a-669cd27fc703
Виконано: true
Id: gatekeeper-controller-manager-64fd6c8cfd-jh7qr
Спостережуване покоління: 1
Операції:
мутаційний webhook
webhook
UID обмеження: 846a2d86-5d00-4eba-bd6a-669cd27fc703
Виконано: true
Id: gatekeeper-controller-manager-64fd6c8cfd-q6ds9
Спостережуване покоління: 1
Операції:
мутаційний webhook
webhook
UID обмеження: 846a2d86-5d00-4eba-bd6a-669cd27fc703
Виконано: true
Id: gatekeeper-controller-manager-64fd6c8cfd-rbvsz
Спостережуване покоління: 1
Операції:
мутаційний webhook
webhook
Загальна кількість порушень: 5
Порушення:
Дія виконання: відхилити
Група:
Вид: Namespace
Повідомлення: ви повинні надати мітки: {"state"}
Назва: kube-public
Версія: v1
Дія виконання: відхилити
Група:
Вид: Namespace
Повідомлення: ви повинні надати мітки: {"state"}
Назва: kube-node-lease
Версія: v1
Дія виконання: відхилити
Група:
Вид: Namespace
Повідомлення: ви повинні надати мітки: {"state"}
Назва: gatekeeper-system
Версія: v1
Дія виконання: відхилити
Група:
Вид: Namespace
Повідомлення: ви повинні надати мітки: {"state"}
Назва: kube-system
Версія: v1
Дія виконання: відхилити
Група:
Вид: Namespace
Повідомлення: ви повинні надати мітки: {"state"}
Назва: default
Версія: v1
Події:
Вище показано кілька просторів імен, що порушують політику, оскільки вони були створені до того, як було накладено обмеження “ns-must-label-state”.
Висновок :-
Ось і все, друзі! Ми здійснили подорож у світ OPA Gatekeeper і його вплив на Kubernetes. Сподіваюся, ви так само захоплені цим, як і я. Пам’ятайте, OPA Gatekeeper — це не просто інструмент для вашого технічного стеку, це спосіб зробити ваш досвід роботи з Kubernetes більш безпечним, відповідним і, врешті-решт, приємнішим.
Дякую, що приєдналися до мене в цьому дослідженні OPA Gatekeeper. Бажаю більш плавних і безпечних Kubernetes досвідів для всіх нас. Удачі в контейнеризації!
Перекладено з: Unlocking the Power of OPA Gatekeeper: Transform Your Kubernetes Experience Today