写点什么

Istio 与 Kubernetes:资源管理与协同解析

  • 2023-12-07
    广东
  • 本文字数:3792 字

    阅读完需:约 12 分钟

Istio与Kubernetes:资源管理与协同解析

本文分享自华为云社区《istio资源介绍以及和kubernetes资源扭转关系》,作者:可以交个朋友。

一、istio 原理


Istio 的原理是拦截 Kubernetes 中创建 Pod 的事件,然后向 Pod 中注入一个包含 Envoy 的容器,进出 Pod 的流量会被 “劫持” 到 Envoy 进行处理。由于流量被 “劫持” 了,所以 Istio 可以对流量进行分析例如收集请求信息,以及一系列的流量管理操作,也可以验证授权信息。当 Envoy 拦截流量并执行一系列操作之后,如果请求没问题,就会转发流量到业务应用的 Pod 中。

二、istio 架构


istio 的架构分为 控制平面 、 数据平面 、出入口网关。



  • 控制平面:控制平面为 istiod,默认部署在 istio-system 命名空间。进入 istiod 容器可以看到主进程的名字为 pilot。所以我们可以得知控制平面的主体是 pilot,其他组件如 citadel Galley,是被 pilot 管理启动的。pilot 作为 istio 控制面的核心,主要有两个职责:1)监听 k8s 平台获取 svc , endpoint , virtualservice , gateway , destinationrule 等资源信息,这些信息是做流量转发必须依赖的;2)把获取到的信息抽象聚合,生成为 envoy 能识别的配置结构,最终通过 xds 协议下发配置到数据平面 envoy。envoy 创建了一套 envoy 动态下发配置并热生效的协议,被统称为 xds。 pilot 内实现了 xds 服务器,把已聚合转换的配置信息下发给数据面的 envoy,实现流量策略的热生效。

  • 数据平面:安装完 istio 之后,需要进行如下操作才会自动注入数据平面。


#对整个namespace自动注入:kubectl label namespace default istio-injection=enabled#对单个工作负载自动注入:添加annotation  sidecar.istio.io/inject=true
复制代码


开启自动注入后,istio 会向 pod 中注入 sidecar 容器,一个是修改 pod 内 iptables 的 initcontainer,另一个即是 istio 数据平面 istio-proxy。进入到 istio-proxy 中可以看到,主进程的名字为 pilot-agent。envoy 以子进程的形式被 pilot-agent 启动管理。pilot-agent 有两个职责:1)pilot-agent 会与 pilot 交互, pilot 下发的 xds 请求正是由 pilot-agent 接收;2)启动管理 envoy 进程,并根据接收到的配置对 envoy 进行热更新。


  • 出入口网关:istio-ingressgateway 和网格内的 sidecar 一样,核心处理组件也是一个 envoy,它作为网格的入口允许从服务从网格外部访问服务网格内部的服务,起到了类似 nginx-ingress 的作用。


istio-ingressgateway 的主要包括以下作用:1)接收集群外部的流量,并根据 Istio 的配置将请求路由到适当的内部服务(起到网关的作用);2)负载均衡和流量控制功能,包括请求路由、重试、超时、熔断等(流量治理);3)支持 TLS 配置,以便在流量进入服务网格之前进行加密(给域名配置证书);4)支持双向 TLS 身份验证,以提高服务网格的安全性(服务间通讯);5)提供 Metrics、Tracing 和 Logging 收集,以便更好地观察和监控流量(需要自己安装对应的组件)

三、istio 常用 CRD 资源

3.1 gateway


在 istio 中,定义“监听信息与入口网关“绑定关系的资源叫 Gateway


apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: my-gateway  namespace: istio-testspec:  selector:        istio: ingressgateway  # 根据标签选择生效的入口网关  servers:    - port:                # 监听的端口        number: 8080        name: http        protocol: HTTP     # 接收请求的协议      hosts:        - "*"              # 接收请求的域名
复制代码

3.2 virtualService


主要提供:1)路由功能:声明一个后端服务,及这个后端服务的路由信息;2)流量管控:镜像流量、故障注入、跨域配置等;3)绑定网关:通过 spec.gateways 字段绑定网关,在网关上生效路由规则和流量管控规则;4)绑定后端:spec.http.route.destination 字段,声明了每种路由的转发地址。


apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: my-virtualservice  namespace: istio-testspec:  hosts:  - "*"  gateways:  - my-gateway                              ## virtualservice关联gateway  http:  - name: "nginx-v1-routes"    match:                                  ## 路由规则,根据uri匹配    - uri:        prefix: "/aaa"              - uri:        prefix: "/"    route:    - destination:                                  ## virtualservice关联destinationrule        host: nginx.istio-test.svc.cluster.local            subset: v1                                  ## 关联destinationRule的subset.name
复制代码


注意事项:


  1. spec.http.route.destination.host 尽量使用 FQDN(全限定域名)

  2. uri 匹配时,大小写敏感

  3. istio 的 vs 的 url 匹配顺序是从上向下,而不是最长匹配。在生产环境中建议使用一个无条件的规则作为最后规则,确保流量始终会匹配到最少一条规则,防止意外情况的方式

  4. 当为已存在的 host 创建第二个及更多的 VirtualService 时,istio 会将额外的路由规则合并到 host 现有配置中,这种合并不保证匹配顺序性,可能会造成与预期匹配效果不一致。所以建议一个 host 的路由配置写在一个 virtualService.yaml 文件中

3.3 destinationRule


通过 VistualService 的 spec.http.route.destination 字段,VistualService 与 DestinationRule 形成了绑定关系。


apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: my-destination  namespace: istio-testspec:  host: mynginx.istio-test.svc.cluster.local   ## kuberntes内部FQDN域名,关联一个kubernetes service  subsets:  - name: v1    labels:                                  ##根据标签给pod分类,常用在灰度发布场景      version: v1      - name: v2    labels:      version: v2
复制代码


DestinationRule 主要功能:


  • 负载功能:从 host 字段的 service endpoint 列表中 选择一个,成为处理本次请求的真正后端。有轮询、一致性哈希、最少连接数、位置负载均衡等方式。

  • 连接池:对后端服务的连接数等进行限制。

  • 异常点检测:对后端服务进行健康探测,将异常后端点踢出负载。

  • 定义子集版本:通过 label 把 endpoint 分类。

四、istio 资源和 kubernetes 资源的关系


istio 服务网格,他的主要管理对象当然是服务,即 kubernetes 中的 service。istio 控制面 pilot 中包含 informer 用来获取 kubernetes 集群中的 service、endpoint、pod 资源信息,并将其转化为 envoy 的 cluster、endpoint 配置下发给数据面。大多数情况下我们可以把 envoy cluster 理解为 K8s 集群中的一个 service,一个 service 通常对应着一组 pod,envoy 中的 cluster 同样是一种相同后端的集合。

4.1 istio CRD 资源和 kubernetes 资源扭转关系图


istio 的 destinationRule 定义一组负载均衡后端服务地址,通过 spec.host 字段关联 kubernetes 集群中的 service,来获取 kubernetes 中的后端地址列表 endpoint。istio 的 destinationRule 还可以通过关联 pod-label 从 service 中筛选特定 pod,常用于灰度发布。istio-ingressgateway 的本质是一个部署在 istio-system 命名空间的 deployment,运行着 envoy 进程容器。我们一般需要手动创建 LoadBalacne 类型的 kubernetes-service,使其获得对外的 ip。

4.2 istio 需要通过 kubernetes service port 信息获取服务协议


istio 需要知道服务提供什么七层协议,从而来为其配置相应协议的 filter chain,官方建议显式声明协议。如果没有声明,istio 会自动探测,但这个探测能力比较有限(仅能探测识别 http https http2 协议),可能导致无法正常工作。


kind: Servicemetadata:  name: myservicespec:  ports:  - number: 8080    name: rpc    appProtocol: grpc       # 第一种:指定该端口提供grpc协议的服务  - number: 80        name: http-web          # 第二种:以协议名为前缀命名端口,声明80端口提供http协议服务
复制代码

五、istio 常用资源操作和关联关系展示

5.1 创建 deployment、service 资源


kind: DeploymentapiVersion: apps/v1metadata:  name: mynginx  namespace: istio-test  labels:    appgroup: ''    version: v1spec:  replicas: 1  selector:    matchLabels:      app: mynginx      version: v1  template:    metadata:      creationTimestamp: null      labels:        app: mynginx        version: v1    spec:      containers:        - name: container-1          image: nginx:1.17.4          resources:            limits:              cpu: 250m              memory: 512Mi            requests:              cpu: 250m              memory: 512Mi          imagePullPolicy: IfNotPresent      restartPolicy: Always      dnsPolicy: ClusterFirst      imagePullSecrets:        - name: default-secret---apiVersion: v1kind: Servicemetadata:  name: nginx  namespace: istio-test  labels:    app: mynginx    version: v1spec:  ports:    - name: http-nginx      port: 80      targetPort: 80  selector:    app: mynginx    version: v1  type: ClusterIP
复制代码

5.2 创建对应 istio 资源


按照 3.1 3.2 3.3 章节 yaml 创建相关 istio 资源

5.3 查看相关资源关联关系


  • 创建 gateway 资源后



  • 创建 virtualservice 资源后



  • 创建 destinationrule 资源后



点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
Istio与Kubernetes:资源管理与协同解析_云原生_华为云开发者联盟_InfoQ写作社区