K8s 与 Service Mesh(服务与流量治理)
K8s相关资料可参考链接: Kubernetes简介
1 什么是Service Mesh
Service Mesh 是一个专门处理服务通讯的基础设施层。它的职责是在由云原生应用组成服务的复杂拓扑结构下进行可靠的请求传送。在实践中,它是一组和应用服务部署在一起的轻量级的网络代理,并且对应用服务透明。
以上这段话有四个关键点:
- 本质:基础设施层。
- 功能:请求分发。
- 部署形式:网络代理。
- 特点:透明。
下图是Service Mesh整体架构图。整个系统分为控制平面(上面深蓝色框)和数据平面(下面所有的虚线框)。
图中每个虚线框代表一个节点(相当于kubernetes中的worker node),绿色的APP是在节点中运行的各类应用程序,浅蓝色的Sidecar相当于是一个网络通信的代理,每个节点需要与外界通信,都是通过这个代理完成的。控制平面通过xDS协议把配置信息下发给Sidecar,这些配置信息包括节点的路由信息,需要监听的端口等。
2 Istio
Service Mesh是一种理念,而Istio则是这种理念的一个具体实现方案。
Istio 提供了一个完整的解决方案,可以以统一的方式去管理和监测你的微服务应用。同时,它还具有管理流量、实施访问策略、收集数据等方面的能力,而所有的这些都对应用透明,几乎不需要修改业务代码就能实现。
下图是Istio的架构图,也分为控制平面和数据平面,控制平面实现配置的下发,安全认证,流量监控等功能。数据平面是承载服务的主题,即Kubernetes中的worker node。图中的Proxy即是Service Mesh中的Sidecar,负责节点流量的转发。在Istio官方使用的Proxy是Envoy。而MOSN是阿里开发的一个开源的Proxy。(MOSN的相关知识可参考官网文档https://mosn.io/docs/)
Istio 流量管理的核心组件就是 Pilot。Pilot 主要功能就是管理和配置部署在特定 Istio 服务网格中的所有 sidecar 代理实例。它管理 sidecar 代理之间的路由流量规则,并配置故障恢复功能,如超时、重试和熔断。
当在Kubernetes中使用Istio的时候,其作用主要有如下几点:
- 监控服务注册中心(如 Kubernetes)的服务注册情况。在 Kubernetes 环境下,会监控 service、endpoint、pod、node 等资源信息。
- 监控 Istio 控制面信息变化,在 Kubernetes 环境下,会监控包括 RouteRule、 VirtualService、Gateway、EgressRule、ServiceEntry 等以 Kubernetes CRD(K8s自定义资源) 形式存在的 Istio 控制面配置信息。
- 将上述两类信息合并组合为 sidecar 可以理解的(遵循 Envoy data plane api 的)配置信息,并将这些信息以 gRPC 协议提供给 sidecar。
由以上几点看出,pilot起到了连接Kubernetes和数据平面的作用,它将由kubernetes产生的配置信息转化成数据平面可以识别的格式然后下发给数据平面。
3 资源
Service、Gateway、Virtualservice、destinationrule 资源之间的关系 如下图
3.1 Service
metadata.name:给服务命名,该名称在命名空间内唯一,用于标识该服务。
spec.ports.name:给服务使用的端口命名。
spec.ports.port:外部访问该服务时使用的端口。
spec.ports.protocol:该服务的协议。
spec.ports.targetPort:提供服务的pod实际使用的端口。
spec.selector:选择具有指定标签的pod作为提供服务的实体。
spec.type:类型被指定为ClusterIP后,系统会自动为该服务分配一个IP地址,该IP地址可用于对该服务进行访问,该IP地址是一个虚拟的IP,没有承载实体,也就是说该IP不能ping通,只有结合该服务的端口使用。
apiVersion: v1
kind: Service
metadata:
labels:
XXXX:XXX
name: test-cdn-svc-cm-agent-1
namespace: test
spec:
ports:
- name: test-agent
port: 3400
protocol: TCP
targetPort: 3400
selector:
XXXX:XXX
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
3.2 Gateway
Gateway相关字段说明:
spec.selector:指定执行该gateway定义的路由规则的pod。即该gateway定义的规则会下发到具有这些标签的pod上去。
spec.servers.hosts:gateway指向的服务的域名,*号表示任意域名都满足要求。
spec.servers.port:指定gateway需要监听的端口名称,端口号,协议。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
labels:
XXX: XXX
name: test-http-gateway-1
namespace: test-node
spec:
selector:
XXXX:XXX
servers:
- hosts:
- '*'
port:
name: test1httpListener
number: 13401
protocol: HTTP
3.3 Virtualservice
Virtualservice相关字段说明:
spec.gateways:virtualservice必须关联gateway来使用,此处指定关联的gateway。(Istio官方规定virtualservice可关联gateway使用,也可以不关联gateway)
spec.http:是一个具体的路由项,这里的意识是当前缀匹配到“/”时(即任意前缀),指定路由目的地址为test-1-http.test-node.svc.cluster.local,端口为3401。timeout表示连接超时时间。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
labels:
XXX:XXX
name: test-cdn-http-vs-1
namespace: test-node
spec:
gateways:
- test-http-gateway-1
hosts:
- '*'
http:
- match:
- uri:
prefix: /
route:
- destination:
host: test-1-http.test-node.svc.cluster.local
port:
number: 3401
timeout: 4s
关于gateway和virtualservice的说明:
gateway和virtualservice都是在Istio中定义的资源,Kubernetes中没有这个资源。
从它们的关系图中可知,gateway是把流量引进来,然后流量具体要交个哪个服务处理是由virtualservice决定的
3.4 DestinationRule
destinationrule可以将流量进行更加细化的区分,比如可以根据同一个服务的不同版本来决定流量的转发。destinationrule可以用于实现金丝雀发布,灰度发布等功能,具体字段如下:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
# 含义同VirtualService中destination的host字段一致。
host: ratings.prod.svc.cluster.local
# 流量策略,包括负载均衡、连接池策略、异常点检查等
trafficPolicy:
# 负载均衡策略,支持随机负载均衡 /按权重负载均衡 /最少请求负载均衡 / hash轮训等
loadBalancer:
simple: CONSISTENT_DST
#simple: ROUND_ROBIN
#simple: LEAST_CONN
#simple: RANDOM
#simple: PASSTHROUGH
# 连接池策略
connectionPool:
# tcp连接池设置
tcp:
maxConnections: 100
connectTimeout: 30ms
tcpKeepalive:
time: 7200s
interval: 75s
http:
http2MaxRequests: 1000
maxRequestsPerConnection: 10
# 异常点检查
outlierDetection:
consecutiveErrors: 7
interval: 5m
baseEjectionTime: 15m
# tls设置
tls:
mode: MUTUAL
clientCertificate: /etc/certs/myclientcert.pem
privateKey: /etc/certs/client_private_key.pem
caCertificates: /etc/certs/rootcacerts.pem
# 服务端点集合
subsets:
# subset名称可以用于路由规则中的流量拆分,与virtualService的subset的引用
- name: testversion
# 使用标签对服务注册表中的服务端点进行筛选
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
https://martinfowler.com/articles/microservices.html
https://www.servicemesher.com/istio-handbook/
https://kubernetes.io/docs/home/
https://istio.io/latest/docs/
K8s 与 Service Mesh(服务与流量治理)的更多相关文章
- Service Mesh服务网格:是什么和为什么
Service Mesh服务网格:是什么和为什么 - 好雨云帮 CSDN 博客 - CSDN博客 https://blog.csdn.net/zyqduron/article/details/8043 ...
- Service Mesh服务网格新生代--Istio(转)
万字解读:Service Mesh服务网格新生代--Istio 官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...
- Service Mesh服务网格新生代--Istio
原文: 数人云|万字解读:Service Mesh服务网格新生代--Istio 参考: istio 简介 Istio是啥?一文带你彻底了解! 使用Istio治理微服务入门 Istio 流量管理 ist ...
- Service Mesh服务网格清单
Service Mesh服务网格清单 Istio Istio官网 Istio中文官网 Istio开源 无需太多介绍Service Mesh明日之星,扛把子,截止2019.11还有太多问题没解决 复杂性 ...
- Service Mesh服务网格新生代——Istio
Istio 是什么?使用云平台可以为组织提供丰富的好处.然而,不可否认的是,采用云可能会给 DevOps 团队带来压力.开发人员必须使用微服务已满足应用的可移植性,同时运营商管理了极其庞大的混合和多云 ...
- Service Mesh服务网格之Linkerd架构
今天详细介绍一下Linkerd的架构. 控制平面 Linkerd控制平面是一组在专用Kubernetes命名空间中运行的服务(在Linked默认情况下).这些服务完成各种事情——聚合遥测数据.提供面向 ...
- Linkerd Service Mesh 服务配置文件规范
服务配置文件 为 Linkerd 提供有关服务的附加信息. 以下是可以使用服务配置文件完成的所有操作的参考. 系列 中文手册(https://linkerd.hacker-linner.com) Sp ...
- 第八章 跨语言服务治理方案 Service Mesh
8.1 Service Mesh 概述 新兴的下一代微服务架构,被称为下一代微服务,同时也是云原生技术栈的代表技术之一. 8.1.1 Service Mesh的由来 从2016年到2018年,serv ...
- Qcon2017实录|Service Mesh:下一代微服务
https://zhuanlan.zhihu.com/p/30292372 数人云11月Meetup报名开启,看中西方大神如何论道云原生与微服务!本文作者敖小剑老师将在本次Meetup上继续分享Ser ...
- Service Mesh架构的持续演进 单体模块化 SOA 微服务 Service Mesh
架构不止-严选Service Mesh架构的持续演进 网易严选 王育松 严选技术团队 2019-11-25 前言同严选的业务一样,在下层承载它的IT系统架构一样要生存.呼吸.增长和发展,否则过时的.僵 ...
随机推荐
- 用swift开发framework时采用OC混编的解决方案
随着swift ABI的稳定,越来越多的开发者开始使用swift语言开发项目,但是由于大部分工具库也还是使用OC写的,因此我们不得不需要在项目中采用swift与oc混编. 在开发app项目时,swif ...
- go-使用 vscore 调试 go 语言
{ // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linki ...
- react hooks组件父组件调用子组件方法
函数组件父组件调用子组件方法需要使用 useImperativeHandle 和 forwardRef 两个方法 1.子组件 2.父组件 注意:一定要使用ref来接从子组件传过来的实例值,用其他的在函 ...
- java使用apache-commons-lang3生成随机字符串(可自定义规则)
在日常开发中,我们经常会遇到生成随机字符串的需求.可能是大小写字母+数字,也可能是其他各种字符.作为一个常用功能,我们完全没必要自己实现,有很多优质的类库已经做的很完善了.本文介绍的就是apache- ...
- 230219 Business 1-30
1: Packing for a Business TripWhat should I bring on this business trip?Haven't you been on a busine ...
- 已知内存BUF单元开始的区域中存放有一组无符号字节数据,要求将这些数据按从小到大的顺序排列,排序后的数据依然放在原来的存储区中。
设计要求: 已知内存BUF单元开始的区域中存放有一组无符号字节数据,要求将这些数据按从小到大的顺序排列,排序后的数据依然放在原来的存储区中.(10分) #make_BIN# BUF DB 22,21, ...
- CV-部署芯片接续-CV全流程部署-TF版本
CV-部署芯片接续-CV全流程部署-TF版本 1 单个CNN算子 import cv2 import numpy as np import tensorflow as tf import os fro ...
- IBM服务器的2种IMM和1种raid管理方式
IMM两种进入方式和Raid管理软件 前面板IMM管理接口: 用网线连接服务器前置面板的管理接口到其他 PC 或笔记本,然后 PC 或笔记本的 IP 地址配置为 192.168.70.0/24 ...
- 根据pid定时监控CPU使用率和内存使用率并输出到文件 (windows和linux跨平台可用)
有时服务器运维中,某些程序员的应用发布后完全不管CPU和内存的使用率,只觉得代码能运行就行了,这样给我们运维人员经常造成困扰: 比如我在zabbix平台中就经常监测到凌晨1~3~5点时候突然CPU飙升 ...
- springboot返回前端对象null转为空字符串
1 2 import com.fasterxml.jackson.core.JsonGenerator; 3 import com.fasterxml.jackson.core.JsonProcess ...