Kubernetes之服务发现

本文介绍了如何在Kubernetes环境中使用WordPress连接MySQL数据库,涉及创建pod、svc,以及通过环境变量和DNS进行服务发现的方法。通过设置环境变量和修改yaml文件,确保WordPress能成功连接到MySQL服务,并探讨了这种方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文使用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

在这里插入图片描述

通过变量的方式发现服务,有两个缺点:

  1. 必须要在同一个命名空间里
  2. 创建服务的时候,必须要有先后顺序

通过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连接成功。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值