漫谈腾讯微服务平台 TSF Mesh 统一容器和虚拟机之路
发布于 2021-04-07 21:26
前言
应用部署和Sidecar注入 流量劫持 服务注册与发现
应用部署和 Sidecar 注入
手工注入通过手工执行 istioctl kube-inject 来重新构造应用的 CRD yaml 自动注入通过 K8s 的 mutable webhook 回调 istio-sidecar-injector 服务来重新构造应用的 CRD yaml
由于 TSF Mesh 需要同时支持容器和虚拟机环境,则首先需要解决虚拟机部署的问题,要实现等同 K8s 的部署能力,需要解决以下几个问题:
资源和配置管理,如 Istio 集群信息、配置信息等 对应于容器的镜像,虚拟机就是程序包,那就涉及到包管理 虚拟机应用生命周期的管理 虚拟机 Sidecar 注入
tsf-repo,程序包仓库管理,存储应用程序包及相关依赖 tsf-master,虚拟机节点管理 master,发送部署/下线/启动/停止等任务给 tsf-agent tsf-agent,虚拟机节点管理 agent,部署在应用机器上,负责初始化机器环境、执行应用部署/下线/启动/停止等任务
流量劫持
initContainers:
args:
-p
"15001"
-u
"1337"
-m
REDIRECT
-i
'*'
-x
""
-b
9080,
-d
""
image: istio/istio-release-proxy_init:1.0.1
imagePullPolicy: IfNotPresent
name: istio-init
resources: {}
securityContext:
capabilities:
add:
NET_ADMIN
privileged: true
...
FROM ubuntu:xenial
RUN apt-get update && apt-get install -y \
iproute2 \
iptables \
&& rm -rf /var/lib/apt/lists/*
ADD istio-iptables.sh /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/istio-iptables.sh"]
local/bin/istio-iptables.sh -p 15001 -u 1337 -m REDIRECT -i '*' -x "" -b 9080 -d "" /usr/
总结下来,Istio 是通过 init 容器完成了流量劫持到 Sidecar 的初始化工作。
TSF Mesh 同样采用 iptables 方式,不过要兼顾虚拟机平台,需要解决两个主要问题:
虚拟机下如何执行 iptables 应用劫持策略 虚拟机下如何劫持流量,不能劫持虚拟机整个网络空间的流量
对于 Inbound 流量,只劫持到部署应用的端口,这个原生 Istio 已经做到,无需改造 对于 Outbound 流量,只劫持注册中心已注册服务的流量
其实我们的方案和 K8s 的 kube-DNS+kube-proxy 的服务发现机制类似,TSF Mesh 在数据平面引入了一个 mesh-dns 模块,通过连接 pilot-discovery 同步获取注册中心的服务变更来更新本地的 DNS cache,对于来自注册中心的服务会被解析到一个特定的 IP,然后在 iptables 策略中把目的地址到这个特定 IP 的流量重定向 envoy,当然,还需要劫持 DNS 53 端口的流量,先把 DNS 请求引到 mesh-dns,可以看下 iptables nat 表中完整的规则内容:
pilot-discovery 扩展一个 ServiceInfos 的 grpc 服务,提供注册服务变更同步接口 pilot-discovery 早期的 consul controller 实现是,定时通过 Consul 的 Rest API 获取服务数据并和上一次的查询结果进行对比,如果数据发生了变化则通知 Pilot discovery 进行更新,这里我们进行了优化,采用 Consul 的 watch 机制来代替轮询(下面服务注册与发现中也有提到),并在 ServiceInfos 服务初始化时向 consul controller 注册了服务变更的 event 通知 ServiceInfos 服务在 mesh-dns 请求第一次到来时同步全量的服务注册表,之后则根据服务的变更情况增量同步
DNS 服务基于 github.com/miekg/dns 实现(一个非常轻量级的 DNS 库) 和 pilot-discovery 保持注册服务列表的同步,mesh-dns 启动时进行全量同步,运行时进行增量同步 处理 DNS 请求时,先检查 Domain 是否在注册服务列表里,如果在则返回一个特定的 IP(可配置),否则请求本地配置的域名服务进行解析
类似对 envoy 的管理,pilot-agent 扩展了 mesh-dns 的支持,负责了 mesh-dns 启动配置组装、启动 mesh-dns 及 mesh-dns 生命周期的管理
服务注册与发现
Istio 服务注册:Istio 架构中本身不提供服务注册的能力,而是依赖于各种底层平台,底层平台是具体服务信息的生产者和维护者,如 Kubernetes 在 POD 部署时会保存 Service 以及对应的 Pod 实例信息。 Istio服务发现:Istio 是服务信息的消费者,服务发现是通过 Pilot 组件实现的,Pilot 组件负责维护网格中的标准服务模型,该标准服务模型独立于各种底层平台,Pilot 组件通过适配器和各底层平台对接,以使用底层平台中的服务数据填充此标准模型,再通过标准 xDS 协议(CDS 集群信息和 EDS 实例信息)同步给 envoy。
注册中心如何选择 服务如何注册 实例健康状态如何维护
apiVersion: v1
kind: Application
spec:
services:
name: user # 服务名
ports:
targetPort: 8091 # 服务监听端口
protocol: http # 服务协议类型
healthCheck:
path: /health # 健康检查 URL
envoy 在收到 pilot-discovery 的 HealthCheckSpecifier 回应后,会根据回应中的参数如 check 间隔、check 的实例(这里就是本地服务实例)、check 的 Path(这里就是 spec.yaml 中的 healthCheck path)等异步执行本地实例的 Health Check,根据 check 的结果更新本地实例的健康状态; HDS 除了支持 HealthCheckRequest 请求,还支持 EndpointHealthResponse 请求,envoy 根据当前实例的健康状态通过 EndpointHealthResponse 周期性同步给 pilot-discovery; TSF Mesh 完全扩展了 Pilot-discovery 的 HDS 服务,支持对 EndpointHealthResponse 请求的处理,根据请求中实例的健康状态进行 TTL 上报; TSF Mesh 再次扩展了 Pilot-discovery,在 Consul Apater 中增加了 ReportHealthCheckInfo 接口以支持服务治理的 TTL 上报
总结
参考链接:
- ServiceMesher 社区:https://www.servicemesher.com/ - TSF Mesh 微服务平台:https://cloud.tencent.com/product/tsf-mesh - Istio 服务注册插件机制代码解析:https://www.servicemesher.com/blog/istio-pilot-service-registry-code-analysis/
Spring Native Beta 正式发布,原生更香! 软件架构设计分层模型和构图思考 传统架构 vs 云原生架构,谈谈为什么我们需要云原生架构? MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧 微服务架构下的核心话题 (三):微服务架构的技术选型
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材