• 五分钟k8s实战-Istio 网关


    1170da168623d56dd7e83f8060603fcf.png

    istio-03.png

    在上一期 k8s-服务网格实战-配置 Mesh 中讲解了如何配置集群内的 Mesh 请求,Istio 同样也可以处理集群外部流量,也就是我们常见的网关。c35ddee186aaacb5b1414fb11ad8ddee.png

    其实和之前讲到的k8s入门到实战-使用Ingress Ingress 作用类似,都是将内部服务暴露出去的方法。

    只是使用 Istio-gateway 会更加灵活。1c82ec5abf92bf0de3862022ad8bfaec.png

    这里有一张功能对比图,可以明显的看出 Istio-gateway 支持的功能会更多,如果是一个中大型企业并且已经用上 Istio 后还是更推荐是有 Istio-gateway,使用同一个控制面就可以管理内外网流量。

    创建 Gateway

    开始之前首先是创建一个 Istio-Gateway 的资源:

    1. apiVersion: networking.istio.io/v1alpha3  
    2. kind: Gateway  
    3. metadata:  
    4.   name: istio-ingress-gateway  
    5.   namespace: default  
    6. spec:  
    7.   servers:  
    8.     - port:  
    9.         number: 80  
    10.         name: http  
    11.         protocol: HTTP  
    12.       hosts:  
    13.         - 'www.service1.io'  
    14.   selector:  
    15.     app: istio-ingressgateway #与现有的 gateway 关联  
    16.     istio: ingressgateway

    其中的 selector 选择器中匹配的 label 与我们安装 Istio 时候自带的 gateway 关联即可。

    1. # 查看 gateway 的 label
    2. k get pod -n istio-system
    3. NAME                                    READY   STATUS
    4. istio-ingressgateway-649f75b6b9-klljw   1/1     Running
    5. k describe pod istio-ingressgateway-649f75b6b9-klljw -n istio-system |grep Labels
    6. Labels:           app=istio-ingressgateway
    6c422b254b6356af337d090d63a55155.png
    image.png

    这个 Gateway 在我们第一次安装 Istio 的时候就会安装这个组件。


    这个配置的含义是网关会代理通过 www.service1.io 这个域名访问的所有请求。

    之后需要使用刚才的 gateway 与我们的服务的 service 进行绑定,这时就需要使用到 VirtualService

    1. apiVersion: networking.istio.io/v1alpha3  
    2. kind: VirtualService  
    3. metadata:  
    4.   name: k8s-combat-istio-http-vs  
    5. spec:  
    6.   gateways:  
    7.     - istio-ingress-gateway # 绑定刚才创建的 gateway 名称 
    8.   hosts:  
    9.     - www.service1.io
    10. http:
    11. - name: default  
    12.   route:  
    13.     - destination:  
    14.         host: k8s-combat-service-istio-mesh  #service 名称
    15.         port:  
    16.           number: 8081  
    17.         subset: v1

    这个和我们之前讲到的 Mesh 内部流量时所使用到的 VirtualService 配置是一样的。

    这里的含义也是通过 www.service1.io 以及 istio-ingress-gateway 网关的流量会进入这个虚拟服务,但所有的请求都会进入 subset: v1 这个分组。

    这个的分组信息在上一节可以查询到:

    1. apiVersion: networking.istio.io/v1alpha3  
    2. kind: DestinationRule  
    3. metadata:  
    4.   name: k8s-combat-service-ds  
    5. spec:  
    6.   host: k8s-combat-service-istio-mesh  
    7.   subsets:  
    8.     - name: v1  
    9.       labels:  
    10.         app: k8s-combat-service-v1  
    11.     - name: v2  
    12.       labels:  
    13.         app: k8s-combat-service-v2

    之后我们访问这个域名即可拿到响应,同时我们打开 k8s-combat-service-istio-mesh service 的 Pod 查看日志,会发现所有的请求都进入了 v1, 如果不需要这个限制条件,将 subset: v1 删除即可。

    curl  http://www.service1.io/ping

    本地需要配置下 host: 127.0.0.1 www.service1.io

    269df780b186c748816ec25859688b02.png
    image.png

    还有一点,我们需要拿到 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。

    原理

    726fa434e89992d33754da491c8ff81f.png
    image.png

    这个的访问请求的流程和之前讲到的 kubernetes Ingress 流程是类似的,只是 gateway 是通过 VirtualService 来路由的 service,同时在这个 VirtualService 中可以自定义许多的路由规则。

    总结

    服务网格 Istio 基本上讲完了,后续还有关于 Telemetry 相关的 tracelogmetrics 会在运维章节更新,也会和 Istio 有所关联。感兴趣的朋友可以持续关注。

    本文的所有源码在这里可以访问:https://github.com/crossoverJie/k8s-combat

    PS:最近也在更新视频号,也会有一些技术干货,动动小手帮主播点播关注

    4a8af9c30c716649c66b205e7a5d8087.jpeg

    往期推荐

    技术阅读周刊第第5️⃣期

    k8s-服务网格实战-配置 Mesh(灰度发布)

    k8s-服务网格实战-入门Istio

    如何优雅重启 kubernetes 的 Pod

    62da3ebbc18add28b7e4a6e41550baf6.gif

    点分享

    a7e8a35da89d77bb88bce38b415b869c.gif

    点收藏

    2528c391e90716089b250a80af4c364e.gif

    点点赞

    119c175dd3995186bdd30eeef485d7ac.gif

    点在看

  • 相关阅读:
    力扣399题:除法求值
    罗克韦尔AB PLC Logix5000中如何创建标签并使用标签进行编程?
    华为od德科面试数据算法解析 2022-5-29 计算字符串最后一个单词的长度
    el-table表格宽度自适应
    第一个servlet的程序
    Linux 安装 Docker Compose
    辉芒微IO单片机FT60F024-RB
    java 多线程()—— 死锁
    IEDA代码模板
    使用vue写了一个音乐播放器
  • 原文地址:https://blog.csdn.net/qq_18661793/article/details/134432305