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/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: istio-test
spec:
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/v1alpha3
kind: VirtualService
metadata:
name: my-virtualservice
namespace: istio-test
spec:
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
注意事项:
- spec.http.route.destination.host尽量使用FQDN(全限定域名)
- uri匹配时,大小写敏感
- istio的vs的url匹配顺序是从上向下,而不是最长匹配。在生产环境中建议使用一个无条件的规则作为最后规则,确保流量始终会匹配到最少一条规则,防止意外情况的方式
- 当为已存在的host创建第二个及更多的 VirtualService时,istio 会将额外的路由规则合并到host现有配置中,这种合并不保证匹配顺序性,可能会造成与预期匹配效果不一致。所以建议一个host的路由配置写在一个virtualService.yaml文件中
3.3 destinationRule
通过VistualService的 spec.http.route.destination字段,VistualService 与 DestinationRule 形成了绑定关系。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination
namespace: istio-test
spec:
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: Service
metadata:
name: myservice
spec:
ports:
- number: 8080
name: rpc
appProtocol: grpc # 第一种:指定该端口提供grpc协议的服务
- number: 80
name: http-web # 第二种:以协议名为前缀命名端口,声明80端口提供http协议服务
五、istio常用资源操作和关联关系展示
5.1 创建deployment、service资源
kind: Deployment
apiVersion: apps/v1
metadata:
name: mynginx
namespace: istio-test
labels:
appgroup: ''
version: v1
spec:
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: v1
kind: Service
metadata:
name: nginx
namespace: istio-test
labels:
app: mynginx
version: v1
spec:
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资源后

Istio与Kubernetes:资源管理与协同解析的更多相关文章
- Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现
前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...
- istio in kubernetes (二) -- 部署篇
在 Kubernetes 部署 Istio [demo演示] 可参考官方文档(https://istio.io/latest/zh/docs/setup/install/) ,以部署1.7.4版本作为 ...
- kubernetes更改coredns增加解析
kubernetes更改coredns增加解析 k8s中coredns可以为全集群提供dns解析功能, 所以如果我们要手动增加dns解析, 只需在coredns中增加dns解析对即可 1. 编辑cor ...
- Kubernetes资源管理
目录贴:Kubernetes学习系列 1.资源模型 虛拟化技术是云计算平台的基础,其目标是对计算资源进行整合或划分,这是云计算管理平台中的关键技术.虚拟化技术为云计算管理乎台的资源管理提供了资源调配上 ...
- kubernetes之configmap,深度解析mountPath,subPath,key,path的关系和作用
参考:https://www.cnblogs.com/breezey/p/6582082.html 我们知道,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库, ...
- 基于 Istio 与 Kubernetes 对应用进行灰度发布与 Tracing
灰度发布,是指在黑与白之间,能够平滑过渡的一种发布方式.通俗来说,即让产品的迭代能够按照不同的灰度策略对新版本进行线上环境的测试,灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以对新版本进行测试 ...
- istio in kubernetes (一) --原理篇
背景 微服务是什么 • 服务之间有轻量级的通讯机制,通常为REST API • 去中心化的管理机制 • 每个服务可以使用不同的编程语言实现,使用不同的数据存储技术 • 应用按业务拆分成服务,一个大型应 ...
- Kubernetes—资源管理
3. 资源管理 3.1 资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes. kubernetes的本质上就是一个集群系统,用户可以在集群中 ...
- kubernetes多节点部署解析
注:以下操作均基于centos7系统. 安装ansible ansilbe可以通过yum或者pip安装,由于kubernetes-ansible用到了密码,故而还需要安装sshpass: pip in ...
- Kubernetes Controller执行框架解析
毫无疑问,声明式API以及Controller机制是Kubernetes设计理念的基础.Controller不断从API Server同步资源对象的期望状态并且在资源对象的期望状态和实际运行状态之间进 ...
随机推荐
- solidity入门
1. solidity 简介 Solidity(中文名称:Solidity 语言)是一种面向智能合约(Smart Contracts)的高级编程语言,最初由以太坊(Ethereum)的团队开发并用于以 ...
- 多源异构数据信息的融合方式0 - Dempster/Shafer 证据理论(D-S证据理论)
Dempster/Shafer 证据理论(D-S证据理论)的大体内容如下: 一.简介: 在理论中,由互不相容的基本命题组成的完备集合Θ称为识别框架,表示对于某一问题的所有可能答案,但是只有一个答案是正 ...
- orale命令6 rman备份
RMAN:使用ramn进行备份和恢复,rman不依赖系统操作命令,在数据块级别做备份.块级别备份,能只备份变化后的块,实现增量备份.而且不会备份空的块.好处:1.能实现增量备份2.只备份有数据的块,不 ...
- Python拆分列中文和 字符
需求描述:我们日常实际的工作中经常需要把一列数据按中文和 数字或者字母单独拆分出来 导入所需的库: import pandas as pd 定义函数 extract_characters,该函数接受三 ...
- VM虚拟机在添加虚拟硬盘后无法boot的解决方案
今天本想自己配一个mini Linux系统,但是在给系统增加一块硬盘的时候,发现出现以下问题 CentOS打不开(其实经过很久也能进去,但是指令全部失效) 由于不知道原因最后就重装了系统,奇怪的是,重 ...
- node 实现上传 和 下载 文件接口 简易版
var express = require('express');var fs = require('fs');var path = require('path');var multipart = r ...
- NLP技术如何为搜索引擎赋能
在全球化时代,搜索引擎不仅需要为用户提供准确的信息,还需理解多种语言和方言.本文详细探讨了搜索引擎如何通过NLP技术处理多语言和方言,确保为不同地区和文化的用户提供高质量的搜索结果,同时提供了基于Py ...
- 【Windows 开发环境配置】NVIDIA 篇
CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包,这里以11.7为例. 打开安装包,在安装选项选择自定义模式,点击下一步. 在自定义安装选项中,仅选择CUDA组件(其中Ns ...
- 一、Linux发展史
一.Linux发展史及红帽认证 红帽授权培训合作伙伴 木兰宽松许可证 1. Linux系统发展史 1. Unix发展历程 上世纪六十年代贝尔实验室(Bell).麻省理工学院(MIT)以及通用电气(GE ...
- go并发 - goroutine
概述 Go并发模型独树一帜,简洁.高效.Go语言最小执行单位称为协程(goroutine),运行时可以创建成千万上个协程,这在Java.C等线程模型中是不可想象的,并发模型是Go的招牌能力之一.很多文 ...