我们访问这个域名即可拿到响应,同时我们打开 k8s-combat-service-istio-mesh service 的 Pod 查看日志,会发现所有的请求都进入了 v1, 如果不需要这个限制条件,将 subset: v1 删除即可。
在上一期k8s-服务网格实战-配置 Mesh中讲解了如何配置集群内的 Mesh 请求,Istio 同样也可以处理集群外部流量,也就是我们常见的网关。
图片
其实和之前讲到的k8s入门到实战-使用IngressIngress作用类似,都是将内部服务暴露出去的方法。
只是使用Istio-gateway会更加灵活。
图片
这里有一张功能对比图,可以明显的看出Istio-gateway支持的功能会更多,如果是一个中大型企业并且已经用上 Istio 后还是更推荐是有Istio-gateway,使用同一个控制面就可以管理内外网流量。
创建 Gateway
开始之前首先是创建一个Istio-Gateway的资源:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-ingress-gateway
namespace: default
spec:
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- 'www.service1.io'
selector:
app: istio-ingressgateway #与现有的 gateway 关联
istio: ingressgateway
其中的selector选择器中匹配的 label 与我们安装Istio时候自带的gateway关联即可。
# 查看 gateway 的 label
k get pod -n istio-system
NAME READY STATUS
istio-ingressgateway-649f75b6b9-klljw 1/1 Running
k describe pod istio-ingressgateway-649f75b6b9-klljw -n istio-system |grep Labels
Labels: app=istio-ingressgateway
图片
这个Gateway在我们第一次安装Istio的时候就会安装这个组件。
这个配置的含义是网关会代理通过www.service1.io这个域名访问的所有请求。
之后需要使用刚才的 gateway 与我们的服务的 service 进行绑定,这时就需要使用到VirtualService:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: k8s-combat-istio-http-vs
spec:
gateways:
- istio-ingress-gateway # 绑定刚才创建的 gateway 名称
hosts:
- www.service1.io
http:
- name: default
route:
- destination:
host: k8s-combat-service-istio-mesh #service 名称
port:
number: 8081
subset: v1
这个和我们之前讲到的 Mesh 内部流量时所使用到的VirtualService配置是一样的。
这里的含义也是通过www.service1.io以及istio-ingress-gateway网关的流量会进入这个虚拟服务,但所有的请求都会进入subset: v1这个分组。
这个的分组信息在上一节可以查询到:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: k8s-combat-service-ds
spec:
host: k8s-combat-service-istio-mesh
subsets:
- name: v1
labels:
app: k8s-combat-service-v1
- name: v2
labels:
app: k8s-combat-service-v2
之后我们访问这个域名即可拿到响应,同时我们打开k8s-combat-service-istio-meshservice 的 Pod 查看日志,会发现所有的请求都进入了 v1, 如果不需要这个限制条件,将subset: v1删除即可。
curl http://www.service1.io/ping
本地需要配置下 host:127.0.0.1 www.service1.io
图片
还有一点,我们需要拿到gateway的外部IP,才能将 IP 和刚才的域名www.service1.io进行绑定(host,或者是域名管理台)。
如果使用的是docker-desktop自带的kubernetes集群时候直接使用127.0.0.1即可,默认就会绑定上。
如果使用的是minikube安装的,那需要使用minikube tunnel手动为 service 为LoadBalancer类型的绑定一个本地 IP,具体可以参考文档:https://minikube.sigs.k8s.io/docs/tasks/loadbalancer
如果是生产环境使用,云服务厂商会自动绑定一个外网 IP。
原理
图片
这个的访问请求的流程和之前讲到的kubernetes Ingress流程是类似的,只是 gateway 是通过VirtualService来路由的 service,同时在这个VirtualService中可以自定义许多的路由规则。
总结
服务网格Istio基本上讲完了,后续还有关于Telemetry相关的trace、log、metrics会在运维章节更新,也会和 Istio 有所关联。感兴趣的朋友可以持续关注。
本文的所有源码在这里可以访问:https://github.com/crossoverJie/k8s-combat
©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经