在 Kubernetes 上使用 Wordpress、MySQL、Nginx “建立数据库连接时出错”
Posted
技术标签:
【中文标题】在 Kubernetes 上使用 Wordpress、MySQL、Nginx “建立数据库连接时出错”【英文标题】:"Error establishing a database connection" using Wordpress, MySQL, Nginx on Kubernetes 【发布时间】:2019-06-24 01:26:19 【问题描述】:我正在 Kubernetes 上使用 Wordpress、php-fpm、nginx 和 mysql 部署应用程序。我采取的步骤是:
-
使用 helm 部署 mysql
将 pod 公开为 clusterIP 服务并将我的表转储到数据库中
使用 nginx 容器将我的 wordpress/php 应用程序部署在同一个 pod 中
公开clusterIP服务并设置入口/TLS
数据库似乎正在运行,我可以使用以下命令连接到它并查看我的表:echo "mysql -pXXX" | kubectl exec -it <mysql-pod>
。第 4 步(ssl 证书和入口)也在工作,没有问题。当我尝试访问我的域时,创建两个 pod(我的应用程序和 mysql)并添加配置文件会导致此消息:
建立数据库连接时出错
我通过这个命令使用 helm 部署 mysql pod:
helm install --name mysql --set \
mysqlRootPassword=xxx,mysqlUser=xxx,mysqlPassword=xxx, \
mysqlDatabase=xxx,persistence.size=50Gi \
stable/mysql
一旦部署完成,pod 就会运行,我可以成功访问我的数据库。这是当我将表数据从本地 .sql
文件转储到创建的数据库中时,当我运行 show tables
时,它们都存在于持久存储中。这部分似乎工作正常。
我将我的 wordpress 应用程序和 nginx 容器部署在一个 pod 中,以供相互持久的卷使用。部署 yaml 如下所示:
wordpress-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: nginx:alpine
name: nginx
env:
- name: WP_HOST
value: wordpress
- name: DB_HOST
value: mysql:3306
- name: DB_NAME
value: xxx
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 443
- containerPort: 80
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
- name: wp-config
mountPath: "/etc/nginx/conf.d"
- image: my-wordpress-php-app
name: wordpress
env:
- name: MY_DB_HOST
value: mysql:3306
- name: MY_DB_NAME
value: xxx
- name: MY_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
- name: MY_WP_HOME
value: "https://example.com"
- name: MY_WP_SITEURL
value: "https://example.com"
- name: WP_DEBUG_LOG
value: "true"
- name: WP_DEBUG
value: "true"
ports:
- containerPort: 9000
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wordpress-volumeclaim
- name: wp-config
configMap:
name: wp-config
items:
- key: wp.conf
path: wp.conf
imagePullSecrets:
- name: regcred
我已经确认我可以通过我的 wordpress pod 访问我的数据库,只需连接到 mysql:3306。我检查并确认我的应用程序可以通过服务器上的 docker compose 运行,并且代码看起来很好,所以我们可以假设 wordpress 应用程序的 docker 映像也在做它应该做的事情。
作为参考,我的配置文件如下: wp.conf
listen 80;
listen 443 ssl;
server_name $SITE_URL;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip off;
types
...
location xxx
rewrite .* /index.php;
...
location ~ '\.php$'
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
...
location /
autoindex off;
...
一些额外的信息,以防有帮助:
我的两个服务(mysql 和 wordpress/nginx)都是 ClusterIP 类型。在我的 mysql 服务中,我有以下内容: - port: 3306
targetPort: 3306
在我的 wordpress 服务中,我有以下内容:
- name: wordpress
port: 9000
targetPort: 9000
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
我已将 mysql 密码添加为具有正确 yaml 文件和 base64 值的机密。我也尝试使用命令行来创建秘密,并且两者都不会改变结果中的任何内容。
这里有一些日志,以防它可以说明问题的任何内容(我找不到太多关于这方面的信息):
Mysql pod 日志
MySQL 初始化进程正在进行中... 警告:无法将“/usr/share/zoneinfo/Factory”加载为时区。跳过它。 警告:无法将“/usr/share/zoneinfo/iso3166.tab”作为时区加载。跳过它。 警告:无法将“/usr/share/zoneinfo/leap-seconds.list”加载为时区。跳过它。 警告:无法将“/usr/share/zoneinfo/posix/Factory”加载为时区。跳过它。 警告:无法将“/usr/share/zoneinfo/right/Factory”加载为时区。跳过它。 警告:无法将“/usr/share/zoneinfo/zone.tab”加载为时区。跳过它。 mysql: [警告] 在命令行界面使用密码可能不安全。 MySQL初始化过程完成。准备启动。
Nginx 容器日志
[11:15:03 +0000] "GET /robots.txt HTTP/1.1" 500 262 "-" "Mozilla/5.0(兼容;Googlebot/2.1;+http://www.google.com/bot.html)" 10.20.0.128 - - [12:17:48 +0000] "GET / HTTP/1.1" 500 262 "-" "Python/3.6 aiohttp/3.4.4" 10.20.0.128 - - [16:04:42 +0000] "GET / HTTP/1.1" 500 262 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/x Safari/537.36" 10.20.0.128 - - [16:04:42 +0000] "GET /favicon.ico HTTP/1.1" 200 5 "https://example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/537.36 (KHTML, like壁虎)Chrome/x Safari/537.36"
Wordpress 容器日志
127.0.0.1 - 16:04:42 +0000 "GET /index.php" 500 127.0.0.1 - 16:04:42 +0000 "GET /index.php" 200
我个人认为这里缺少一些简单的东西,但是过去几天我一直无法指出。有人知道我在这里缺少什么吗?
【问题讨论】:
我猜 Helm 创建的 Service 对象的名称更像是mysql-mysql
(更具体地说是 .Release.Name -mysql
,其中的名称是 helm install --name
); kubectl get services
一定会告诉你的。您需要将该名称用作$DB_HOST
名称。
在哪里添加 DB_USER 变量?
解决方案原来与你提到的有关。我发现了这个问题,Helm 创建了自己的秘密,与 mysql-helm 部署同名。当我创建 helm mysql 部署时,我给它起了名字 mysql-helm,所以它就这样了。 @大卫迷宫
在我的情况下将 DB_HOST
更改为 mysql:3306
有效
【参考方案1】:
我通过替换用于从我的 wordpress pod 访问我的数据库的秘密解决了这个问题。为了确认秘密是问题所在,我创建了一个秘密并部署了mysql
,其中包含 MYSQL_ROOT_PASSWORD 的秘密参考,并提供了与我的 wordpress pod 中的 db 密码相同的秘密参考。由于他们都使用相同的秘密对象,因此这有效并修复了数据库连接问题。
修复: Helm 会自动创建一个数据库机密,其中包括您的所有密码/已使用/数据库名称条目。使用 wordpress yaml 文件中自动创建的密码,而不是您创建的密码:
helm install --name mysql-helm --set \
mysqlRootPassword=xxx,mysqlUser=xxx,mysqlPassword=xxx, \
mysqlDatabase=xxx,persistence.size=50Gi \
stable/mysql
像这样使用创建的密码:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-helm
key: password
【讨论】:
以上是关于在 Kubernetes 上使用 Wordpress、MySQL、Nginx “建立数据库连接时出错”的主要内容,如果未能解决你的问题,请参考以下文章