Instalación de ArgoCD

Si estás utilizando ArgoCD para gestionar tus recursos de Kubernetes, puede que desees instalar SUSE Security Admission Controller utilizando ArgoCD. Esto es posible, pero hay ciertas consideraciones. Desde la versión Admission Controller v1.17.0, la dependencia cert-manager ha sido eliminada. Hay un nuevo reconciliador de certificados que renueva automáticamente los certificados. Esto significa que el controlador Admission Controller se encarga de crear y renovar los certificados por ti. Esto incluye tanto la CA raíz como todos los certificados de webhook.

La creación inicial de la CA raíz y del certificado de webhook se realiza durante la instalación del chart de Helm utilizando las funciones de Helm disponibles. Así que, durante el renderizado del chart de Helm, la instalación verifica si los certificados ya están creados, y si no, los crea.

Esto plantea un problema al usar ArgoCD, ya que utiliza Helm únicamente para renderizar las plantillas, con toda la gestión del ciclo de vida de los recursos a cargo de ArgoCD. Cada vez que ArgoCD renderiza el chart de Helm para comprobar que la aplicación del clúster no se desvía de la definición del chart, intenta crear los certificados de nuevo. Como resultado, marca los secretos que almacenan los certificados y la configuración del webhook como no sincronizados.

Para resolver este problema, es necesario configurar la aplicación ArgoCD para ignorar:

  • el campo data en los secretos

  • el campo caBundle en el MutatingWebhookConfiguration

  • ValidatingWebhookConfiguration recursos.

Lo haces añadiendo el campo ignoreDifferences en la aplicación de ArgoCD:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: application-collection-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: helm
  name: application-collection
  url: dp.apps.rancher.io/charts
  enableOCI: "true"
  username: <your-username>
  password: <your-token>
EOF

kubectl create namespace suse-sec-adm-controller

kubectl create secret docker-registry application-collection \
  --namespace suse-sec-adm-controller \
  --docker-server=dp.apps.rancher.io \
  --docker-username=<your-username> \
  --docker-password=<your-token>
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: suse-sec-adm-controller
  namespace: argocd
spec:
  project: default
  source:
    repoURL: dp.apps.rancher.io/charts
    chart: suse-security-admission-controller
    targetRevision: 1.1.0
    helm:
      valuesObject:
        global:
          imagePullSecrets:
            - application-collection
  destination:
    server: https://kubernetes.default.svc
    namespace: suse-sec-adm-controller
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:     # Sync options which modifies sync behavior
      # When syncing changes, respect fields ignored by the ignoreDifferences configuration
      - RespectIgnoreDifferences=true
  # ignoreDifferences is the important configuration to avoid ArgoCD marking
  # the secrets and # webhook configurations as unsynchronized
  ignoreDifferences:
  - group: ""
    kind: "Secret"
    name: kubewarden-ca
    namespace: suse-sec-adm-controller
    jsonPointers:
      - /data
  - group: ""
    kind: "Secret"
    name: kubewarden-webhook-server-cert
    namespace: suse-sec-adm-controller
    jsonPointers:
      - /data
  - group: ""
    kind: "Secret"
    name: kubewarden-audit-scanner-client-cert
    namespace: suse-sec-adm-controller
    jsonPointers:
      - /data
  - group: "admissionregistration.k8s.io"
    kind: "MutatingWebhookConfiguration"
    jqPathExpressions:
      - '.webhooks[]?.clientConfig.caBundle'
  - group: "admissionregistration.k8s.io"
    kind: "ValidatingWebhookConfiguration"
    jqPathExpressions:
      - '.webhooks[]?.clientConfig.caBundle'

En el ejemplo, el aspecto clave es la configuración del ignoreDifferences para la aplicación del controlador Admission Controller. El resto del contenido proporciona contexto sobre cómo configurar la aplicación ArgoCD y ofrecer un ejemplo completo.