译者 | 布加迪
审校 | 孙淑娟
虽然Istio 1.15没有太多新的功能,但Istio 1.16做了许多改进。值得关注的,由于支持从N-2到N的版本跳过升级,Istio项目一直致力于对偶数版本号发布更多的改进,奇数版本号充当稳定版本号,以便人们可以轻松实现从N-2到N的版本跳过升级。

这篇博文重点介绍让人特别兴奋的Istio 1.16的几项新功能和改进。
我们在KubeCon US 2022大会上发现Istio环境网格(ambient mesh)大受追捧,用户非常喜欢2层架构以促进增量采用,在环境网格中添加工作负载异常简单。环境网格还不是Istio 1.16的一部分,社区成立了一个专门的工作组,将环境网格推向Istio master视作重中之重。对于Istio 1.16或更新版本而言,社区通过在sidecar和ingress网关中添加HBONE支持,为sidecar与环境网格中的pod实现互操作铺平了道路。
HBONE是一种用于服务间网格通信的新的隧道机制。这不是应用程序所有者直接看到或使用的东西,因为它被设计成在代理之间幕后透明地操作(sidecar <-> ztunnel <-> waypoint proxy <-> gateway)。考虑到ztunnel和waypoint代理只能通过HBONE发送和接收流量,sidecar若要与它们进行互操作,sidecar就要知道目的地是否可以处理HBONE流量,并且只有在目的地能够理解HBONE流量的情况下才可以通过HBONE发送流量(见图1,App C到App A)。如果目的地不支持HBONE,sidecar继续如往常一样发送经典的相互TLS流量(见图1,App C到App B)。

图1
同样,sidecar从ztunnel或waypoint代理接收流量时知道如何终止HBONE流量(见图2)。

图2
为了探究这项功能,可以使用您偏爱的Istio安装程序,安装ambient配置文件即可,比如:

图3
注意这个配置文件只为sidecar启用HBONE,真正的环境模式很快就会实施。在部署注入sidecar的简单的sleep应用程序后,您会注意到network .istio.io /tunnel: HTTP标签被添加到sleep,类似于security.istio.io/tlsMode: istio标签。这个新的隧道标签使Istio能够知道代理是否支持HBONE。

图4
鉴于这项功能是实验性的,默认情况下被禁用,因此不建议您在生产环境中使用它。
听取Solol.io大规模客户的意见后,去年我们为Istio上游贡献了发现选择器(discovery selector),以便用户可以动态地限制作为网格一部分的命名空间集。我们对社区广泛采用发现选择器感到非常兴奋,这使得Istio 1.16中的发现选择器得到了改进!
您不仅可以使用发现选择器来配置Kubernetes资源,借助1.16,还可以使用发现选择器来配置Istio自定义资源,比如Gateway、VirtualService和DestinationRule等。此外,您可以利用发现选择器来配置Istio控制平面。如果您想为特定的控制平面指定允许的网格命名空间,或者基于一个或多个命名空间的边界为网格启用软性多租户,这些改进非常有用。这一改进的最大好处是,对于开发人员来说,API方面没有变化,您可以像1.16之前那样继续使用发现选择器。
要启用这项功能,您可以启用发现选择器以及ENABLE_ENHANCED_RESOURCE_SCOPING环境变量。下列YAML含有一个使用环境配置文件启用这项功能的示例:
# The ambient profile has ambient mesh enabled
# Note: currently this only enables HBONE for sidecars, as the full ambient mode is not yet implemented.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
discoverySelectors:
- matchLabels:
istio-discovery: enabled
defaultConfig:
proxyMetadata:
ISTIO_META_ENABLE_HBONE: "true"
values:
pilot:
env:
PILOT_ENABLE_INBOUND_PASSTHROUGH: "false"
PILOT_ENABLE_HBONE: "true"
ENABLE_ENHANCED_RESOURCE_SCOPING: "true"用istio-discovery=enabled标记default和foo命名空间,显示sleep部署的路由配置:

将review虚拟服务运用于foo和bar命名空间,然后显示sleep部署的路由。您会注意到reviews.foo虚拟服务在路由列表中,但reviews.bar不在列表中。

默认情况下,Istio为Kubernetes集群中的每个命名空间创建istio -ca-root-cert配置映射,不管该命名空间在网格中是否有任何服务。1.16中发现选择器得到改进后,您可以选择创建配置映射的命名空间。如果显示每个命名空间的配置映射,您会注意到istio-ca-root-cert配置映射是为default和foo命名空间创建的,而不是为bar命名空间创建的:

不仅可以为Kubernetes服务选择哪些命名空间是网格的一部分,还可以为Istio资源选择哪些命名空间是网格的一部分,这不是很好吗?
Istio 1.16的一个关键变化是Gateway API选项卡被添加到Istio现有API的旁边,用于一些流量管理任务,这是Istio采用Kubernetes Gateway API的结果。当您浏览流量管理任务时,会看到一些任务只能通过Istio API来完成,比如请求超时或故障注入。为什么?因为它们还不能被转换成Gateway API。由于服务网格社区正致力于GAMMA项目,试图跨Istio、Linkerd、Consul connect、Kuma和OSM为网格操作人员和开发人员实现网格API标准化,我们预计需要一段时间才能使网格API实现标准化,同时继续使每个项目能够创新,领先于通用API。作为GAMMA项目的贡献者之一,我们对GAMMA以及基于角色的项目中立网格API作为GAMMA项目的一部分的前景方向感到兴奋。
Istio社区采用由Solo.io发起的Wasm OCI映像规范是好事。最近规范方面有了改进,可支持多个层。比如说,您可以根据业务需求轻松添加另一层来标记镜像。另一个令人兴奋的变化是,在WasmPlugin资源中引入了traffic selector(流量选择器),这使用户能够精确地选择WasmPlugin资源应该运用于哪路流量。您可能想知道:“这与通常面向服务生产者的工作负载选择器有什么不同?”不指定任何流量选择器配置,WasmPlugin用于通过工作负载选择器选择的目标工作负载,不管服务有哪些侦听器。流量选择器配置使您能够根据某个特定端口来微调选择器,并指定工作负载模式。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: httpbin-rust-test
namespace: httpbin
spec:
selector:
matchLabels:
app: httpbin
# Define traffic selector match conditions
# All conditions must evaluate to true for the plugin to be applied
match:
# Define the workload mode, valid options are: SERVER, CLIENT, CLIENT_AND_SERVER
- mode: SERVER
# Define port numbers to match. If not specified, all ports are matched
- ports:
- number: 80
url: oci://docker.io/dhawton/wasm-rust-test:v1有了上述WasmPlugin资源面向httpbin工作负载的端口80服务,我们可以将简单的Wasm过滤器部署到httpbin的Envoy代理中,该代理从事非常基本的日志任务,等待HTTP请求进入。发现路径匹配后,插件将在暂停Envoy过滤器的其余部分之前返回418状态码和ASCII字符组成的ASCII字符。下列是Wasm过滤器的逻辑:
match self.get_http_request_header(":path") {
Some(path) if path == "/get" => {
info!("on_http_request_headers: {} - /get intercepted", self.context_id);
self.send_http_response(
418,
vec![("x-powered-by", "rust"), ("content-type", "text/plain")],
Some(TEAPOT_ASCII),
);
Action::Pause
}
_ => Action::Continue,
}部署WasmPlugin配置后,我们可以看到端口80上httpbin的/get端点的curl被Wasm过滤器拦截,无需重新启动httpbin部署。

我们如何才能演示选择性匹配?我们将运用下列配置(将端口号80改成81)来演示Wasm过滤器未被运用于httpbin流量:
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: httpbin-rust-test
namespace: httpbin
spec:
selector:
matchLabels:
app: httpbin
match:
- ports:
- number: 81
url: oci://docker.io/dhawton/wasm-rust-test:v1如果我们运行同样的curl,应该会看到上面的WasmPlugin资源并没有影响端口80上的httpbin工作负载,因此我们得到httpbin的预期响应。

Istio 1.16是社区发布的另一个令人兴奋的版本。还有其他许多的改进在本文没有介绍,请参阅版本变更说明以查看所有其他改进,包括:支持MAGLEV负载均衡算法、支持使用OpenTelemetry跟踪提供程序以及Telemetry API以及新的远程配置文件等。
原文标题:Istio 1.16 is out, what does it mean for ambient mesh and you?,作者:Lin Sun和Daniel Hawton
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?