Связь Worpress внутри Kubernetes и внешнего сервера MySQL. - Ошибка подключения MySQL: (2002) - PullRequest
0 голосов
/ 29 октября 2019

В облаке Azure у меня есть следующая инфраструктура:

Vnet с двумя подсетями.

  • Vnet: 10.0.0.0/8
    • aks-подсеть: 10.240.0.0/16
    • постоянная подсеть: 10.241.0.0/27

кластер Azure Kubernetes был установлен исвязан с aks-subnet.

В persistence-subnet развернута и связана с ней управляемая база данных Azure для MySQL paas.

* persistence-subnet имеетдве конечные точки службы: Microsoft.Sql и Microsoft.Storage

aks-subnet имеет конечную точку службы Microsoft.Sql

Кластер Azure Kubernetes был развернут с использованием сетевого профиля Azure CNI, поэтому каждый модульполучить IP-адрес, принадлежащий aks-subnet. Также я решил выбрать Azure CNI, потому что мне нужно связать модули внутри aks-subnet с управляемой службой MySQL.

В управляемой службе База данных Azure для MySQL Paas, которую я внес в белый списокдиапазон IP-адресов aks-subnet, чтобы разрешить модулям внутри aks-subnet доступ к службе MySQL.

"StartIpAddress": "10.240.0.0",
"EndIpAddress": "10.240.255.255"

В кластере AKS я использую helm3 для развертывания диаграммы управления Wordpress,с помощью этой команды

helm3 install wordpress-site-1 stable/wordpress --set image.registry=myregistry.azurecr.io,image.repository=wordpress,image.tag=5.2.4,image.pullPolicy=Always,wordpressUsername=site1,wordpressPassword=my-password,wordpressEmail=my@gmail.com,mariadb.enabled=false,externalDatabase.host=database-db.mysql.database.azure.com,externalDatabase.user=user@wdatabase-db,externalDatabase.password=my-password,externalDatabase.database=wordpress-site-1,externalDatabase.port=3306
NAME: wordpress-site-1
LAST DEPLOYED: Tue Oct 29 13:24:03 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the WordPress URL:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w wordpress-site-1'
  export SERVICE_IP=$(kubectl get svc --namespace default wordpress-site-1 --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
  echo "WordPress URL: http://$SERVICE_IP/"
  echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Login with the following credentials to see your blog

  echo Username: site1
  echo Password: $(kubectl get secret --namespace default wordpress-site-1 -o jsonpath="{.data.wordpress-password}" | base64 --decode)

Развертывание запущено, но когда я проверяю журналы модуля WordPress, я получаю следующее сообщение об ошибке:

MySQL Connection Error: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known
[29-Oct-2019 13:01:13 UTC] PHP Warning:  mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known in Standard input code on line 22
[29-Oct-2019 13:01:13 UTC] PHP Warning:  mysqli::__construct(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known in Standard input code on line 22

MySQL Connection Error: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known

WARNING: unable to establish a database connection to 'mysql'
  continuing anyways (which might have unexpected results)

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.240.0.36. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.240.0.36. Set the 'ServerName' directive globally to suppress this message
[Tue Oct 29 13:01:14.027023 2019] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.3.11 configured -- resuming normal operations
[Tue Oct 29 13:01:14.027099 2019] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
10.240.0.4 - - [29/Oct/2019:13:01:22 +0000] "GET /wp-login.php HTTP/1.1" 500 3003 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:13:01:32 +0000] "GET /wp-login.php HTTP/1.1" 500 3003 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:13:01:42 +0000] "GET /wp-login.php HTTP/1.1" 500 3003 "-" "kube-probe/1.14"

Похоже на модуль WordPress, расположенный внутри aks-subnet не может получить доступ к службе MySQL, расположенной в persistence-subnet, несмотря на то, что я предоставляю ее через helm install command правильные параметры.

Странно, у модулей есть доступ к Интернету, а также ятщательно проверял правила и разрешения, чтобы разрешить эту связь.

Есть ли что-то, чего я не знаю?

Как я могу получить доступ к базе данных MySQL сюда? Служба Wordpress, развернутая в кластере Aks?


ОБНОВЛЕНИЕ:

Прежде чем развернуть Wordpress с помощью команды helm install, я создал реестр докеровсекрет, указывающий на данные реестра Azure Container, ручным способом:

kubectl create secret docker-registry regcred --docker-server=my-registry.azurecr.io --docker-username=my-username --docker-password=my-password --docker-email=my-email@outlook.com

Я ссылался на regcred в моей локальной таблице управления в deployment.yaml, и я развернул Wordpress с помощью команды helm install и выглядитвроде работает, или, по крайней мере, MySQL не вызывает проблем.

Просто директива ServerName Apache, потому что у меня еще нет имени хоста, еще не задействованного в моем процессе deploymnet, пока нет.

⟩ kubectl logs pod/wordpress-site-1-7f44b567d6-2949w -f

WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html

### APACHE SERVERNAME WARNING
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.240.0.103. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.240.0.103. Set the 'ServerName' directive globally to suppress this message

##### 


[Tue Oct 29 16:13:16.327549 2019] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.3.11 configured -- resuming normal operations
[Tue Oct 29 16:13:16.327630 2019] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
10.240.0.4 - - [29/Oct/2019:16:13:18 +0000] "GET / HTTP/1.1" 302 255 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:18 +0000] "GET /wp-admin/setup-config.php HTTP/1.1" 200 4289 "http://10.240.0.103:80/" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:28 +0000] "GET / HTTP/1.1" 302 255 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:28 +0000] "GET /wp-admin/setup-config.php HTTP/1.1" 200 4289 "http://10.240.0.103:80/" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:38 +0000] "GET / HTTP/1.1" 302 255 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:40 +0000] "GET / HTTP/1.1" 302 255 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:40 +0000] "GET /wp-admin/setup-config.php HTTP/1.1" 200 4289 "http://10.240.0.103:80/" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:38 +0000] "GET /wp-admin/setup-config.php HTTP/1.1" 200 4289 "http://10.240.0.103:80/" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:48 +0000] "GET / HTTP/1.1" 302 255 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:50 +0000] "GET / HTTP/1.1" 302 255 "-" "kube-probe/1.14"
10.240.0.4 - - [29/Oct/2019:16:13:50 +0000] "GET /wp-admin/setup-config.php HTTP/1.1" 200 4289 "http://10.240.0.103:80/" "kube-probe/1.14"

Я понимаю, что на этом этапе ничего не должно происходитьс базой данных, потому что нам нужно получить доступ к сайту Wordpress через Интернет и развернуть сайт, так что в тот момент, когда таблицы базы данных будут созданы правильно?

Итак, я выполнил операцию port-forward из kubernetes:

⟩ kubectl port-forward pod/wordpress-site-1-7f44b567d6-2949w 8002:80
Forwarding from 127.0.0.1:8002 -> 80
Forwarding from [::1]:8002 -> 80
Handling connection for 8002
Handling connection for 8002
Handling connection for 8002
Handling connection for 8002
Handling connection for 8002

И когда я перехожу на http://localhost:8002/,, браузер перенаправляет меня на http://localhost:8002/wp-admin/setup-config.php иЯ вижу мастера WordPress.

Поэтому я заполняю данные своим именем базы данных, ранее созданным на сервере базы данных

enter image description here

ИКогда я отправляю данные в интерфейсе мастера, я получаю следующее:

enter image description here

Проблемы со ссылкой на сообщение с подключением к данным

This either means that the username and password information in your wp-config.php file is incorrect or we can’t contact the database server at wordpresssentiaassessment-db.mysql.database.azure.com. This could mean your host’s database server is down.

Are you sure you have the correct username and password?
Are you sure that you have typed the correct hostname?
Are you sure that the database server is running?

Но, может быть, из-за операции перенаправления портов мы не можем связаться с базой данных с моей локальной машины?

Я имею в виду, что процесс не в состоянии сделать обратный порт перенаправления для связи с базой данных?

Нужно ли выставлять приложение-службу Wordpress для какого-то домена и публичного IP-адреса по порядкусвязаться с БД и установить Wordpress?

Итак, я вхожу в контейнер WordPress для проверки wp-config.php

⟩ kubectl exec -it pod/wordpress-site-1-7f44b567d6-2949w /bin/sh

Но файл wp-config.php не существует,

# ls
index.php    wp-activate.php     wp-comments-post.php  wp-cron.php    wp-load.php   wp-settings.php   xmlrpc.php
license.txt  wp-admin        wp-config-sample.php  wp-includes    wp-login.php  wp-signup.php
readme.html  wp-blog-header.php  wp-content        wp-links-opml.php  wp-mail.php   wp-trackback.php
# cat wp-config.php
cat: wp-config.php: No such file or directory

У меня есть wp-config-sample.php, и это их содержание, но я не вижу ничего о FQDN.

Или, может быть, мне нужно что-то сделать в wp-config.php, может бытьпереименовать wp-config-sample.php в wp-config.php и добавить переменные, введенные в модуль в этом файле?

# nano wp-config-sample.php
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** MySQL database username */
define( 'DB_USER', 'username_here' );

/** MySQL database password */
define( 'DB_PASSWORD', 'password_here' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define( 'WP_DEBUG', false );

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );

1 Ответ

1 голос
/ 29 октября 2019

Похоже, что приложение пытается выполнить обратный поиск IP-адреса, который вы указали, возможно потому, что оно намерено использовать SSL для аутентификации удаленного сервера. Записи PTR, помогающие в обратном поиске, будут недоступны при стандартной конфигурации для внутреннего IP-адреса.

Попробуйте использовать полное доменное имя для своего экземпляра MySQL вместо IP-адреса.

Это должно выглядетьчто-то вроде этого:

{yourservername}.mysql.database.azure.com

Таким образом, вашему приложению не нужно будет выполнять обратный поиск, и Azure будет соответствующим образом обслуживать маршрутизацию.

РЕДАКТИРОВАТЬ:

Следующая строка указывает на то, что ваше приложение пытается подключиться к узлу mysql:

ПРЕДУПРЕЖДЕНИЕ: невозможно установить соединение базы данных с mysql

Проверьте правильность заполнения полного доменного имени в wp-config.php

...