美文网首页Linux从入门到放弃
istio是什么?怎么搭建?

istio是什么?怎么搭建?

作者: chuan_bai | 来源:发表于2020-05-14 15:46 被阅读0次

    服务网格(service mesh)

    首先引入服务网格的概念,服务网格就是service mesh ,在很多年前就被提出来过,但是直到微服务的时代,才开始大展拳脚,istio其实就是关于服务网格概念的一种落地和实现。
    服务网格其实就是传统代理的升级版(可以理解为分布式的微服务代理),由原来的一个或者几个代理变成了每个pod常驻一个代理(可以理解为每个pod都在自带了一个小的nginx),负责流量相关的工作,这样所有的流量都被代理接管,用户的业务和控制面板彻底的解耦了。
    而控制中心就是负责汇聚整个集群的信息,管理员可以通过服务网格控制面的api来对整个集群做管理。

    服务网格架构图

    以下是service1访问service2的时序图:
    service1访问serivce2必须通过两次sidercar拦截,而service1和service2直接不会进行直接通信,而是要有各自的sidecar来联系

    image.png

    istio介绍:

    Istio是一个用于服务指令的开放平台,弥补了k8s所欠缺的那部分(如动态路由、链路追踪、熔断限流等),大大降低了微服务运维的复杂性,根据Istio官网的介绍,包含了连接、保护、控制和观察服务几大特性,istio为负责的微服务架构减轻了很多的负担,开发者不用关心服务调用的超时、重试的实现,服务之间的安全、授权也自动得到了保证。


    istio的官网说明
    • 连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和红黑部署等功能
    • 安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。
    • 控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。
    • 观察(Observe):查看服务运行期间的各种数据,比如日志、监控和 tracing,了解服务的运行情况。

    架构组成:

    istio架构图

    istio可以大致分为数据平面和控制平面两个部分

    数据平面:

    由一组代理组成,接收并实施mixer的策略

    proxy:(sidecar 代理)

    负责高效转发和策略实现(envoy 类型nginx)
    envoy部署在每一个需要管理k8s的pod中,会拦截所有的流量,经过规则校验

    会经过本Pod的Enovy代理,Enovy完成规则校验、数据采集、日志等操作后,再转发出去;值得注意的是,请求方Enovy转发出去的流量会发送给接收方的Enovy,之后才有可能到达真正的接收方data-product容器。当然这些操作是Istio的活,我们要做的仅仅是通过配置的形式告诉Istio我们要对哪些流量做什么动作。

    控制平面:

    Mixer:(上报数据)

    是控制面的核心,主要职责是获取注册中心的用户配置信息,在根据用户配置信息来处理envoy端的请求
    适配组件,数据平面和控制平面通信,是通过Mixer来完成的,为proxy提供策略和数据上报

    • telemertry组件:

    • policy组件:
      机制流程和telemetry类似,数据面在转发服务的请求前调用policy的check接口,检查是否允许访问,Mixer会根据配置将请求转发到Adapter做对应检查,给代理返回是否允许访问。

    pilot:(服务发现、配置下发)

    配置策略组件,为Proxy提供服务发现,智能路由,错误处理等,主要是做流量管理操作,类似于C/S架构中的master服务。
    而且还有一个向数据面下发规则的功能,如VirtualService、DestinationRule、Gateway、ServiceEntry等流量治理规则、安全规则等,pilot负责将各种规则转换为Envoy可识别的格式,通过标准的xDs协议发送给Envoy,指导Envoy完成动作。在通信上,Envoy通过gRPC流式订阅pilot的配置资源,Envoy根据该路由规则进行流量转发。

    Citadel:(证书、秘钥校验)

    核心安全组件,提供加密通信,撤销秘钥和证书等功能,Citadel一直监听Kube-apiservicr,以serect的形式为每个服务都生成证书和秘钥,并在pod在创建时挂载在pod上,代理容器使用这些文件进行服务认证,进而代理两端服务实现双向TLS认证,通道加密、访问授权等安全功能。这样就省去了用户在代码里维护证书秘钥。

    Galley:(配置管理)

    配置管理,验证,分发,负责配置管理的组件,验证配置信息的格式和内容的正确性

    Gateway:(入口,网格外访问网格内的唯一入口)

    是网格外网格内的唯一入口,也包含了sidecar

    搭建istio平台

    参考中文官网:https://istio.io/zh/docs/setup/getting-started/

    一. 下载

    1.下载istio,如果服务器上下载不下来,可以下载到本地后再上传到服务器

    curl -L https://istio.io/downloadIstio | sh -
    

    2.切换到 Istio 包所在目录下。例如:Istio 包名为 istio-1.5.4,则:

     cd istio-1.5.4
    
    1. 安装目录包含如下内容:

      • install/kubernetes 目录下,有 Kubernetes 相关的 YAML 安装文件
      • samples/ 目录下,有示例应用程序
      • bin/ 目录下,包含 istioct的客户端文件。istioctl 工具用于手动注入 Envoy sidecar 代理。
    2. 将 istioctl 客户端路径增加到 path 环境变量中,macOS 或 Linux 系统的增加方式如下:

    $ export PATH=$PWD/bin:$PATH
    

    二. 使用 demo 配置文件安装 Istio

    1. 安装
    istioctl manifest apply --set profile=demo
    
    1. 为了验证是否安装成功,需要先确保以下 Kubernetes 服务正确部署,然后验证除 jaeger-agent 服务外的其他服务,是否均有正确的 CLUSTER-IP:
    $ kubectl get svc -n istio-system
    NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                                                                                                                      AGE
    grafana                  ClusterIP      172.21.211.123   <none>          3000/TCP                                                                                                                                     2m
    istio-citadel            ClusterIP      172.21.177.222   <none>          8060/TCP,15014/TCP                                                                                                                           2m
    istio-egressgateway      ClusterIP      172.21.113.24    <none>          80/TCP,443/TCP,15443/TCP                                                                                                                     2m
    istio-galley             ClusterIP      172.21.132.247   <none>          443/TCP,15014/TCP,9901/TCP                                                                                                                   2m
    istio-ingressgateway     LoadBalancer   172.21.144.254   52.116.22.242   15020:31831/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30318/TCP,15030:32645/TCP,15031:31933/TCP,15032:31188/TCP,15443:30838/TCP   2m
    istio-pilot              ClusterIP      172.21.105.205   <none>          15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       2m
    istio-policy             ClusterIP      172.21.14.236    <none>          9091/TCP,15004/TCP,15014/TCP                                                                                                                 2m
    istio-sidecar-injector   ClusterIP      172.21.155.47    <none>          443/TCP,15014/TCP                                                                                                                            2m
    istio-telemetry          ClusterIP      172.21.196.79    <none>          9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       2m
    jaeger-agent             ClusterIP      None             <none>          5775/UDP,6831/UDP,6832/UDP                                                                                                                   2m
    jaeger-collector         ClusterIP      172.21.135.51    <none>          14267/TCP,14268/TCP                                                                                                                          2m
    jaeger-query             ClusterIP      172.21.26.187    <none>          16686/TCP                                                                                                                                    2m
    kiali                    ClusterIP      172.21.155.201   <none>          20001/TCP                                                                                                                                    2m
    prometheus               ClusterIP      172.21.63.159    <none>          9090/TCP                                                                                                                                     2m
    tracing                  ClusterIP      172.21.2.245     <none>          80/TCP                                                                                                                                       2m
    zipkin                   ClusterIP      172.21.182.245   <none>          9411/TCP                    
    

    请确保关联的 Kubernetes pod 已经部署,并且 STATUS 为 Running:

    $ kubectl get pods -n istio-system
    NAME                                                           READY   STATUS      RESTARTS   AGE
    grafana-f8467cc6-rbjlg                                         1/1     Running     0          1m
    istio-citadel-78df5b548f-g5cpw                                 1/1     Running     0          1m
    istio-egressgateway-78569df5c4-zwtb5                           1/1     Running     0          1m
    istio-galley-74d5f764fc-q7nrk                                  1/1     Running     0          1m
    istio-ingressgateway-7ddcfd665c-dmtqz                          1/1     Running     0          1m
    istio-pilot-f479bbf5c-qwr28                                    1/1     Running     0          1m
    istio-policy-6fccc5c868-xhblv                                  1/1     Running     2          1m
    istio-sidecar-injector-78499d85b8-x44m6                        1/1     Running     0          1m
    istio-telemetry-78b96c6cb6-ldm9q                               1/1     Running     2          1m
    istio-tracing-69b5f778b7-s2zvw                                 1/1     Running     0          1m
    kiali-99f7467dc-6rvwp                                          1/1     Running     0          1m
    prometheus-67cdb66cbb-9w2hm                                    1/1     Running     0          1m
    

    三. 后续步骤

    1. 自动注入:

    当使用 kubectl apply 来部署应用时,如果 pod 启动在标有 istio-injection=enabled 的命名空间中,那么,Istio sidecar 注入器将自动注入 Envoy 容器到应用的 pod 中:

    kubectl label namespace <namespace> istio-injection=enabled
    

    或者

    kubectl create -n <namespace> -f <your-app-spec>.yaml
    
    2. 手动注入:

    在没有 istio-injection 标记的命名空间中,在部署前可以使用istioctl kube-inject命令将 Envoy 容器手动注入到应用的 pod 中:

    istioctl kube-inject -f <your-app-spec>.yaml | kubectl apply -f -
    

    相关文章

      网友评论

        本文标题:istio是什么?怎么搭建?

        本文链接:https://www.haomeiwen.com/subject/izaznhtx.html