zoukankan      html  css  js  c++  java
  • [译] 在Kubernetes生产环境中运行Istio

    本文翻译自 https://www.tigera.io/blog/running-istio-on-kubernetes-in-production-part-i/,作者 Alexander Lukyanchenko,发表于2019年5月。

    什么是Istio Istio是一种服务网格(service mesh)技术,它为网络添加了一个抽象层。它拦截K8S集群中的全部或部分流量,并对其进行处理。它支持哪些操作呢? 例如,设置智能路由(smart routing)或实现断路器(circuit breaker)或金丝雀部署(Canary deployment)。此外,Istio还可以限制外部交互,并控制群集和外部网络之间的所有路由。此外,它支持设置策略规则以控制不同微服务之间的交互。最后,我们可生成一个完整的网络交互图,采用统一度量,并对应用程序完全透明。

    Istion的详细介绍可以访问其官方文档https://istio.io/docs/concepts/。本文中,我会介绍基于Istio的微服务之间交互的基本原理,你将会看到Istio是一个非常强大的能解决很多问题的工具。我还会尝试着回答一些初学者经常问到的问题。我相信这些能帮助你高效地使用Istio

    在安装Istio之前,我想介绍一些基本概念、主要组件和组件之间交互的基本原理。

    1. 运行原理

    Istio包括两个主要组件:控制平面和数据平面。控制平面包括若干基础组件,用于控制其它组件之间能正确地交互。在当前1.0版本中,控制平面有三个主要组件:PilotMixerCitadel。文中不会介绍Citadel,它主要用于产生服务间通信所使用的TLS证书。我们现在来看下PolitMixer组件的用途和设计。

     Pilot是主要的控制组件,它分发集群中的有关信息,包括服务、端点和路由规则等。Mixer是一个可选控制平面组件,用于收集性能数据、日志和其它有关网络交互的信息。它还负责监视策略规则(policy rule)的合法性。 

    数据平面使用边车代理容器(sidecar proxy container)实现,默认使用Envoy。为了确保Istio对应用完全透明,还实现了自动插入机制。最新的实现支持K8S 1.9和更新版本。对于老K8S版本,可以使用初始化器(Initializer)。 

    边车容器通过GRPC协议连接到Pilot,该协议优化了对集群变化的推送实现机制。从Envoy 1.6版本就开始使用GPRC了。Istio0.8版本起就实现了一个 pilot-agent,它是一个用Go语言实现的Envoy的封装,用于配置启动参数。 

    PilotMixer是完全无状态组件,所有状态都保存在内存中。它们的配置保存在K8S CRD 中。Istio-agent获取Pilot地址,然后打开GPRC流。

     如上述介绍的,Istio实现了一种对应用完全透明的机制。过程如下:

    1. 部署一个服务的新版本。
    2. 根据不同的边车容器插入方式,在配置阶段,一个istio-init容器和istio-agent容器(envoy)被自动或手动插入服务pod。
    3. Istio-init容器是一个脚本,用于设置podiptables规则。有两种方式可配置将网络流量导入istio-agent容器:使用redirect iptables规则或TPROXY。本文写作时默认采用redirect iptables规则。在istio-init中,可配置哪些网络流量会被截取并发送到istio-agent。比如,为了截取所有进出的流量,你需要添加参数 –i-b *。你可以配置只截取特定端口的流量。要避免截取特定子网的流量,可以使用-x标志。
    4. Istio-init容器执行完毕后,包括pilot-agent和业务容器在内的所有容器都会被启动。Pilot-agent通过GRPC连接到Pilot,获取集群的有关信息。根据所收到的数据,它进行相关配置,其中,envoy会动态配置监听器,并开始监听。因此,当请求进入pod后,它会被redirect iptables规则导给边车容器,envoy处理这些流量并进行转发。本步中,会有数据被发给Mixer,下文会进行介绍。

    到此为止,我们了解了envoy代理所组成的完整网络,它能被从一个中心点(Pilot)上进行配置。现在,所有进出的请求都会经过Envoy。而且,只有TCP流量会被截取。这意味着K8S服务的DNS请求不会受到影响。当出去的流量被截取后,Envoy会处理它,并决定发往哪里。 

    2. Mixer组件 

    下面我们会介绍Mixer的原理及用途。官方文档在https://istio.io/docs/concepts/policies-and-telemetry/overview/Mixer有两个组件:istio-telemetryistio-policy0.8版本之前,只有一个组件istio-mixer)。istio-telemetry通过GRPC从边车容器收取有关服务交互的计量信息,istio-policy收取并处理策略校验请求,并超检查策略规则的合法性。这些策略会在边车容器中被缓存一段时间。Mixer是一个高可用组件,采用多级缓存。一开始数据被缓存在边车容器中,然后在mixer侧,最后被发到所谓的mixer后端。结果,如果有某个组件故障,缓存会一直增长;如果组件重启,则缓存会被刷新。Mixer后端是一些发送计量数据的端点,比如statsdnewrelic之类。写这种后端也很容器,后文会做介绍。

    总结一下,istio-telemetry的工作流如下:

    1. 服务1给服务2发一个请求。
    2. 在服务1中,请求会被边车容器截取。它监控发给服务2的请求,会准备一些信息,封装成报告请求(Report reques)发给istio-telemetry
    3. istio-telemetry决定是否向其后端发送这些请求。

    3. 使用Pilot和Envoy搭建Istio系统

    我们来看看如何使用PilotEnvoy组件搭建Istio系统。首先来看下Pilot所用到的配置:

    apiVersion: v1
    
    kind: ConfigMap
    
    metadata:
    
      name: istio
    
      namespace: istio-system
    
      labels:
    
        app: istio
    
        service: istio
    
    data:
    
      mesh: |-
    
    # disable tracing mechanism for now
    
        enableTracing: false
    
    # do not specify mixer endpoints, so that sidecar containers do not send the information
    
        #mixerCheckServer: istio-policy.istio-system:15004
    
        #mixerReportServer: istio-telemetry.istio-system:15004
    
    # interval for envoy to check Pilot
    
        rdsRefreshDelay: 5s
    
    # default config for envoy sidecar
    
        defaultConfig:
    
          # like rdsRefreshDelay
    
          discoveryRefreshDelay: 5s
    
    # path to envoy executable
    
          configPath: "/etc/istio/proxy"
    
          binaryPath: "/usr/local/bin/envoy"
    
    # default name for sidecar container
    
          serviceCluster: istio-proxy
    
    # time for envoy to wait before it shuts down all existing connections
    
          drainDuration: 45s
    
          parentShutdownDuration: 1m0s
    
    # by default, REDIRECT rule for iptables is used. TPROXY can be used as well.
    
          #interceptionMode: REDIRECT
    
    # port for sidecar container admin panel
    
          proxyAdminPort: 15000
    
    # address for sending traces using zipkin protocol (not used as turned off in enableTracing option)
    
          zipkinAddress: tracing-collector.tracing:9411
    
    # statsd address for envoy containers metrics
    
          # statsdUdpAddress: aggregator:8126
    
    # turn off Mutual TLS
    
          controlPlaneAuthPolicy: NONE
    
    # istio-pilot listen port to report service discovery information to sidecars
    
          discoveryAddress: istio-pilot.istio-system:15007
    

    我们把Istio所有组件都放到istio-sytem命名空间中。最小配置只需要Pilot。我们使用如下的配置。我们会手动进行边车容器插入。

    初始容器配置:

    initContainers:
    
     - name: istio-init
    
       args:
    
       - -p
    
       - "15001"
    
       - -u
    
       - "1337"
    
       - -m
    
       - REDIRECT
    
       - -i
    
       - '*'
    
       - -b
    
       - '*'
    
       - -d
    
       - ""
    
       image: istio/proxy_init:1.0.0
    
       imagePullPolicy: IfNotPresent
    
       resources:
    
         limits:
    
           memory: 128Mi
    
       securityContext:
    
         capabilities:
    
           add:
    
           - NET_ADMIN
    

      

    边车容器配置:

    - name: istio-proxy
    
             command:
    
             - "bash"
    
             - "-c"
    
             - |
    
               exec /usr/local/bin/pilot-agent proxy sidecar 
    
               --configPath 
    
               /etc/istio/proxy 
    
               --binaryPath 
    
               /usr/local/bin/envoy 
    
               --serviceCluster 
    
               service-name 
    
               --drainDuration 
    
               45s 
    
               --parentShutdownDuration 
    
               1m0s 
    
               --discoveryAddress 
    
               istio-pilot.istio-system:15007 
    
               --discoveryRefreshDelay 
    
               1s 
    
               --connectTimeout 
    
               10s 
    
               --proxyAdminPort 
    
               "15000" 
    
               --controlPlaneAuthPolicy 
    
               NONE
    
             env:
    
             - name: POD_NAME
    
               valueFrom:
    
                 fieldRef:
    
                   fieldPath: metadata.name
    
             - name: POD_NAMESPACE
    
               valueFrom:
    
                 fieldRef:
    
                   fieldPath: metadata.namespace
    
             - name: INSTANCE_IP
    
               valueFrom:
    
                 fieldRef:
    
                   fieldPath: status.podIP
    
             - name: ISTIO_META_POD_NAME
    
               valueFrom:
    
                 fieldRef:
    
                   fieldPath: metadata.name
    
             - name: ISTIO_META_INTERCEPTION_MODE
    
               value: REDIRECT
    
             image: istio/proxyv2:1.0.0
    
             imagePullPolicy: IfNotPresent
    
             resources:
    
               requests:
    
                 cpu: 100m
    
                 memory: 128Mi
    
               limits:
    
                 memory: 2048Mi
    
             securityContext:
    
               privileged: false
    
               readOnlyRootFilesystem: true
    
               runAsUser: 1337
    
             volumeMounts:
    
             - mountPath: /etc/istio/proxy
    
               name: istio-envoy
    

    一个完整的安装还需要创建服务账户、集群角色、集群角色绑定和CRD。更多信息请阅读https://github.com/istio/istio/tree/release-1.0/install/kubernetes/helm/istio/charts/pilot/templates。安装好以后,边车容器会被注入服务pod,Envoy会被启动起来,从Pilot接受数据并开始处理请求。

    这里关键的一点是,所有控制平面组件都是无状态的,因此很容器水平扩展。所有数据都以CRD被保存在etcd中。

    而且,还可以将Istio安装在集群之外,并用于多个K8S集群。更多信息可阅读https://istio.io/docs/setup/kubernetes/multicluster-install/。在多集群部署中,需要考虑以下限制:

    • CIDR Pod和服务CIDR必须是集群间唯一,而且不能重叠。
    • 所有CIDR Pod都能在集群内被访问。
    • 所有K8S API 服务器都能被互访。 

    感谢您的阅读,欢迎关注我的微信公众号:

  • 相关阅读:
    java图片压缩处理
    RocketMQ启动broker提示 错误:找不到或无法加载主类
    Docker
    openresty (nginx+lua)实现请求过滤
    mybatis-3.4.0 Date类型非空字符串判断bug
    ClickHouse 官方文档
    Flume 搭建遇到的问题
    Hadoop与HDFS
    关于Linux
    mybatis insert 返回主键
  • 原文地址:https://www.cnblogs.com/sammyliu/p/12308226.html
Copyright © 2011-2022 走看看