我可以一遍又一遍地运行完全相同的命令,有时候它可以工作,有时候则不行:
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 将所有流量路由到哪里?为什么我的网站仍然有效?
我想这里的教训是:
- 检查日志数据库。客户端错误不包含太多信息。
- 仔细检查你的 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 应用了错误的应用标签。这种随机性让我措手不及。