k8s学习 : 前端是如何连接到后端数据库的?
k8s 学习,前端 WordPress 网站是一个 pod后端 MySQL 是另一个 pod,WordPress 网站是怎样连接到 mysql的?程序代码如何修改?
以下是学习k8s 的教程的一个实例
k8s学习:WordPress + MySQL + PVC 构建一个博客网站
前端 WordPress 网站是一个 pod
后端 MySQL 是另一个 pod
WordPress 网站是怎样连接到 mysql的?程序代码如何修改?
deploy 配置信息
-
前端 WordPress 网站 metadata
metadata: name: wordpress labels: app: wordpress
-
前端 WordPress 网站 selector:
matchLabels: app: wordpress tier: frontend
-
后端 MySQL 的 metadata
metadata: name: wordpress-mysql labels: app: wordpress
-
后端 MySQL 的 selector:
matchLabels: app: wordpress tier: mysql
从字面看,他们都属于同一个 app: wordpress ,一个在 tier: frontend 层,一个在 tier: mysql ,k8s 如何将他们连在了一起呢?
按照过去非 Docker 方式部署的思路,假设他们分别部署在 2 个服务器上,
在前端 php 程序中,往往需要有个 config 文件,来配置数据库信息: host、port、username、password下面我们就分别进入 2 个容器,一探究竟
进入 wordpress
-
直接 describe pod 也能看到一部分环境信息,但是看不到程序代码中的设置
[root@centos7-188 ~]# kubectl describe pod wordpress-557cbf5c94-lqbd8
... IP: 10.244.2.66 IPs: IP: 10.244.2.66 ... Environment: WORDPRESS_DB_HOST: wordpress-mysql WORDPRESS_DB_PASSWORD: <set to the key 'password' in secret 'mysql-pass-82d992t59h'> Optional: false
-
[root@centos7-188 ~]# kubectl exec -it wordpress-557cbf5c94-lqbd8 – /bin/sh
以下在容器中操作
# pwd /var/www/html # ls index.php readme.html wp-admin wp-comments-post.php wp-config.php wp-cron.php wp-links-opml.php wp-login.php wp-settings.php wp-trackback.php license.txt wp-activate.php wp-blog-header.php wp-config-sample.php wp-content wp-includes wp-load.php wp-mail.php wp-signup.php xmlrpc.php # # cat wp-config.php ... // ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define('DB_NAME', 'wordpress'); /** MySQL database username */ define('DB_USER', 'root'); /** MySQL database password */ define('DB_PASSWORD', 'MTIzNDU2Cg=='); /** MySQL hostname */ define('DB_HOST', 'wordpress-mysql'); ...
这里不是我们通常的 define(‘DB_HOST’, ‘IP 地址l’);写法,而是街上了一个变量 wordpress-mysql
那么这个 wordpress-mysql 到底是什么呢?# env |grep wordpress HOSTNAME=wordpress-557cbf5c94-lqbd8 WORDPRESS_DB_HOST=wordpress-mysql # echo $WORDPRESS_DB_HOST wordpress-mysql # echo $WORDPRESS_DB_PASSWORD MTIzNDU2Cg==
这就是在 wordpress-deployment.yaml 中的 containers 配置的 env 环境变量
env: - name: WORDPRESS_DB_HOST value: wordpress-mysql - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password
mysql 的 ip 地址是不是 10.244.1.66 ?
# ping wordpress-mysql PING wordpress-mysql.default.svc.cluster.local (10.244.1.66): 56 data bytes 64 bytes from 10.244.1.66: icmp_seq=0 ttl=62 time=1.074 ms 64 bytes from 10.244.1.66: icmp_seq=1 ttl=62 time=1.138 ms
那么,wordpress 自己的 ip 是多少?
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 3: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default link/ether d2:58:c3:23:02:99 brd ff:ff:ff:ff:ff:ff inet 10.244.2.66/24 brd 10.244.2.255 scope global eth0 valid_lft forever preferred_lft forever
他是怎么和名称对应上的呢?DNS 服务怎么找到他?
# cat /etc/hosts # Kubernetes-managed hosts file. 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 10.244.2.66 wordpress-557cbf5c94-lqbd8
进入 mysql
-
系统很精简,ip 地址命令没有,curl 也没有
[root@centos7-188 ~]# kubectl exec -it wordpress-mysql-74978f46c9-cp29d -- /bin/bash root@wordpress-mysql-74978f46c9-cp29d:/# root@wordpress-mysql-74978f46c9-cp29d:/# pwd / root@wordpress-mysql-74978f46c9-cp29d:/etc# cat issue Debian GNU/Linux 9 \n \l root@wordpress-mysql-74978f46c9-cp29d:/# cat /etc/hosts # Kubernetes-managed hosts file. 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 10.244.1.66 wordpress-mysql-74978f46c9-cp29d
也是通过/etc/hosts 文件,wordpress-mysql 对应到 10.244.1.66,这样 DNS 服务就可以找到他!
所以, wordpress 网站中配置的 define(‘DB_HOST’, ‘wordpress-mysql’);也可以找到他!
总结:
deploy 中设置好统一的 labels 和 matchLabels , k8s 的 DNS 服务就会自动对应到服务所在的容器
代码中设置 host 的地方需要改成相应的名字,不能还写成 ip 地址!
实际上,也没法预先知道 mysql 的 ip 地址!
更多推荐
所有评论(0)