Monter le dossier local sur un conteneur en tant que volume dans Helm

Monter le dossier local sur un conteneur en tant que volume dans Helm

Il y a quelque temps, je suis passé à un autre projet, qui fonctionne entièrement dans Kubernetes sur Azure AKS. Honnêtement, j'ai essayé d'utiliser Azure Monitor pour la surveillance de l'infrastructure et des applications, mais je n'ai pas réussi.

J'ai donc décidé de revenir à mon Zabbix profondément aimé, de l'exécuter dans Kubernetes, d'envoyer des e-mails et des notifications à Microsoft Teams et d'afficher des graphiques et des panneaux dans Grafana.

Bien sûr, une question est apparue, comment le déployer sur Kubernetes, comment le configurer, comment uploader mes scripts personnalisés?

  • Déployez - évidemment - Helm.
  • Configurer - manuellement ou Terraform, dépend de la situation et des préférences personnelles.

Tâche

La troisième question que je veux clarifier dans cet article, car la tâche est la suivante:

Comment monter tous les scripts personnalisés et les fichiers de configuration dans le conteneur avec l'agent Zabbix ? En même temps, je ne veux rien changer dans helm-chart, pour que tout se monte automatiquement.

Simplifier : J'ai un dossier avec des fichiers (les fichiers et leurs numéros peuvent changer au cours du temps). Je veux monter ce dossier dans un conteneur et lire ces fichiers.

Solution

En général, le processus sera le suivant : obtenir le dossier, lire la liste des fichiers, lire chaque fichier, encoder en Base64 et mettre dans configmap. Ensuite, montez uniquement configmap sur le conteneur.

Le plus difficile ici - est de générer configmap :

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 }}

Ensuite, le problème est petit: monter configmap (ici le modèle est partiel, mais vous comprendrez tout!).

Code à mettre au niveau du pod: /spec/template/spec/volumes

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

Code à mettre au niveau du conteneur: /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 }}

Nécessairement pour calculer le hachage pour que configmap redémarre le pod si un fichier avait changé: /spec/template/metadata/annotations

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

Enfin, vous obtiendrez un déploiement similaire à quelque chose comme ça (copié l'exportation, donc une partie des données techniques là-bas):

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 (fr)

  • Affichages : 540
Ajouter un commentaire

Related Articles