mysql - "Error establishing a database connection"在 Kubernetes 上使用 Wordpress、MySQL、Nginx

标签 mysql wordpress nginx kubernetes

我正在 Kubernetes 上使用 Wordpress、php-fpm、nginx 和 mysql 部署应用程序。我采取的步骤是:

  1. 使用 helm 部署 mysql
  2. 将 pod 公开为 clusterIP 服务并将我的表转储到数据库
  3. 将我的 wordpress/php 应用程序部署在带有 nginx 容器的同一 Pod 中
  4. 公开 clusterIP 服务并设置入口/TLS

数据库似乎正在工作,我可以连接到它并使用以下命令查看我的表:echo "mysql -pXXX" | kubectl exec -it <mysql-pod> 。步骤 4(ssl 证书和入口)也正常工作,没有问题。创建两个 pod(我的应用程序和 mysql)并添加配置文件会在我尝试访问我的域时出现此消息:

Error establishing a database connection

我通过以下命令使用 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 时它们都存在于持久存储中。这部分似乎工作正常。

我正在一个 Pod 中部署我的 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;
        ...
    }
}

一些额外的信息,以防有帮助:

  • 我的两个服务(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

我已使用正确的 yaml 文件和 base64 值将 mysql 密码添加为 secret 。我还尝试使用命令行来创建 secret ,两者都不会改变结果中的任何内容。

这里有一些日志,以防它可以告诉我们有关问题的任何信息(我在这方面找不到太多信息):

Mysql Pod 日志

MySQL init process in progress...
Warning: Unable to load '/usr/share/zoneinfo/Factory' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/posix/Factory' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/right/Factory' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql: [Warning] Using a password on the command line interface can be insecure.
MySQL init process done. Ready for start up.

Nginx 容器日志

[11:15:03 +0000] "GET /robots.txt HTTP/1.1" 500 262 "-" "Mozilla/5.0 (compatible; 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 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 访问数据库的 key 解决了这个问题。为了确认 secret 是问题所在,我创建了一个 secret 并部署了 mysql ,其中包含 MYSQL_ROOT_PASSWORD 的 secret 引用,并在我的 WordPress pod 中提供与数据库密码相同的 secret 引用。由于它们都使用相同的 secret 对象,因此这有效并修复了数据库连接问题。

修复: Helm 会自动创建一个数据库 secret ,其中包含您的所有密码/使用的/数据库名称条目。使用 wordpress yaml 文件中自动创建的 key 而不是您创建的 key :

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

关于mysql - "Error establishing a database connection"在 Kubernetes 上使用 Wordpress、MySQL、Nginx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54446112/

相关文章:

amazon-web-services - AWS ECS jwilder/nginx-proxy无法在上游内部生成服务器

python - Docker 图像中的 nginx 缓冲 flask 事件流

javascript - 使用 jQuery 删除链接文本

php - 如何保持wordpress中音乐播放器的一致?

MySQL 从多个表中连接多个列

mysql - 如何在 phpMyAdmin 中使用通配符或正则表达式来忽略搜索词的一部分?

php - 从 woocommerce 中的电子邮件模板中删除订单信息部分

docker - nginx 通过 docker - 错误 :1408F10B:SSL routines:ssl3_get_record:wrong version number

php - 如何在 PHP 中显示 MySQL 数据库的内容

php - 如何检查MySQL中是否存在某行? (即检查 MySQL 中是否存在用户名或电子邮件)