随机 MySQL 连接问题?

随机 MySQL 连接问题?

我可以一遍又一遍地运行完全相同的命令,有时候它可以工作,有时候则不行:

root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
ERROR 2002 (HY000): Can't connect to MySQL server on '10.245.54.251' (115)
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
#mysql50#lost+found
busman
demo_busman
information_schema
mysql
performance_schema
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
#mysql50#lost+found
busman
demo_busman
information_schema
mysql
performance_schema
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
#mysql50#lost+found
busman
demo_busman
information_schema
mysql
performance_schema
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
#mysql50#lost+found
busman
demo_busman
information_schema
mysql
performance_schema
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
#mysql50#lost+found
busman
demo_busman
information_schema
mysql
performance_schema
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
#mysql50#lost+found
busman
demo_busman
information_schema
mysql
performance_schema
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
ERROR 2002 (HY000): Can't connect to MySQL server on '10.245.54.251' (115)
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
ERROR 2002 (HY000): Can't connect to MySQL server on '10.245.54.251' (115)
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
ERROR 2002 (HY000): Can't connect to MySQL server on '10.245.54.251' (115)
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
ERROR 2002 (HY000): Can't connect to MySQL server on '10.245.54.251' (115)
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
#mysql50#lost+found
busman
demo_busman
information_schema
mysql
performance_schema
root@bak-rrk9m:/# mysql -Bsuroot -p"$MYSQL_ROOT_PASSWORD" -h"$KMB_MARIADB_SERVICE_SERVICE_HOST" -e "show databases"
ERROR 2002 (HY000): Can't connect to MySQL server on '10.245.54.251' (115)

另一方面,我的网站似乎没有出现任何错误。

发生了什么事?我该如何解决这个问题?

无论我使用主机名还是内部/集群 IP 地址,都是同样的问题。


从 MariaDB pod 中获取了一些日志。可能是这样的:

2020-06-15 0:51:51 12069 [警告] 中止与数据库“demo_kmbookings”用户“root”主机“10.244.0.84”的连接 12069(写入通信数据包时出错)


成立一些文章提出了一些建议,但没有具体成果。

我以为可能是在创建这些转储时内存不足,因为我为了省钱只给了它 1 GiB 左右。幸运的是,Kubernetes 让我可以轻松地在更大的节点上重建整个集群,但这没有帮助。

现在我注意到我的 MariaDB 服务selector实际上与我的部署模板不匹配。我修复了这个问题,现在它运行成功了。必须再试几次才能确定,但​​这让我想知道这是如何工作的。

答案1

我很确定这是 Kubernetes 配置问题。我的 MariaDB 部署如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      pod: b437e465-2526-41bb-ae19-534b3a60f2eb
  template:
    metadata:
      labels:
        pod: b437e465-2526-41bb-ae19-534b3a60f2eb
    spec:
      containers:
        - name: mariadb
          image: mariadb
          ports:
            - containerPort: 3306
          envFrom:
            - secretRef:
                name: mariadb-env
          volumeMounts:
            - name: mariadb-volume
              mountPath: /var/lib/mysql
            - name: config-volume
              mountPath: /etc/mysql/mariadb.conf.d/zzz-kymark.cnf
              subPath: my.cnf
      volumes:
        - name: mariadb-volume
          persistentVolumeClaim:
            claimName: mariadb-pvc
        - name: config-volume
          configMap:
            name: mariadb-config

但我的服务定义如下:

apiVersion: v1
kind: Service
metadata:
  name: mariadb-service
spec:
  selector:
    app: kymark-mariadb-pod
  ports:
    - protocol: TCP
      port: 3306

注意selector不匹配。

我还没有研究这一切是如何运作的,但我认为如果服务选择器与 pod 定义不匹配,那么 Kubernetes 就不知道如何正确设置网络。

我不明白为什么它仍然有效有时Kubernetes 将所有流量路由到哪里?为什么我的网站仍然有效?

我想这里的教训是:

  1. 检查日志数据库。客户端错误不包含太多信息。
  2. 仔细检查你的 Kubernetes 配置和选择器

没有错误表明我的配置是错误的,但我们在这里。

答案2

选择器服务规范中使用的必须与部署规范相匹配,否则您的服务将不会将流量重定向到正确的 pod。

很常见的是,有些人一开始就对集群内的各种应用程序使用相同的选择器,因为他们不了解它是如何工作的。

我从中摘录了一些观点文档

.spec.selector 字段定义 Deployment 如何找到要管理的 Pod。在本例中,您只需选择 Pod 模板中定义的标签 (app: nginx)。但是,只要 Pod 模板本身满足规则,就可以使用更复杂的选择规则。

注意:您必须在部署中指定适当的选择器和 Pod 模板标签(在本例中为 app: nginx)。请勿将标签或选择器与其他控制器(包括其他部署和 StatefulSet)重叠。Kubernetes 不会阻止您重叠,如果多个控制器具有重叠的选择器,则这些控制器可能会发生冲突并出现意外行为。

答案3

我犯了类似的错误。我从另一个 pod(数据库服务器)复制粘贴了内容,用于 yaml 模板,它们几乎共享相同的规格和配置,但我忘记更改应用程序标签,导致出现随机 2002(HY000)...(115)

我花了一段时间才弄清楚数据库服务器端没有问题,而是为带有 mysql-client 的 pod 应用了错误的应用标签。这种随机性让我措手不及。

相关内容