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
- Zugriffe: 271