Montar la carpeta local a un contenedor como un volumen en Helm

Montar la carpeta local a un contenedor como un volumen en Helm

Hace tiempo yo cambié al otro proyecto, que está funcionando en Kubernetes compleramente en Azure AKS. Honestamente, yo traté a usar el Azure Monitor para monitorear la infraestructura y aplicación, pero no tuve éxito.

Pués, yo decidí volver a mi amado Zabbix, ejecutarlo en Kubernetes, enviar email y notificaciones a Microsoft Teams y mostrar gráficos y paneles en Grafana.

Naturalmente, la pregunta apareció, ¿cómo instalarlo en Kubernetes, cómo configurarlo, cómo subir mi scriptos customizados?

  • Implementar - obviamente - Helm.
  • Configurar - manualmente o Terraform, depende de la situación y preferencias personales.

Tarea

La tercera cuestión que quiero aclarar en este artículo, por que la tarea es la siguente:

¿Cómo montar todos los scripts personalizados y archivos de configuración en el contenedor con Zabbix Agent? Al mismo tiempo, no quiero cambiar nada en el gráfico Helm, por lo que todo se montará automáticamente.

Simplificando: tengo una carpeta con archivos (los archivos y sus números pueden cambiar con el tiempo). Quiero montar esa carpeta en el contenedor y leer esos archivos.

Solución

En general, el proceso será el siguiente: obtener carpeta, leer la lista de archivos, leer cada archivo, codificar como Base64 y poner en configmap. Luego, solo monte el mapa de configuración en el contenedor.

Lo más difícil aquí es generar un mapa de configuración:

apiVersion: v1
kind: ConfigMap
metadata:
  name: zabbixagent-customscripts
  labels:
    {{- include "zabbix.labels" . | nindent 4 }}
binaryData:
{{ range $path, $_ :=  .Files.Glob  "customScripts/**" }}
{{- $name := base $path }}
{{- sha256sum (printf "%s/%s" (index (regexSplit "customScripts" (dir $path) -1) 1 ) $name ) | indent 2 }}{{ print ": "}}{{ $.Files.Get $path | replace "\r\n" "\n" | b64enc }}
{{ end }}

Entonces el asunto es pequeño: monte el mapa de configuración (aquí la plantilla es parcial, ¡pero lo resolverás todo!).

Código para poner en el nivel de pod: /spec/template/spec/volumes

volumes:
  - name: zabbixagent-customscripts-volume
    configMap:
      name: zabbixagent-customscripts

Código para poner en el nivel del contenedor: /spec/template/spec/containers/zabbix-agent/volumeMounts

volumeMounts:
  {{ range $path, $bytes := .Files.Glob ( printf "customScripts/**") }}
  {{ $name := base $path }}
  - name: zabbixagent-customscripts-volume
    mountPath: {{ printf "/etc/zabbix/zabbix_agentd.d/customScripts/%s/%s" (index (regexSplit "customScripts" (dir $path) -1) 1) $name | indent 2 }}
    subPath: {{- sha256sum (printf "%s/%s" (index (regexSplit "customScripts" (dir $path) -1) 1 ) $name ) | indent 2 }}
  {{ end }}

Necesariamente para calcular el hash para el mapa de configuración para reiniciar el pod si algún archivo ha cambiado: /spec/template/metadata/annotations

template:
  metadata:
    annotations:
      checksum/config: {{ include (print $.Template.BasePath "/configmap-zabbix-agent.yaml") . | sha256sum }}

Finalmente, obtendrás una implementación similar a algo como esto (copió la exportación, por lo que forma parte de los datos técnicos allí):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zabbix-zabbix-server
  namespace: zabbix
  uid: f022b8d1-a505-4f17-9a9c-ce146415f5e4
  resourceVersion: '141741819'
  generation: 34
  creationTimestamp: '2022-09-06T09:39:29Z'
  labels:
    app: zabbix-zabbix-server
    app.kubernetes.io/instance: zabbix-zabbix-server
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: zabbix-server
    helm.sh/chart: zabbix-3.1.1
  annotations:
    deployment.kubernetes.io/revision: '30'
    meta.helm.sh/release-name: zabbix
    meta.helm.sh/release-namespace: zabbix
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zabbix-zabbix-server
  template:
    metadata:
      creationTimestamp: null
      labels:
        aadpodidbinding: zabbix-identity
        app: zabbix-zabbix-server
        app.kubernetes.io/instance: zabbix-zabbix-server
        app.kubernetes.io/managed-by: Helm-zabbix-server
        app.kubernetes.io/name: zabbix-server
        helm.sh/chart: zabbix-3.1.1
      annotations:
        checksum/config: 7493b02952c1ee885d8ec3cdddf1503185d9c23f7a24994802485f87047f1e07
        kubectl.kubernetes.io/restartedAt: '2022-11-08T17:03:37Z'
    spec:
      volumes:
        - name: zabbixserver-tmp
          emptyDir: {}
        - name: zabbixserver-etc-zabbix
          emptyDir: {}
        - name: zabbixagent-tmp
          emptyDir: {}
        - name: zabbixagent-etc-zabbix
          emptyDir: {}
        - name: zabbixagent-customscripts-volume
          configMap:
            name: zabbixagent-customscripts
            defaultMode: 420
        - name: zabbixagent-customconfigs-volume
          configMap:
            name: zabbixagent-customconfigs
            defaultMode: 420
      containers:
        - name: zabbix-server
          image: acr.azurecr.io/sre-zabbix-server:zabbix-12.12.2022-02.08
          ports:
            - name: zabbix-server
              containerPort: 10051
              protocol: TCP
            - name: zabbix-jmx
              containerPort: 10052
              protocol: TCP
          env:
            - name: DB_SERVER_HOST
              value: zabbix-postgresql
            - name: DB_SERVER_PORT
              value: '5432'
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: zabbixdb-pguser-zabbix
                  key: user
                  optional: true
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: zabbixdb-pguser-zabbix
                  key: password
            - name: POSTGRES_DB
              valueFrom:
                secretKeyRef:
                  name: zabbixdb-pguser-zabbix
                  key: dbname
                  optional: true
            - name: ZBX_CACHESIZE
              value: 1G
            - name: ZBX_HISTORYCACHESIZE
              value: 128M
            - name: ZBX_VALUECACHESIZE
              value: 256M
            - name: ZBX_STARTLLDPROCESSORS
              value: '20'
            - name: ZBX_STARTHISTORYPOLLERS
              value: '25'
            - name: ZBX_STARTPREPROCESSORS
              value: '30'
            - name: ZBX_STARTHTTPPOLLERS
              value: '25'
            - name: ZBX_STARTPOLLERS
              value: '70'
            - name: ZBX_STARTPOLLERSUNREACHABLE
              value: '25'
            - name: ZBX_TIMEOUT
              value: '30'
            - name: ZBX_AUTOHANODENAME
              value: hostname
            - name: ZBX_NODEADDRESS
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
          resources: {}
          volumeMounts:
            - name: zabbixserver-tmp
              mountPath: /tmp/
            - name: zabbixserver-etc-zabbix
              mountPath: /etc/zabbix/
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
          securityContext:
            runAsUser: 1997
            runAsNonRoot: true
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
        - name: zabbix-agent
          image: acr.azurecr.io/sre-zabbix-agent2:zabbix-12.12.2022-02.08
          ports:
            - name: zabbix-agent
              containerPort: 10050
              protocol: TCP
          env:
            - name: ZBX_HOSTNAME
              value: Zabbix server
            - name: ZBX_SERVER_HOST
              value: 127.0.0.1
            - name: ZBX_SERVER_PORT
              value: '10051'
            - name: ZBX_PASSIVE_ALLOW
              value: 'true'
            - name: ZBX_PASSIVESERVERS
              value: 127.0.0.1
            - name: ZBX_ACTIVE_ALLOW
              value: 'true'
            - name: ZBX_ACTIVESERVERS
            - name: ZBX_DEBUGLEVEL
            - name: ZBX_TIMEOUT
              value: '30'
            - name: ZBX_LOADMODULE
            - name: ZBX_UNSAFEUSERPARAMETERS
              value: '1'
          resources: {}
          volumeMounts:
            - name: zabbixagent-tmp
              mountPath: /tmp/
            - name: zabbixagent-etc-zabbix
              mountPath: /etc/zabbix/
            - name: zabbixagent-customscripts-volume
              mountPath: >-
                /etc/zabbix/zabbix_agentd.d/customScripts//discovery-azure-resource-names.sh
              subPath: 2cb955a37388a8b19625881af61b649fbd80bb79445c68ba5e9d6ea408e5d0b2
            - name: zabbixagent-customscripts-volume
              mountPath: >-
                /etc/zabbix/zabbix_agentd.d/customScripts//get-azmon-metric-dimension-value.sh
              subPath: 6ebdd1ee42938288ef7feb846e4565a25a64d84789b5d3b09a13e8db50deeed7
            - name: zabbixagent-customscripts-volume
              mountPath: >-
                /etc/zabbix/zabbix_agentd.d/customScripts//get-azmon-metric-value.sh
              subPath: 4d4b274589ed92b0b7bd2c1ced85e016b293bc72cb130b475d4ee2c3aeb5e715
            - name: zabbixagent-customscripts-volume
              mountPath: >-
                /etc/zabbix/zabbix_agentd.d/customScripts//get-azure-servicebus-topics-metrics.sh
              subPath: 5f478d191e20496bb0717f4c75e4ba0ef65cd08dd25c94091dd2abc2152d217a
            - name: zabbixagent-customscripts-volume
              mountPath: >-
                /etc/zabbix/zabbix_agentd.d/customScripts//get-etlsync-error-count.sh
              subPath: 4396ef39da4e52a036dfdc075e3726a4487e49959e4037d61d60ebc66d8adfdf
            - name: zabbixagent-customscripts-volume
              mountPath: >-
                /etc/zabbix/zabbix_agentd.d/customScripts//kusto/etlsync-errors-count.kusto
              subPath: 5ee630c0c537e6e7c63ee5f1d97845e47e7878bbf93ae3acb1cedc8a8f7b86f8
            - name: zabbixagent-customscripts-volume
              mountPath: /etc/zabbix/zabbix_agentd.d/customScripts//test-script.ps1
              subPath: fed07e23de807313771fa94de7ae16b8b8032a08c269ace5b9c0eae0b07720e9
            - name: zabbixagent-customconfigs-volume
              mountPath: /etc/zabbix/zabbix_agentd.d//userParameters.conf
              subPath: cb99c00393da314983b2b2d2857189ea150cfb91ce50dd5836da6420f4c8b43e
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
          securityContext:
            runAsUser: 1997
            runAsNonRoot: true
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app.kubernetes.io/instance: zabbix-zabbix-server
                topologyKey: kubernetes.io/hostname
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

Helm (es)

  • Visto: 555
Add comment

Related Articles