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.

Inicio rápido de trazado

Esta sección muestra cómo habilitar el soporte de trazado para el Servidor de Políticas.

Antes de continuar, asegúrate de haber completado la sección anterior OpenTelemetry de esta documentación. Es necesario que esta sección funcione correctamente.

El trazado te permite recopilar detalles precisos sobre las evaluaciones de políticas. Puede ser una herramienta útil para depurar problemas en tu ampliación de SUSE Security Admission Controller y políticas.

Utilizas Jaeger — que se utiliza para recibir, almacenar y visualizar eventos de trazado.

Instalar Jaeger

Utilizas el Operador de Jaeger para gestionar todos los diferentes componentes de Jaeger. Puedes instalar el Operador de Jaeger utilizando charts de Helm.

En el momento de escribir (2022-06-21), solo versiones específicas de Jaeger son compatibles con Cert Manager, ver la tabla de compatibilidad.

Para instalar el Chart de Helm:

helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm upgrade -i --wait \
  --namespace jaeger \
  --create-namespace \
  --version 2.49.0 \
  jaeger-operator jaegertracing/jaeger-operator \
  --set rbac.clusterRole=true

Esto no es adecuado para ampliaciones en producción. Deberías consultar y leer la documentación oficial de Jaeger.

Para crear un recurso de Jaeger:

kubectl apply -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: my-open-telemetry
  namespace: jaeger
spec: {}
EOF

Después de la creación de recursos del Operador de Jaeger, tienes un Servicio bajo my-open-telemetry-collector.jaeger.svc.cluster.local. La interfaz de usuario de consulta de Jaeger está expuesta por el Servicio my-open-telemetry-query en el espacio de nombres jaeger.

Instalar Admission Controller

Ahora puedes proceder a la ampliación de Admission Controller de la manera habitual.

El cert-manager es un requisito de OpenTelemetry, pero ya lo has instalado en una sección anterior de esta documentación.

Como primer paso, añades el repositorio de Helm que contiene Admission Controller:

helm repo add kubewarden https://charts.kubewarden.io

Luego instalas las definiciones de recursos personalizadas (CRDs) definidas por Admission Controller:

helm install --wait \
  --namespace kubewarden \
  --create-namespace \
  kubewarden-crds kubewarden/kubewarden-crds

Ahora puedes desplegar el resto de la pila de Admission Controller. El chart de Helm oficial de kubewarden-defaults crea un PolicyServer llamado default. Quieres que esta instancia de PolicyServer tenga el trazado habilitado.

Para ello, necesitas especificar algunos valores adicionales para el chart de kubewarden-controller. Deberías crear un archivo values.yaml con el siguiente contenido:

telemetry:
  mode: sidecar
  tracing: True
  sidecar:
    tracing:
      jaeger:
        endpoint: "my-open-telemetry-collector.jaeger.svc.cluster.local:4317"
        tls:
          insecure: true

Por simplicidad, no hay cifrado de la comunicación entre el recolector de OpenTelemetry y el punto final de Jaeger.

Nuevamente, esto es inadecuado para una ampliación en producción. Consulta la documentación oficial de Jaeger.

Luego puedes proceder con la instalación de los charts de Helm:

helm install --wait --namespace kubewarden --create-namespace \
  --values values.yaml \
  kubewarden-controller kubewarden/kubewarden-controller

helm install --wait --namespace kubewarden --create-namespace \
  kubewarden-defaults kubewarden/kubewarden-defaults

Esto crea la instancia de default de PolicyServer:

kubectl get policyservers.policies.kubewarden.io
NAME      AGE
default   3m7s

Al observar más de cerca el Pod que ejecuta la instancia de PolicyServer, puedes ver que tiene dos contenedores en él. El policy-server y el contenedor auxiliar de OpenTelemetry Collector otc-container.

Haciendo cumplir una directiva

Comienzas desplegando la directiva safe-labels.

Quieres que la directiva se aplique solo en los espacios de nombres que tienen una etiqueta environment con un valor de production.

A un espacio de nombres que tiene tal etiqueta:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha-prod
  labels:
    environment: production
EOF

A continuación, puedes definir una ClusterAdmissionPolicy:

kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: safe-labels
spec:
  module: registry://ghcr.io/kubewarden/policies/safe-labels:v0.1.6
  settings:
    mandatory_labels:
    - owner
  rules:
    - apiGroups:
        - apps
      apiVersions:
        - v1
      resources:
        - deployments
      operations:
        - CREATE
        - UPDATE
  namespaceSelector:
    matchExpressions:
    - key: environment
      operator: In
      values: ["production"]
  mutating: false
EOF

Necesitas esperar a que la directiva se active:

kubectl wait --for=condition=PolicyActive clusteradmissionpolicy/safe-labels

Una vez que la directiva esté activa, puedes probarla:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: team-alpha-prod
  labels:
    owner: octocat
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

La directiva permite la creación de este objeto Deployment ya que no viola la directiva.

La directiva bloquea este objeto Deployment:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-without-labels
  namespace: team-alpha-prod
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

La directiva no se aplica en otro espacio de nombres.

Este comando crea un nuevo espacio de nombres llamado team-alpha-staging:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha-staging
  labels:
    environment: staging
EOF

La directiva permite la creación de un recurso Deployment, sin ninguna etiqueta, en el espacio de nombres team-alpha-staging:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-without-labels
  namespace: team-alpha-staging
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

Como se esperaba, este recurso se crea con éxito.

Explorando la interfaz de usuario de Jaeger

Puedes ver los eventos de traza enviados por la instancia de PolicyServer a Jaeger, ya que hay un nuevo servicio kubewarden-policy-server listado en la interfaz de usuario:

tablero de Jaeger

El colector de Jaeger está recibiendo las trazas generadas por tu PolicyServer.

Si instalaste Traefik en la guía anterior, expón la interfaz de usuario de Jaeger Query con este Ingress:

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-open-telemetry-query
  namespace: jaeger
spec:
  ingressClassName: traefik
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-open-telemetry-query
                port:
                  number: 16686
EOF

Para acceder a la interfaz de usuario de Jaeger con Traefik, ejecuta:

kubectl -n traefik port-forward service/traefik 8080:80

Luego ve a http://localhost:8080.

Si prefieres omitir Traefik, accede a Jaeger directamente:

kubectl -n jaeger port-forward service/my-open-telemetry-query 16686

Luego ve a http://localhost:16686.