网格扩展(Mesh Expansion)就是指部署在Kubernetes之中的Istio服务网格提供的一种将虚拟机或物理裸机集成到服务网格的方法。
Mesh Expansion对于用户从遗留系统往云上迁移有着非常重要的作用,在微服务体系结构中,无法要求所有的工作负载都在Kubernetes中运行,用户的一些应用程序可能在Kubernetes中运维,而另外一些可能在虚拟机或物理裸机中运行。
通过一套Istio控制面板就可以管理跨Kubernetes与虚拟机或物理裸机的若干服务。这样既能保证原有业务的正常运转,又能实现Kubernetes与虚拟机上的应用服务混合编排的能力。
为了让虚拟机或者物理裸机上的应用以及Envoy代理能够加入同一套Istio控制面板,Kubernetes集群的Kube DNS服务以及Istio的Pilot、Mixer以及Citadel需要暴露一个基于负载均衡器LoadBalancer的服务,至于是外部负载均衡器还是内部负载均衡器则是取决于实际的网络环境。如果虚拟机或者物理裸机的网络可以通过内部网络连通到Kubernetes的内网地址,就可以使用内部负载均衡器以便节省网络带宽。否则就只能使用外部负载均衡器通过公网地址进行连通。如果还没有创建这些基于负载均衡器的服务,则可以通过如下方式定义YAML资源:
apiVersion: v1
kind: Service
metadata:
name: dns-ilb
namespace: kube-system
labels:
k8s-app: kube-dns
spec:
type: LoadBalancer
ports:
- port: 53
protocol: UDP
selector:
k8s-app: kube-dns
---
apiVersion: v1
kind: Service
metadata:
name: istio-pilot-ilb
namespace: istio-system
labels:
istio: pilot
spec:
type: LoadBalancer
ports:
- name: https-pilot
port: 15005
protocol: TCP
- port: 8080
name: http-pilot
protocol: TCP
- port: 15010
name: grpc-pilot
protocol: TCP
- port: 15011
name: tls-grpc-pilot
protocol: TCP
selector:
istio: pilot
---
apiVersion: v1
kind: Service
metadata:
name: mixer-ilb
namespace: istio-system
labels:
istio: mixer
spec:
type: LoadBalancer
ports:
- port: 15004
protocol: TCP
selector:
istio: mixer
istio-mixer-type: telemetry
---
apiVersion: v1
kind: Service
metadata:
name: citadel-ilb
namespace: istio-system
labels:
istio: citadel
spec:
type: LoadBalancer
ports:
- port: 8060
protocol: TCP
selector:
istio: citadel
将上述YAML内容保存为文件mesh-expansion.yaml,并执行如下命令:
kubectl apply -f ./mesh-expansion.yaml
上述4个服务创建如下:
$ kubectl apply -f ./mesh-expansion.yaml service/istio-pilot-ilb created service/dns-ilb created service/mixer-ilb created service/citadel-ilb created
接下来需要生成Istio的配置cluster.env与DNS配置文件kubedns,用来在虚拟机上进行配置。其中cluster.env文件包含了将要拦截的集群IP范围,kubedns文件则是让虚拟机上的应用能够解析集群的服务名称,然后被Sidecar劫持和转发。