![](/img/trans.png)
[英]MySQL Wordpress Nginx dnsmasq: Error: Error establishing a database connection
[英]“Error establishing a database connection” using Wordpress, MySQL, Nginx on Kubernetes
我正在Kubernetes上使用Wordpress,php-fpm,nginx和mysql部署应用程序。 我采取的步骤是:
该数据库似乎正在运行,我可以使用以下命令连接到该数据库并查看我的表: echo "mysql -pXXX" | kubectl exec -it <mysql-pod>
echo "mysql -pXXX" | kubectl exec -it <mysql-pod>
。 第4步(ssl cert和ingress)也可以正常工作,并且在那里没有问题。 当我尝试访问我的域时,创建两个Pod(我的应用程序和mysql)并添加配置文件会显示以下消息:
建立数据库连接时出错
我通过以下命令使用头盔部署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容器部署在一个容器中,以便相互持久使用。 部署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
我已经确认,只需连接到mysql:3306,就可以通过wordpress pod访问数据库。 我检查并确认我的应用程序可以通过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;
...
}
}
一些额外的信息,以防万一:
- 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” 500262“-”“ Mozilla / 5.0(兼容; Googlebot / 2.1; + http://www.google.com/bot.html ) “
10.20.0.128--[12:17:48 +0000]“ GET / HTTP / 1.1” 500262“-”“ Python / 3.6 aiohttp / 3.4.4”
10.20.0.128--[16:04:42 +0000]“ GET / HTTP / 1.1” 500262“-”“ 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,例如Gecko)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
我个人认为这里缺少一些简单的东西,但是过去几天我一直无法指出。 有人知道我在这里想念的吗?
我通过替换用于从Wordpress Pod访问数据库的秘密解决了这个问题。 为了确认这个秘密是问题所在,我创建了一个秘密,并部署了带有MYSQL_ROOT_PASSWORD秘密参考的mysql
,并在wordpress pod中提供了与db密码相同的秘密参考。 由于它们都使用相同的秘密对象,因此可以解决数据库连接问题。
FIX: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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.