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
- Affichages : 735