本文使用wordpress+mysql搭建个人博客来讲解服务发现相关知识。
环境准备
wordpress需要连接到mysql才能正常工作,所以需要为mysql的pod创建一个mysql的svc,只要不删除重建svc,其IP不会变。
此时wordpress的pod需要连接mysql的svc的时候,mysql的svc会把请求转发给mysql的pod,这样wordpress的pod就可以访问到mysql的pod了。
- 创建mysql的yaml文件
pod-mysql.yaml
,内容如下,设置了MySQL的各个变量,创建了一个普通用户sun,创建一个新的数据库blog
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
name: mysql
spec:
containers:
- image: hub.c.163.com/library/mysql:latest
imagePullPolicy: IfNotPresent
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: centos
- name: MYSQL_USER
value: sun
- name: MYSQL_PASSWORD
value: centos
- name: MYSQL_DATABASE
value: blog
ports:
- containerPort: 3306
name: mysql
- 创建mysql的pod
kubectl apply -f pod-mysql.yaml
kubectl get pod
- 为mysql的pod创建svc,名字为dbsvc
kubectl expose pod mysql --name=bdsvc --port=3306
kubectl get svc
- 创建wordpress的pod的yaml文件
pod-wordpress.yaml
,内容如下,使用root用户连接mysql,密码为centos,使用的数据库为blog
apiVersion: v1
kind: Pod
metadata:
name: wordpress
labels:
name: wordpress
spec:
containers:
- image: hub.c.163.com/library/wordpress:latest
imagePullPolicy: IfNotPresent
name: wordpress
env:
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: centos
- name: WORDPRESS_DB_NAME
value: blog
- name: WORDPRESS_DB_HOST
value: x.x.x.x # 此处为mysql的IP,在下面步骤修改
ports:
- containerPort: 80
name: wordpress
通过直接访问clusterip的方式访问
- 获取mysql的svc的IP
kubectl get svc
- 修改wordpress的yaml文件中的WORDPRESS_DB_HOST后,创建wordpress的pod
vi pod-wordpress.yaml
kubectl apply -f pod-wordpress.yaml
- 查看pod状态
kubectl get pod -o wide
此时可以通过wordpress的IP地址访问到wordpress(这个IP只能通过master或者worker才能访问到)
- 安装图形界面,使用浏览器测试
yum groupinstall "X Window System"
yum groupinstall -y "GNOME Desktop"
init 5
欢迎界面并不需要我我们设置数据库信息,证明mysql连接成功。
通过变量的方式
在同一个命名空间里,假设已经存在A服务,则在创建Bpod的时候,Bpod里会自动地学习到和A服务相关的一些变量,标记服务IP和端口的格式如下,此处服务名必须为大写。
A服务名_SERVICE_HOST
A服务名_SERVICE_PROT
刚才创建了mysql的pod和mysql的svc,然后创建了wordpress的pod,进入wordpress的pod里查看相关变量
kubectl exec wordpress -it -- bash
env | grep BDSVC
因为mysql的svc是在wordpress之前创建的,可以看到,wordpress的pod里变量的方式自动学习到了mysql svc的信息。因为mysql的svc的名字是bdsvc,所以这里识别出的变量为BDSVC_SERVICE_HOST和BDSVC_SERVICE_PORT。
在Bpod的yaml文件里要引用关于服务A的变量时,用$(变量名)
。
在wordpress的pod的yaml文件中,可以直接使用变量的方式来获取bdsvc的IP。
- 删除wordpress的pod
kubectl delete pod wordpress --force
- 修改wordpress pod的yaml文件,修改内容如下
- name: WORDPRESS_DB_HOST
value: $(BDSVC_SERVICE_HOST)
- 创建wordpress的pod,并查看状态
kubectl apply -f pod-wordpress.yaml
kubectl get pod -o wide
-
测试,欢迎界面并不需要我我们设置数据库信息,证明mysql连接成功。
-
删除该pod
kubectl delete pod wordpress
通过变量的方式发现服务,有两个缺点:
- 必须要在同一个命名空间里
- 创建服务的时候,必须要有先后顺序
通过DNS的方式
在kubernetes安装完毕后,在kube-system命名空间有一个coredns的deployment,它创建了两个副本:
kubectl get pod -n kube-system
这个deployment有一个名字叫做kube-dns的service:
kubectl get svc -n kube-system
通过访问kube-dns这个service就能访问到coredns这些pod了。
在k8s集群里,不管哪个命名空间,只要创建了服务,都会自动到coreDNS里去注册,这样coreDNS会知道每个服务及IP地址的对应关系。
在同一个命名空间里,其他pod可以直接通过服务名来访问此服务,过程为:pod2访问svc1时,首先到coreDNS里询问svc1的IP是多少,coreDNS查询出来后,高速pod2,pod2就可以通过这个IP访问svc1。
如果要访问其他命名空间里的服务,则需要在服务名后面指定命名空间,格式为服务名.命名空间
。
所以在wordpress pod的yaml文件里指定WORDPRESS_DB_HOST具体值的时候,因为和mysql是在同一个命名空间,所以直接写上mysql svc的服务名即可。
-
修改wordpress的pod的yaml文件,内容如下
-
创建wordpress的pod并查看其状态
kubectl apply -f pod-wordpress.yaml
kubectl get pod -o wide
- 测试,欢迎界面并不需要我我们设置数据库信息,证明mysql连接成功。