引言
在Istio中提供了ServiceEntry的配置,将网格外的服务纳入网格管理。将第三方注册中心zookeeper、nacos等纳入Istio网格可以通过ServiceEntry纳入Istio的管理。这些如何注入的,流程是怎么样,下面通过示例将整个流程窜起来。
一、ServiceEntry注入工作原理
ServiceEntry注入的流程图
备注:注入流程如下
@1 将ServiceEntry注入到kube-apiserver中
@2 Istiod中通过kubeConfigController监听ServiceEntry配置的变化
@3 Istiod将ServiceEntry封装成PushRequest发送给XDSServer
@4 XDSServer转换为xDS格式下发给Envoy
二、Envoy中查看ServiceEntry
1.组织ServiceEntry配置
通过ServiceEntry配置baidu域名,将其作为网格服务的一部分serviceentry.yaml
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: baidu-external
spec:
hosts:
- www.baidu.com
ports:
- number: 80
name: HTTP
protocol: HTTP
resolution: DNS
location: MESH_INTERNAL
2.部署ServiceEntry配置
通过下面命令部署到Kubernetes api server中
kubectl apply -f serviceentry.yaml -n default
serviceentry.networking.istio.io/baidu-external created
3.Istio中查看ServiceEntry信息
登陆istiod容器
kubectl -n istio-system exec -it istiod-5c4b9cb6b5-6n68m -- /bin/bash
通过registryz命令查看,已经注入到istio中。
istio-proxy@istiod-5c4b9cb6b5-6n68m:/$ curl http://127.0.0.1:15014/debug/registryz
[
{
"Attributes": {
"ServiceRegistry": "External",
"Name": "www.baidu.com",
"Namespace": "default",
"Labels": null,
"UID": "",
"ExportTo": null,
"LabelSelectors": null,
"ClusterExternalAddresses": null,
"ClusterExternalPorts": null
},
"ports": [
{
"name": "HTTP",
"port": 80,
"protocol": "HTTP"
}
],
"creationTime": "2021-10-14T03:01:24Z",
"hostname": "www.baidu.com",
"address": "0.0.0.0",
"autoAllocatedAddress": "240.240.0.5",
"Mutex": {},
"Resolution": 1,
"MeshExternal": false
},
// ...
]
4.在Envoy查看xDS信息
istioctl proxy-config route productpage-v1-6b746f74dc-2c55l -n default -o json
[
//...
{
"name": "www.baidu.com:80",
"domains": [
"www.baidu.com",
"www.baidu.com:80"
],
"routes": [
{
"name": "default",
"match": {
"prefix": "/"
},
"route": {
"cluster": "outbound|80||www.baidu.com",
"timeout": "0s",
"retryPolicy": {
"retryOn": "connect-failure,refused-stream,unavailable,cancelled,retriable-status-codes",
"numRetries": 2,
"retryHostPredicate": [
{
"name": "envoy.retry_host_predicates.previous_hosts"
}
],
"hostSelectionRetryMaxAttempts": "5",
"retriableStatusCodes": [
503
]
},
"maxStreamDuration": {
"maxStreamDuration": "0s",
"grpcTimeoutHeaderMax": "0s"
}
},
"decorator": {
"operation": "www.baidu.com:80/*"
}
}
],
"includeRequestAttemptCount": true
}
// ...
]
小结:通过上面的命令追踪,ServiceEntry的示例下发到了数据面Envoy中。