在Kubernetes上使用Wordpress,MySQL和Nginx“建立数据库连接时出错”

时间:2019-01-30 17:20:12

标签: mysql wordpress nginx kubernetes

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

  1. 使用头盔部署mysql
  2. 将pod公开为clusterIP服务,并将我的表转储到数据库中
  3. 使用Nginx容器在同一容器中部署我的wordpress / php应用
  4. 公开clusterIP服务并设置入口/ TLS

该数据库似乎正在运行,我可以使用以下命令连接到该数据库并查看我的表: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;
        ...
    }
}

一些额外的信息,以防万一:

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

我个人认为这里缺少一些简单的东西,但是过去几天我一直没有指出。有人知道我在这里想念什么吗?

1 个答案:

答案 0 :(得分:0)

我通过替换用于从wordpress pod访问数据库的秘密解决了这个问题。为了确认秘密是问题所在,我创建了一个秘密,并部署了mysql,其中包含MYSQL_ROOT_PASSWORD的秘密参考,并在我的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