springboot + nacos2.0.2 + istio
nacos.discovery.server-addr=192.168.27.173:8848
server.port=10016
spring.application.name=mesh-server
nacos.discovery.auto-register=true
nacos.discovery.register.group-name=group1
nacos.discovery.register.healthy=true
nacos.discovery.register.enabled=true
nacos.discovery.register.ephemeral=true
nacos.discovery.register.metadata.username=test
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
logging.level.org.reflections.Reflections:error
@RestController
@RequestMapping("/server")
public class RestServerController {
@GetMapping("/info")
public String client() {
return "ok";
}
}
FROM openjdk:8u121-jdk
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
ADD /target/server-1.0-SNAPSHOT.jar /
ENTRYPOINT java -jar /server-1.0-SNAPSHOT.jar
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-istio-server
spec:
replicas: 1
selector:
matchLabels:
app: spring-boot-istio-server
template:
metadata:
labels:
app: spring-boot-istio-server
spec:
containers:
- name: spring-boot-istio-client
image: spring-boot-istio-server:0.0.1
imagePullPolicy: Never
tty: true
ports:
- name: http
protocol: TCP
containerPort: 10016
client 类似于server端.不同的是调用server端代码为
@RestController
@RequestMapping("/client")
public class RestClientController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/version")
public String client() {
return restTemplate.getForObject("http://mesh-server.group1.public.nacos:10016/server/info", String.class);
}
}
spring.application.name=mesh-client
这两个服务会注册到nacos
上. 目前nacos支持mcp
和xds-over-mcp
协议. istio1.9之后用xds-over-mcp
协议 nacos开启istio同步
nacos.istio.mcp.server.enabled=true
修改istio配置.使用nacos作为istio的服务发现.开启Istio-proxy 捕获 DNS 请求,解析自定义的 ServiceEntry
rootNamespace: istio-system
trustDomain: cluster.local
configSources:
- address: xds://192.168.27.173:18848
配置dns-proxy. 虽然 Kubernetes 为 Kubernetes Service 提供了一个开箱即用的 DNS 解析,但任何自定义的 ServiceEntry 都不会被识别。有了这个功能,ServiceEntry 地址可以被解析,而不需要自定义 DNS 服务配置。对于 Kubernetes Service 来说,一样的 DNS 响应,但减少了 kube-dns 的负载,并且提高了性能
proxyMetadata:
ISTIO_META_DNS_AUTO_ALLOCATE: \"true\"
ISTIO_META_DNS_CAPTURE: \"true\"
测试
进去spring-boot-mesh-client的pod中. 执行
curl http://localhost:10015/client/version 返回 ok
一些命令
kubectl logs -f istiod-dcf548bfd-xjdl6 -n istio-system
kubectl logs -f -l app=spring-boot-istio-client -c istio-proxy -n istio-demo
istioctl proxy-config clusters whoami-586fd9cddd-jgrcc -n istio-demo
pilot-discovery
命令在istiod中的/usr/local/bin/pilot-discovery
nacos生成的serviceEntry
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: mesh-server.group1.public.nacos
spec:
hosts:
- mesh-server.group1.public.nacos
location: MESH_INTERNAL
ports:
- number: 10015
name: http
protocol: HTTP
resolution: STATIC
endpoints:
- address: xxxx
port: xxxx
weight: x
- address: xxxx
port: xxxx
weight: x
总结
nacos 定时每10s 同步service list 给istiod. 实时感知服务上下线问题? istiod服务发现同步给envoy服务列表时是全量同步的. 服务很多时有同步的压力. envoy直接对接nacos吗? 同步会检测服务的checksum. 服务信息如果有变更再同步. 但是好像有点bug…
参考
https://zhuanlan.zhihu.com/p/337173238 https://github.com/piomin/sample-istio-services https://github.com/alibaba/nacos/issues/6405 https://istio.io/latest/zh/docs/ops/configuration/traffic-management/dns-proxy/