1、简介
kubernetes提供了两种的服务发现模式,环境变量和DNS。pod中的应用程序可以通过它们访问其他Service
2、环境变量
当创建一个pod时,kubernetes默认会见同一命名空间下的所有Service信息以环境变量的形式注入pod中。其中SERVICE_NAME_SERIVICE_HOST环境变量保存了Service的虚拟IP地址。SERVICE_NAME_SERIVICE_PORT环境变量保存了Service的端口号。这样,容器中的应用程序可以通过这些变量来获取Service的访问地址
- 创建一个临时pod并进入容器中以执行env命令查看环境变量
[root@k8s-master ~]# kubectl run -it --rm test3 --image=uhub.service.ucloud.cn/librarys/busybox:latest -- sh
If you don't see a command prompt, try pressing enter.
/ # env | grep _SERVICE_
POD_READINESS_SERVICE_PORT=80
KUBERNETES_SERVICE_PORT=443
SEARCH_API_SERVICE_PORT=80
PORTAL_SERVICE_HOST=10.107.176.157
NGINX_SERVICE_HOST=10.99.169.247
PORTAL_SERVICE_PORT=80
NGINX_SERVICE_PORT=180
MYSQL_PROXY_SERVICE_HOST=10.98.237.25
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
POD_READINESS_SERVICE_HOST=10.107.77.122
SEARCH_API_SERVICE_HOST=10.108.242.82
MYSQL_PROXY_SERVICE_PORT=3306
3、DNS
kubernetes默认使用coredns作为集群内部的dns服务,它主要负责解析Service名称,这允许集群中的应用程序可以通过Service名称进行通信,而无需硬编码具体的虚拟IP地址
Service名称的域名格式为SERVICE_NAME.NAMESPACE>svc.cluster.local
/ # nslookup nginx.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: nginx.default.svc.cluster.local
Address: 10.99.169.247
域名 nginx.default.svc.cluster.local解析的IP正式对应的虚拟IP地址,这意味着可以通过这个域名访问Service
[root@k8s-master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.99.169.247 <none> 180/TCP 23h
3.1、coredns工作流程
在容器中访问一个域名时,系统会将dns查询请求发送到/etc/resolv.conf文件中配置的dns服务器地址,既coredns的虚拟IP地址。coredns服务接收到dns查询的请求后,根据Service名称解析为相应的虚拟IP地址。coredns工作流程如下所示

- 容器中的/etc/resolv.conf文件的内容如下
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
nameserver:DNS服务器IP地址。这里的值为10.96.0.10,既Coredns Service的虚拟IP地址
search:DNS查询搜索域列表