|
Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado. |
|
Esta es documentación inédita para Admission Controller 1.34-dev. |
Creación de una nueva directiva
Puedes crear una directiva de ejemplo que ayude a entender los conceptos importantes.
|
Hay una kubewarden/opa-policy-template que puedes usar para portar una directiva existente. |
La directiva
Vas a crear una directiva que evalúe cualquier tipo de recurso con espacio de nombres.
Su objetivo es prohibir la creación de cualquier recurso si el espacio de nombres objetivo es default. De lo contrario, la solicitud es aceptada.
Comienza creando una carpeta llamada opa-policy.
Crea una carpeta llamada data en la carpeta opa-policy.
Esta carpeta tiene los objetos AdmissionReview grabados del servidor de la API de Kubernetes.
Se han reducido por simplicidad para el ejercicio, así puedes centrarte en los aspectos que importan.
Crea un archivo default-ns.json con el siguiente contenido dentro del directorio data:
{
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"request": {
"uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
"operation": "CREATE",
"object": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "nginx",
"namespace": "default",
"uid": "04dc7a5e-e1f1-4e34-8d65-2c9337a43e64"
}
}
}
}
Esto simula la creación de una operación de pod dentro del espacio de nombres default.
Ahora, crea otro ejemplo de solicitud en other-ns.json dentro del directorio data:
{
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"request": {
"uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
"operation": "CREATE",
"object": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "nginx",
"namespace": "other",
"uid": "04dc7a5e-e1f1-4e34-8d65-2c9337a43e64"
}
}
}
}
Puedes ver que esto simula otra solicitud de creación de pod, esta vez bajo un espacio de nombres llamado other.
Vuelve a tu carpeta opa-policy y comienza a escribir tu directiva Rego.
En esta carpeta, crea un archivo llamado request.rego en la carpeta opa-policy.
El nombre puede ser cualquier cosa, pero lo usarás para este ejercicio.
Este es un archivo Rego que contiene código de utilidad relacionado con la solicitud/respuesta en sí.
En particular, te permite simplificar tu código de directiva y reutilizar esta parte común en diferentes directivas.
El contenido es:
package policy
import data.kubernetes.admission
main = {
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"response": response,
}
response = {
"uid": input.request.uid,
"allowed": false,
"status": {"message": reason},
} {
reason = concat(", ", admission.deny)
reason != ""
} else = {
"uid": input.request.uid,
"allowed": true,
} {
true
}
No tienes necesidad, en este momento, de entrar en detalle en el código Rego. Puedes aprender sobre ello en su sitio web.
En este caso, devuelve ya sea allowed: true o allowed: false.
Esto depende de si el otro paquete, data.kubernetes.admission, tiene alguna declaración deny que evalúe a true.
Si alguna data.kubernetes.admission.deny evalúa a true, la response aquí evalúa al primer bloque.
De lo contrario, evalúa al segundo bloque, lo que lleva a la aceptación.
Debido a que ningún bloque deny evaluó a true, esto significa que la directiva está aceptando la solicitud.
Esto es solo el shell de la directiva, la utilidad.
Ahora, creas otro archivo, llamado, por ejemplo, policy.rego dentro de nuestra carpeta opa-policy con estos contenidos:
package kubernetes.admission
deny[msg] {
input.request.object.metadata.namespace == "default"
msg := "it is forbidden to use the default namespace"
}
Esta es la parte importante de tu directiva.
La declaración deny evalúa a true si todas las declaraciones dentro de ella evalúan a true.
En este caso, solo hay una declaración, comprobando si el espacio de nombres es default.
Por diseño de Open Policy Agent,
input tiene el objeto consultable con el objeto AdmissionReview,
así que podemos inspeccionarlo de manera conveniente.
Si todo ha ido bien, tu árbol debería verse como el siguiente:
.
├── data
│ ├── default-ns.json
│ └── other-ns.json
├── policy.rego
└── request.rego
1 directory, 4 files