Docker Kubernetes 服务发现原理详解
服务发现支持Service环境变量和DNS两种模式:
一、环境变量 (默认)
当一个Pod运行到Node,kubelet会为每个容器添加一组环境变量,Pod容器中程序就可以使用这些环境变量发现Service。
环境变量名格式如下:
{SVCNAME}_SERVICE_HOST
{SVCNAME}_SERVICE_PORT
注:其中服务名和端口名转为大写,连字符转换为下划线。
限制:
1)Pod和Service的创建顺序是有要求的,Service必须在Pod创建之前被创建,否则环境变量不会设置到Pod中。
2)Pod只能获取同Namespace中的Service环境变量。
案例:
# 查看容器内的变量
kubectl exec nginx-deployment-66579795d7-2thc9 env
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=nginx-deployment-66579795d7-2thc9 NGINX_SERVICE_PORT=88 NGINX_SERVICE_PORT_888_TCP_PROTO=tcp NGINX_SERVICE_PORT_888_TCP_ADDR=10.10.10.11 KUBERNETES_PORT=tcp://10.10.10.1:443 NGINX_PORT_88_TCP_PORT=88 NGINX_DEPLOYMENT_SERVICE_HOST=10.10.10.12 NGINX_DEPLOYMENT_PORT_80_TCP=tcp://10.10.10.12:80 NGINX_SERVICE2_SERVICE_HOST=10.10.10.39 HOME=/root ...
注:Kubernetes将信息通过变量存入容器中
注:每个容器间的通信地址都会再容器创建时记录到容器当中。
二、DNS(推荐)
DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。这样Pod中就可以通过DNS域名获取Service的访问地址。
DNS服务发现
放入kuber cstenmu默认的系统命名空间中。
部署:www.kubernetes.io
注:DNS需要下载DNS插件来提供服务。