以下是学习k8s 的教程的一个实例

k8s学习:WordPress + MySQL + PVC 构建一个博客网站

前端 WordPress 网站是一个 pod
后端 MySQL 是另一个 pod
WordPress 网站是怎样连接到 mysql的?程序代码如何修改?

deploy 配置信息

  1. 前端 WordPress 网站 metadata

     metadata:
        name: wordpress
        labels:
          app: wordpress
    
  2. 前端 WordPress 网站 selector:

     matchLabels:
       app: wordpress
       tier: frontend
    
  3. 后端 MySQL 的 metadata

     metadata:
        name: wordpress-mysql
        labels:
          app: wordpress
    
  4. 后端 MySQL 的 selector:

     matchLabels:
       app: wordpress
       tier: mysql
    

    从字面看,他们都属于同一个 app: wordpress ,一个在 tier: frontend 层,一个在 tier: mysql ,k8s 如何将他们连在了一起呢?

    按照过去非 Docker 方式部署的思路,假设他们分别部署在 2 个服务器上,
    在前端 php 程序中,往往需要有个 config 文件,来配置数据库信息: host、port、username、password

    下面我们就分别进入 2 个容器,一探究竟

进入 wordpress

  1. 直接 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
    
  2. [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

  1. 系统很精简,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 地址!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐