Подключить локальную папку как диск к контейнеру в Helm
В последнее время я переехал в другой проект, который полностью работает в Kubernetes на Azure AKS. Я честно пытался использовать Azure Monitor для мониторинга инфраструктуры и приложения. Но оно не смогло.
Поэтому я решил вернуться к своему любимом Zabbix, запустить его в Кубернетесе, отправлять письма и сообщения в Microsoft Teams и показывать графики в Grafana.
Ну, само собой, возник вопрос, как его деплоить в Kubernetes, как настраивать, как заливать кастомные скрипты?
- Деплоить - понятно - Helm.
- Настраивать - вручную или Terraform, кому как нравится.
Задача
На третьем вопросе я сегодня остановлюсь подробнее, потому что задача стоит примерно такая:
Как подключить все кастомные скрипты и конфиг-файлы к контейнеру с Zabbix Agent? При этом, я не хочу что-то менять в helm-чарте, чтобы все было автоматически.
Упрощенно это так: У меня есть папка с файлами (количество файлов меняется). Я хочу эту папку подключить в контейнер и читать эти файлы.
Решение
Общий процесс будет выглядеть так: берем папку, читаем список файлов, читаем каждый файл, конвертируем в Base64 и кладем в конфиг-мапу. Конфиг-мапу маунтим в контейнер.
Самое сложное тут - сформировать 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 }}
Дальше дело за малым: подключаем configmap (тут шаблон частичный, но вы разберетесь!).
Кусок, который ставим на уровень пода: /spec/template/spec/volumes
volumes:
- name: zabbixagent-customscripts-volume
configMap:
name: zabbixagent-customscripts
Кусок который ставим на уровень контейнера: /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 }}
Обязательно считаем хэш для configmap, чтобы перезагрузить под, если обновились файлы: /spec/template/metadata/annotations
template:
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap-zabbix-agent.yaml") . | sha256sum }}
В итоге, у вас получится примерно такой деплоймент (копировал экспорт, поэтому часть мусорных строк осталась):
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
- Просмотров: 1005