ServiceEntry与WorkloadEntry
ServiceEntry:
用于将未能自动添加至网格中的服务,以手形式使得内发 现机制能够访问或路由到这些服务。
网格外部的服务
运行于 Kubernetes 上,但却非为 Istio 网格管理的 名称空间中Pod 上,或者是 Kubernetes 集群外部的 VM 或裸服务上
在ServiceEntry 中,这类服务称为 MESH_EXTERNAL
位于 网格内部但自身并未注册Istio 注册表的服务,也能够手动添加至 Istio 的内部服务注册表中
运行于 Istio 网格内部,但未能自动注册到 Istio 注册表中
在ServiceEntry 中,这类服务称为 MESH_INTERNAL
WorkLoadEntry:用于抽象非kubernetes托管的工作负载。例如虚拟机实例和裸服务器等,从而将虚拟机加入到网格中
网格外部的服务:2个nginx服务
10.0.8.101:80 ,10.0.8.111:80
域名使用nginx.myland.com
ServiceEntry实例1:无ServiceEntry时网格内部访问外部服务:
网格内的POD:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: aa
name: aa
spec:
replicas: 1
selector:
matchLabels:
app: aa
template:
metadata:
labels:
app: aa
spec:
containers:
- image: ikubernetes/demoapp:v1.0
name: aa
在pod内/etc/hosts中增加:
10.0.8.101 nginx.myland.com
10.0.8.111 nginx.myland.com
登录kiali查看:
可以看到,访问外部应用时直接交给了PassthroughCluster集群,没有为外部应用建立Listener
ServiceEntry实例2:有ServiceEntry时网格内部访问外部服务:
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: nginx-external
spec:
hosts:
- nginx.myland.com #虚拟域名
addresses:
- "2.2.2.2" #虚拟地址
ports:
- number: 8091
name: http
protocol: HTTP
location: MESH_EXTERNAL
resolution: STATIC
endpoints: #后端
- address: "10.0.8.101"
ports:
http: 8091
- address: "10.0.8.111"
ports:
http: 8091
注意:由于istio默认不捕获UDP流量,但是DNS解析是UDP协议,解决这个问题有2种方法:
1、通过域名访问需要在pod内/etc/hosts中新增解析记录(只要存在nginx.myland.com的解析记录即可,解析地址随便填,目的是使istio捕获http流量)
2、在istio configmap中新增一下配置,使istio捕获DNS流量
proxyMetadata:
# Enable basic DNS proxying
ISTIO_META_DNS_CAPTURE: "true"
# Enable automatic address allocation, optional
ISTIO_META_DNS_AUTO_ALLOCATE: "true""
可以通过域名或者虚拟地址访问:
kiali上查看:也只是有一个nginx-externel,看不到外部负载信息
可以通过创建hosts为nginx.myland.com的VirtualService和DestinationRule 来做更高级的流量管理
WorkloadEntry实例:
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: nginx-external
spec:
hosts:
- nginx.myland.com
ports:
- number: 8091
name: http
protocol: HTTP
location: MESH_EXTERNAL
resolution: STATIC
workloadSelector:
labels:
app: nginx
---
apiVersion: networking.istio.io/v1beta1
kind: WorkloadEntry
metadata:
name: workload-nginx2001
spec:
address: "10.0.8.101"
ports:
http: 8091
labels:
app: nginx
version: "v1.20"
instance-id: Nginx2001
---
apiVersion: networking.istio.io/v1beta1
kind: WorkloadEntry
metadata:
name: workload-nginx2002
spec:
address: "10.0.8.111"
ports:
http: 8091
labels:
app: nginx
version: "v1.20"
instance-id: Nginx2002
serviceentry定义服务,workloadentry定义端点
可以看到外部更详细的信息,也可以做更高级的流量管理