簡體   English   中英

在Kubernetes上使用Wordpress,MySQL,Nginx“建立數據庫連接時出錯”

[英]“Error establishing a database connection” using Wordpress, MySQL, Nginx on 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> 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

我個人認為這里缺少一些簡單的東西,但是過去幾天我一直無法指出。 有人知道我在這里想念的嗎?

我通過替換用於從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM