如何为Kubernetes StatefulSet的Zabbix-Agent按索引匹配设置环境变量
问题:Zabbix Agent StatefulSet如何与同序号的Zabbix Server对应?
现有运行的Zabbix Server Pod状态
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/zabbix-server-0 1/1 Running 0 67m 10.244.1.12 i-0155b0a4f7376aea5 <none> <none> pod/zabbix-server-1 1/1 Running 0 73m 10.244.0.13 i-0af3ff4d3cc1a4a4a <none> <none> pod/zabbix-server-2 1/1 Running 0 73m 10.244.1.11 i-0155b0a4f7376aea5 <none> <none>
计划部署的Zabbix Agent StatefulSet配置
apiVersion: apps/v1 kind: StatefulSet metadata: namespace: mon-zabbix name: zabbix-agent spec: serviceName: zabbix-agent replicas: 3 selector: matchLabels: app: zabbix-agent template: metadata: labels: app: zabbix-agent spec: containers: - name: zabbix-agent image: zabbix/zabbix-agent:ubuntu-6.0-latest ports: - containerPort: 10050 env: - name: ZBX_SERVER_HOST value: zabbix-server-N <- 如何让zabbix-agent-0对应zabbix-server-0 - name: ZBX_HOSTNAME value: zabbix-server-N <- 如何让zabbix-agent-0对应zabbix-server-0 volumeMounts: - name: pvc mountPath: /etc/zabbix/zabbix_agentd.d securityContext: allowPrivilegeEscalation: false volumeClaimTemplates: - metadata: name: pvc spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 100Mi
核心问题
是否可以实现:让zabbix-agent-0的ZBX_SERVER_HOST和ZBX_HOSTNAME对应zabbix-server-0,zabbix-agent-1对应zabbix-server-1,以此类推?
回答
可以实现,通过Kubernetes的Downward API结合Shell参数展开就能完成对应关系配置,具体修改后的StatefulSet配置如下:
apiVersion: apps/v1 kind: StatefulSet metadata: namespace: mon-zabbix name: zabbix-agent spec: serviceName: zabbix-agent replicas: 3 selector: matchLabels: app: zabbix-agent template: metadata: labels: app: zabbix-agent spec: containers: - name: zabbix-agent image: zabbix/zabbix-agent:ubuntu-6.0-latest ports: - containerPort: 10050 # 改用bash执行启动命令,确保环境变量展开生效 command: ["/bin/bash", "-c"] args: ["exec /usr/sbin/zabbix_agentd -f"] env: # 通过Downward API获取当前Pod的完整名称 - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name # 提取Pod名称中的序号,拼接对应Zabbix Server名称 - name: ZBX_SERVER_HOST value: zabbix-server-$(POD_NAME##*-) - name: ZBX_HOSTNAME value: zabbix-server-$(POD_NAME##*-) volumeMounts: - name: pvc mountPath: /etc/zabbix/zabbix_agentd.d securityContext: allowPrivilegeEscalation: false volumeClaimTemplates: - metadata: name: pvc spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 100Mi
关键说明
POD_NAME字段:通过Downward API获取当前Pod的完整名称(例如zabbix-agent-0)$(POD_NAME##*-):这是Bash的参数展开语法,会截取Pod名称中最后一个-之后的内容,也就是序号部分(例如从zabbix-agent-0中提取0)- 启动命令调整:默认容器启动命令不会解析环境变量中的Shell语法,改用
bash -c执行启动命令,确保变量展开逻辑生效 - DNS解析保障:只要Zabbix Server是通过StatefulSet部署且名称为
zabbix-server,Kubernetes集群DNS会自动将zabbix-server-0这类名称解析到对应Pod的IP地址
内容的提问来源于stack exchange,提问作者Marco Ferrara
相关产品推荐
相关产品推荐

