Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Abrazando el cambio: Gobierno de Kubernetes como código con OPA y Gatekeeper

96af4f8a8f4d2fdf5827030da8848ca1?s=47 Ara
June 14, 2021

Abrazando el cambio: Gobierno de Kubernetes como código con OPA y Gatekeeper

Talk given at Kubernetes Community Days Spain 2021 - In Spanish

96af4f8a8f4d2fdf5827030da8848ca1?s=128

Ara

June 14, 2021
Tweet

Transcript

  1. Abrazando el cambio: Gobierno de Kubernetes como código con Gatekeeper

    Ara Pulido @arapulido
  2. Kubernetes es una plataforma de orquestación de contenedores que ayuda

    a ejecutar aplicaciones contenerizadas en producción
  3. Datadog es una plataforma de monitorización y analíticas que ayuda

    a mejorar la observabilidad de infraestructura y aplicaciones
  4. Policy?

  5. Reglas que describen el comportamiento del software (y las herramientas

    que fuerzan su cumplimiento) Policy
  6. Role Based Access Control RBAC

  7. RBAC Sujeto Recurso de la API de Kubernetes Verbo

  8. RBAC Sujeto Recurso de la API de Kubernetes Verbo user:ara

    apiVersion:v1/core kind:Pod create get watch
  9. Policy Authz

  10. ¿Puedo ejecutar una imagen descargada de un repositorio externo? ¿Tiene

    mi pod todas las etiquetas (labels) que exige mi organización?
  11. None
  12. None
  13. None
  14. Domain agnostic Policy (rego) Data (json) Pregunta (json) Decisión (json)

  15. None
  16. Gatekeeper

  17. Authentication API request

  18. Authentication Authorization API request

  19. Authentication Authorization Admission Controllers API request Validate Mutate

  20. Admission Controllers ValidatingAdmissionWebhook MutatingAdmissionWebhook Gatekeeper

  21. Gatekeeper usa las primitivas de Kubernetes CRDs Gatekeeper controller

  22. CRDs principales ConstraintTemplate Constraint Constraint Constraint Constraint Constraint Constraint Constraint

  23. ConstraintTemplate apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: k8srequiredlabels spec: crd:

    spec: names: kind: K8sRequiredLabels validation: # Schema for the `parameters` field openAPIV3Schema: properties: labels: type: array items: string targets: 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]) }
  24. Constraints apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: ns-must-have-gk spec: match:

    kinds: - apiGroups: [""] kinds: ["Namespace"] parameters: labels: ["gatekeeper"] apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: pod-required-labels spec: match: namespace: "default" kinds: - apiGroups: [""] kinds: ["Pod"] parameters: labels: ["do-not-delete"]
  25. Gatekeeper facilita la reutilización de políticas

  26. Gatekeeper facilita la reutilización de políticas Las imágenes solo pueden

    venir de repositorios conocidos
  27. Gatekeeper facilita la reutilización de políticas Las imágenes solo pueden

    venir de repositorios conocidos Los Deployments tienen que tener una serie de etiquetas
  28. Gatekeeper facilita la reutilización de políticas Las imágenes solo pueden

    venir de repositorios conocidos Los Deployments tienen que tener una serie de etiquetas Las imágenes requieren un digest
  29. Gatekeeper facilita la reutilización de políticas Las imágenes solo pueden

    venir de repositorios conocidos Los Deployments tienen que tener una serie de etiquetas Las imágenes requieren un digest Los contenedores tienen que establecer límites para CPU y memoria dentro de unos valores
  30. Gatekeeper Library

  31. https-only

  32. https-only

  33. https://github.com/open-policy-agent/gatekeeper-library

  34. Observabilidad

  35. Métricas por defecto ConstraintTemplates, Constraints (gauge) 35 Webhook: #requests (count)

    and latency (histogram) Audit: #violations (count) and time last run (gauge) Sync: # resources cached (count) and time last run (gauge)
  36. Integración con Datadog 36

  37. Demo

  38. El host tiene que ser único para todos los objetos

    Ingress
  39. Policy Data El host tiene que ser único para todos

    los objetos Ingress
  40. apiVersion: config.gatekeeper.sh/v1alpha1 kind: Config metadata: name: config namespace: "gatekeeper-system" spec:

    sync: syncOnly: - group: "extensions" version: "v1beta1" kind: "Ingress" - group: "networking.k8s.io" version: "v1beta1" kind: "Ingress" Policy Data El host tiene que ser único para todos los objetos Ingress
  41. Demo

  42. ¡Muchas gracias! @arapulido