Розблокуйте потужність OPA Gatekeeper: змініть свій досвід роботи з Kubernetes вже сьогодні

pic

Вступ :-

Привіт, ентузіасти 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

Leave a Reply

Your email address will not be published. Required fields are marked *