LabHub
学习 学习路径 课程

Istio 服务网格

边车 — 不改代码就改变网络的办法

在 LabHub 中继续学习

一句话总结

服务消息不是新的网络,而是在每个平板电脑上安装一台代理,并在中央设置该代理的结构

流程图: 在每个平板电脑上安装一台代理,并在中央设置该代理的结构 · 把共同的兴趣点从应用程序流程中拿出来,让同一进程中的代理来代替处理。 · 控制平面(istiod) · 数据平面(每个端点的Envoy)

为什么需要这个?

创建了大约十个麦克服务后,无论哪个团队都会重复出现相同的代码。重试、超时、电路断路器、TLS证书加载、对方验证、请求日志、跟踪头传播。如果服务分散在Java、Go、Python、Node上,就需要实现这四个列表,四个实现的行为有微妙的差异。要更改一个超时默认值,需要在四个存储库上发布PR,并部署四次。

消息的想法很简单。**把共同的兴趣点从应用程序流程中拿出来,让同一进程中的代理来代替处理。**应用程序仍然http://reviews:9080虽然发送了平文请求,但实际上将该请求传递给对方是代理。因此,打开mTLS不是应用程序部署,而是应用一个设置资源。

怎么行动

Istio分为两层。控制平面(istiod)数据平面(每个端点的Envoy)。istiod是将Pilot、Citadel、Galley合并为1.5的单二进制,1.8中完全移除了拦截请求路径的Mixer。也就是说,**在处理一个请求时,不会向控制平面询问。**即使istiod死亡,已经接受设置的Envoy也会继续以最后设置发送流量。

设置通过名为xDS的gRPC流进行。

API 运送什么 Istio 侧输入
LDS 监听器(端口,协议) 端口名称,Gateway
RDS HTTP 路由规则 VirtualService
CDS 上游群集 DestinationRule
EDS 集群的实际端点 Kubernetes Endpoints
SDS TLS证书和密钥 istiod CA

Istio将这一切都合并成一个名为ADS的流发送出去。这是为了防止端点比群集定义先到达,从而瞬间破坏设置。

注入由容器管理的MutatingAdmissionWebhook进行。在命名空间中istio-injection=enabled如果贴有标签,在那个命名空间中帕德生成的瞬间istiod会修改帕德规格,然后将两个容器放在一起。

这里有一个经常发生事故的分店。**标签只有在创建护盾时才有效。**已经漂浮着的护盾不会发生任何事情,所以贴上标签后,必须拉动展开,再重新创建护盾才能进入侧翼卡。“贴上标签了,为什么不进入梅西”的答案有九个。

在现场相遇的样子

**第一,从账单上看侧卡的价格。**每台板大约增加100MB左右的内存和启动时间几秒钟。如果板有100个,就10GB了。所以没有侧卡的情况下,节点单位ztunnel负责L4,命名空间单位waypoint负责L7的Ambient模式出现了,甚至选择完全不同的方向eBPF数据通道(Cilium之类)甚至取消kube-proxy的配置也变得常见。引入消息意味着应该可以回答“支付这个费用买什么”。

**第二,升级是重新启动。**要上传侧卡版本,必须重新创建所有板块。在数千个板块群集中,这需要几个小时的工作,所以消息升级计划中必须包括部署顺序和窗口时间。

第三,istioctl kube-inject是WebHook的线下版。在WebHook生成Pad时,提前在Manifest文件中应用所做的事情,显示结果。在想用GitOps固定注入结果时,以及像现在这样想用眼睛确认注入结果的解剖时使用。

下次实习要做的事情

istioctl manifest generate制作安装文件,检查包含的内容,然后将消息API类型(CRD)注册到群集中。mesh-lab在注入标签,legacy不粘在上面,做对比群。然后在图像工作负载上istioctl kube-inject将容器数量和初始化容器的作用用JSON整理出来。

有两件事需要提前说明。在这个实践环境中,真正的Envoy不会处理流量。Pad会变成Running,但数据包不会流畅,kubectl exec我也没有转发。所以这个课程的评分全部是撰写宣言书。istioctl analyze/validate看静态验证。实际握手和指标通过阅读和测验来处理。判断设置是否正确的眼光也可以通过这种方式充分培养,在实际工作中,一半的思维不是来自数据包,而是来自设置。