前言
上一篇内容,我们详细讨论了怎么使用envoy做负载均衡,并且记录详细的地址,其中还解决了一个问题,那就是怎么让envoy获取真实后端pod ip地址,后面使用headless service,既使用了service的服务发现能力,又不使用service的负载均衡能力
如果在某些特殊的场景下完全放弃的k8s service(比如混合云部署机房,两边云都需要有相同的服务,但是服务之间不能跨云访问),怎么赋予envoy服务发现的能力
静态配置服务发现
顾名思义,直接写在配置里面
...
static_resources:
...clusters:- name: backend_clusterconnect_timeout: 0.25stype: STATICload_assignment:cluster_name: backend_clusterendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.1.100port_value: 8080- endpoint:address:socket_address:address: 192.168.1.101port_value: 8080
...
type: STATIC是关键配置
基于dns的服务发现
之前的k8s服务发现,就是利用k8s dns做的服务发现,这里再举一个例子,也是经常使用的三方注册中心,consul
安装consul
docker run -d --name consul \-p 8300-8302:8300-8302 \-p 8500:8500 \-p 8301-8302 \-p 8600:8600/udp \hashicorp/consul:1.22
这里的关键是-p 8600:8600/udp
修改coredns配置
kubectl -n kube-system edit cm coredns
...forward consul 10.22.12.178:8600 {prefer_udp}
...
只要访问*.consul的域名,都去访问10.22.12.178:8600,而8600端口,就是consul提供的dns udp端口
至于为什么是*.consul呢?.service.consul 是 Consul 官方规定的服务发现域名
| 域名 | 含义 |
|---|---|
service.consul |
服务发现(最常用) |
node.consul |
查询节点 IP |
query.consul |
Prepared Query |
dc.consul |
跨数据中心 |
所以直接转发*.consul,粗暴有效
往consul注册数据
curl -X PUT http://10.22.12.178:8500/v1/agent/service/register \-H "Content-Type: application/json" \-d '{"Name": "backend-service-consul","ID": "service-1","Address": "10.244.0.82","Port": 10000}'
修改envoy配置
...clusters:- name: app_serviceconnect_timeout: 1stype: STRICT_DNSlb_policy: ROUND_ROBINload_assignment:cluster_name: app_serviceendpoints:- lb_endpoints:- endpoint:address:socket_address:address: "backend-service-consul.service.consul"port_value: 10000
...
修改完之后重启服务
这里需要注意的是address: "backend-service-consul.service.consul"
backend-service-consul是注册到consul的名字.service.consul上面已经说过,这是consul的固定格式
验证
curl 10.22.12.178:30785/test
[2025-12-18T09:42:47.296Z] "GET /test HTTP/1.0" 200 40 1 fd326a0e-ec4f-4cf3-a244-b29f4c0c0173 "curl/7.81.0" "-" 10.244.0.82:10000 app_service -
[2025-12-18T09:42:47.584Z] "GET /test HTTP/1.0" 200 40 0 b44ce502-a8ed-489a-b95b-d3c21af9d24d "curl/7.81.0" "-" 10.244.0.82:10000 app_service -
[2025-12-18T09:42:47.816Z] "GET /test HTTP/1.0" 200 40 1 f6ac4149-1e58-4b0e-a263-85fc89cef968 "curl/7.81.0" "-" 10.244.0.82:10000 app_service -
[2025-12-18T09:42:48.039Z] "GET /test HTTP/1.0" 200 40 1 c64c7f05-bcbb-42a7-9e68-a376217a4ca2 "curl/7.81.0" "-" 10.244.0.82:10000 app_service -
[2025-12-18T09:42:48.240Z] "GET /test HTTP/1.0" 200 40 1 96097880-bc28-4686-98d3-ab09848cf28a "curl/7.81.0" "-" 10.244.0.82:10000 app_service -
[2025-12-18T09:42:48.464Z] "GET /test HTTP/1.0" 200 40 0 799f7f10-1cb1-447a-828a-45ccc50273f5 "curl/7.81.0" "-" 10.244.0.82:10000 app_service -
确实已经生效了
consul小结
这里展示了怎么使用consul作为服务发现,不管是用headless还是consul,都是dns的服务发现,在consul的例子中,将固定域名(.service.consul)引导至consul提供的dns服务,从而实现
小结
本文介绍了如何使用静态的服务发现以及基于dns的服务发现,但是他们都存在一个问题,一旦envoy的配置有所改变,比如"backend-service-consul.service.consul"域名发生变化,或者port_value: 10000 端口发生变化, 那就势必要重启envoy来重新加载配置,这就带来了系统的复杂性与不稳定性了
那有没有什么方法是可以自动加载配置呢?肯定是有的,那又是下一文的内容
联系我
- 联系我,做深入的交流

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...