Hängen Sie den lokalen Ordner als Volume in Helm in einen Container ein

Hängen Sie den lokalen Ordner als Volume in Helm in einen Container ein

Vor einiger Zeit bin ich auf ein anderes Projekt umgestiegen, das komplett in Kubernetes auf Azure AKS arbeitet. Ehrlich gesagt habe ich versucht, Azure Monitor zur Überwachung von Infrastruktur und Anwendung zu verwenden, aber es ist mir nicht gelungen.

Also habe ich beschlossen, zu meinem geliebten Zabbix zurückzukehren, es in Kubernetes auszuführen, E-Mails und Benachrichtigungen an Microsoft Teams zu senden und Grafiken und Panels in Grafana anzuzeigen.

Natürlich tauchte eine Frage auf, wie kann ich es in Kubernetes bereitstellen, wie konfiguriere ich, wie lade ich meine benutzerdefinierten Skripte hoch?

  • Setzen Sie – offensichtlich – Helm ein.
  • Konfigurieren - manuell oder Terraform, hängt von der Situation und den persönlichen Vorlieben ab.

Aufgabe

Die dritte Frage möchte ich in diesem Artikel klären, denn die Aufgabe ist folgende:

Wie werden alle benutzerdefinierten Skripte und Konfigurationsdateien mit Zabbix Agent in den Container eingebunden? Gleichzeitig möchte ich nichts in der Steuerkarte ändern, damit alles automatisch montiert wird.

Vereinfacht gesagt: Ich habe einen Ordner mit Dateien (Dateien und ihre Nummern können sich im Laufe der Zeit ändern). Ich möchte diesen Ordner im Container bereitstellen und diese Dateien lesen.

Lösung

Im Allgemeinen sieht der Prozess wie folgt aus: Ordner abrufen, Dateiliste lesen, jede Datei lesen, als Base64 codieren und in die Konfigurationskarte einfügen. Hängen Sie dann nur die Configmap in den Container ein.

Das Schwierigste hier ist das Generieren einer Konfigurationskarte:

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

Dann ist die Sache klein: mount configmap (hier ist die Vorlage teilweise, aber Sie werden alles herausfinden!).

Code zum Einfügen auf Pod-Ebene: /spec/template/spec/volumes

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

Code zum Einfügen auf Containerebene: /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 }}

Notwendig, um den Hash für configmap zu berechnen, um den Pod neu zu starten, wenn sich eine Datei geändert hat: /spec/template/metadata/annotations

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

Schließlich erhalten Sie eine ähnliche Bereitstellung (kopierter Export, also Teil der technischen Daten dort).:

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

  • Zugriffe: 30
Kommentar schreiben

Related Articles