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
- Visto: 917