Tanzu v1.29.7+ y Pod Security Admission

Kubernetes v1.26 comenzó a forzar la "seguridad de los pods" haciendo que Pod Security Admission, de forma predeterminada, esté activo en su forma más restrictiva. Para poder desactivar estas restricciones, se deben implementar Labels en los namespaces requeridos para enforce, audit y warn.

Siempre me pareció un poco arbitrario este cambio. Está bien intentar impulsar las mejores prácticas pero hacía falta tener una forma de modificar el comportamiento en forma global.

Estoy probando Tanzu Supervisor Cluster v1.29.7 (luego de actualizar vSphere a v8U3) y encuentro, con mucho agrado, que ahora podemos configurar Pod Security Admission a nivel global en un cluster de kubernetes directamente en el YAML que usamos para crearlo.

Nuevo objeto Cluster

Venía usando el objeto TanzuKubernetesCluster para crear nuevos clusters en Tanzu. Ahora se deja de usar en favor del objeto Cluster nativo de Kubernetes. El siguiente es un ejemplo básico de YAML:

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: cluster-01
  namespace: mi-namespace
spec:
  clusterNetwork:
    services:
      cidrBlocks: ["10.96.0.0/12"]
    pods:
      cidrBlocks: ["192.168.0.0/16"]
    serviceDomain: "cluster.local"
  topology:
    class: tanzukubernetescluster
    version: v1.30.1---vmware.1-fips-tkg.5
    controlPlane:
      replicas: 3
    workers:
      machineDeployments:
        - class: node-pool
          name: node-pool-1
          replicas: 3
    variables:
      - name: vmClass
        value: guaranteed-medium
      - name: storageClass
        value: tanzu-storage-policy
      - name: defaultStorageClass
        value: tanzu-storage-policy
El valor de spec.topology.version es el nombre del Tanzu Kubernetes Release y obtenemos ejecutando el siguiente comando en el namespace correspondiente del Supervisor Cluster
kubectl get tkr
El valor de spec.topology.variables - vmClass lo obtenemos ejecutando:
kubectl get vmclass
Ya tenemos listo el YAML básico para desplegar un cluster. Sin embargo, la gran novedad para mí es la capacidad de configurar PSA a nivel de cluster al momento del despliegue. Entonces, a las "variables" del YAML podemos agregar el siguiente bloque, por ejemplo, para un cluster de laboratorio:

      - name: podSecurityStandard
        value:
          audit: restricted
          auditVersion: latest
          enforce: privileged
          enforceVersion: latest
          warn: privileged
          warnVersion: latest
De modo que levanta las restricciones aunque las audita. El yaml completo quedaría así:

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: cluster-01
  namespace: mi-namespace
spec:
  clusterNetwork:
    services:
      cidrBlocks: ["10.96.0.0/12"]
    pods:
      cidrBlocks: ["192.168.0.0/16"]
    serviceDomain: "cluster.local"
  topology:
    class: tanzukubernetescluster
    version: v1.30.1---vmware.1-fips-tkg.5
    controlPlane:
      replicas: 3
    workers:
      machineDeployments:
        - class: node-pool
          name: node-pool-1
          replicas: 3
    variables:
      - name: vmClass
        value: guaranteed-medium
      - name: storageClass
        value: tanzu-storage-policy
      - name: defaultStorageClass
        value: tanzu-storage-policy
      - name: podSecurityStandard
        value:
          audit: restricted
          auditVersion: latest
          enforce: privileged
          enforceVersion: latest
          warn: privileged
          warnVersion: latest
Desplegamos nuestro cluster y ya podemos crear, por ejemplo, pods con una imagen "latest" sin necesidad de agregar labels a los namespaces:
kubectl run nginx --image nginx
Bravo!

Comentarios

Entradas populares de este blog

vRA8 - Definir redes disponibles por Projecto

Instalando servicios en un cluster de Tanzu

Aria Automation - crear lista ordenada de key-value en custom forms con Orchestrator