You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中MySQL容器探针正常但日志报错,求无脚本解决方案

无报错的MySQL就绪探针实现方案

问题回顾

在Kubernetes Deployment中配置了两种MySQL探针:

配置1:TCP Socket探针

readinessProbe:
  tcpSocket:
    port: 3306
  initialDelaySeconds: 30
  periodSeconds: 10
livenessProbe:
  tcpSocket:
    port: 3306

日志报错:"Got an error reading communication packets"

配置2:Exec探针(无凭据)

readinessProbe:
  exec:
    command: ["mysqladmin", "ping", "-h", "localhost"]
    ...
livenessProbe:
  exec:
    command: ["mysqladmin", "ping", "-h", "localhost"]
    ...

日志报错:"Access denied for user 'root'@'localhost' (using password: NO)"

两种探针均能正确识别容器状态,但会产生大量冗余错误日志,需实现无报错的就绪探针,且无需额外脚本。


解决方案:使用环境变量传递凭据的Exec探针

Kubernetes探针支持直接引用Pod的环境变量,可通过环境变量传递MySQL认证凭据,让mysqladmin ping命令正常执行,避免权限错误;同时替代TCP探针,解决连接包读取错误问题。

完整配置示例

  1. 先在Deployment中定义环境变量(推荐从Secret中读取敏感信息):
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
          # 从Secret读取用户名和密码
          - name: MYSQL_USER
            valueFrom:
              secretKeyRef:
                name: mysql-credentials
                key: username
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-credentials
                key: password
          # 若使用root用户,可直接引用镜像自带的MYSQL_ROOT_PASSWORD环境变量
          # - name: MYSQL_ROOT_PASSWORD
          #   valueFrom:
          #     secretKeyRef:
          #       name: mysql-credentials
          #       key: root-password
        ports:
        - containerPort: 3306
        # 配置探针
        readinessProbe:
          exec:
            command:
              - mysqladmin
              - ping
              - -h
              - localhost
              - -u
              - $(MYSQL_USER)
              - -p$(MYSQL_PASSWORD)
          initialDelaySeconds: 30
          periodSeconds: 10
          failureThreshold: 3
        livenessProbe:
          exec:
            command:
              - mysqladmin
              - ping
              - -h
              - localhost
              - -u
              - $(MYSQL_USER)
              - -p$(MYSQL_PASSWORD)
          initialDelaySeconds: 60
          periodSeconds: 20
          failureThreshold: 3
  1. 对应的Secret示例(需提前创建):
apiVersion: v1
kind: Secret
metadata:
  name: mysql-credentials
type: Opaque
data:
  username: dXNlcm5hbWU= # base64编码的用户名,示例为"user"
  password: cGFzc3dvcmQ= # base64编码的密码,示例为"password"

关键说明

  • 环境变量解析:Kubernetes会自动将命令中的$(MYSQL_USER)和$(MYSQL_PASSWORD)替换为对应环境变量的值,确保mysqladmin携带正确凭据执行ping操作,避免权限报错。
  • 替代TCP探针:TCP探针仅检查端口是否开放,但MySQL接受连接后会因未完成认证流程主动断开,从而产生Got an error reading communication packets日志;带凭据的exec探针可完成完整认证握手,避免此类错误。
  • 权限要求:用于探针的MySQL用户只需拥有CONNECT权限即可,无需额外高权限,兼顾安全性。
  • 探测参数调优:initialDelaySeconds需设置足够长,保证MySQL完成初始化后再开始探测;periodSeconds和failureThreshold可根据业务场景调整,平衡探测频率与容错性。

内容的提问来源于stack exchange,提问作者Martin Cup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:58:13