Istio 的配置分析

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Istio 的配置分析

目录

Analyzer 的消息格式

istioctl analyze 命令提供了如下消息格式:

<level> [<code>] (<affected-resource>) <message-details>

字段可以展开为:

<resource-kind> <resource-name>.<resource-namespace>

例如:

Error [IST0101] (VirtualService httpbin.default) Referenced gateway not found: "httpbin-gateway-bogus"

<message-details>字段包含关于解决问题的详细信息。当对于集群范围的资源(如namespace)时,会忽略namespace前缀。

ConflictingMeshGatewayVirtualServiceHosts

Message Name ConflictingMeshGatewayVirtualServiceHosts
Message Code IST0109
Description Conflicting hosts on VirtualServices associated with mesh gateway
Level Error

当Istio检测到virtual service资源之间存在重叠导致的冲突时,会出现该消息。例如,定义了多个使用相同的主机名的virtual service,并将其附加到网格网关上,这样就会产生上述错误。注意,Istio支持合并附加到ingress网关的virtual services。

问题解决

可以使用如下动作来解决该问题:

  • 将多个冲突的virtual service合并为一个
  • 将附加到一个网格网关的多个virtual service的主机名配置为唯一的
  • 通过exportTo字段将资源指定到某个指定的命名空间中

举例

例如,team1命名空间中的 productpage virtual service 与team2命名空间中的custom virtual service因为同时设置了如下条件导致了冲突:

  • 都附加到了默认的mesh网关上(没有指定用户网关)
  • 定义了相同的host productpage.default.svc.cluster.local
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
namespace: team-1
spec:
hosts:
- productpage.default.svc.cluster.local
http:
- route:
- destination:
host: productpage
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: custom
namespace: team-2
spec:
hosts:
- productpage.default.svc.cluster.local
http:
- route:
- destination:
host: productpage.team-2.svc.cluster.local
---

可以通过设置exportTo字段来解决该问题,这样,virtual service的范围就限制于其所在的命名空间。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
namespace: team-1
spec:
exportTo:
- "." #当前命名空间
hosts:
- productpage.default.svc.cluster.local
http:
- route:
- destination:
host: productpage
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: custom
namespace: team-2
spec:
exportTo:
- "." #当前命名空间
hosts:
- productpage.default.svc.cluster.local
http:
- route:
- destination:
host: productpage.team-2.svc.cluster.local
---

ConflictingSidecarWorkloadSelectors

Message Name ConflictingSidecarWorkloadSelectors
Message Code IST0110
Description A Sidecar resource selects the same workloads as another Sidecar resource
Level Error

当一个命名空间中的多个sidecar选择相同的负载实例时会出现该消息,可能导致不可预知的行为。更多信息参见Sidecar资源。

为了解决该问题,需要一个命名空间中的Sidecar负载选择器(workloadSelector)选择的负载实例不会出现重叠。

GatewayPortNotOnWorkload

Message Name GatewayPortNotOnWorkload
Message Code IST0104
Description Unhandled gateway port
Level Warning

当一个网关(通常是istio-ingressgateway)提供的端口并不在网关选择的kubernetes service负载上时会出现该消息。

例如,Istio的配置包含如下值:

# Gateway with bogus port
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: httpbin-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
- port:
number: 8004
name: http2
protocol: HTTP
hosts:
- "*"

在上面例子中会出现GatewayPortNotOnWorkload消息,因为一个默认的IngressGateway仅会打开端口 80, 443, 31400, 和15443,并不包括8004。使用istioctl analyze分析的结果如下:

# istioctl analyze
Warn [IST0104] (Gateway httpbin-gateway.default) The gateway refers to a port that is not exposed on the workload (pod selector istio=ingressgateway; port 8004)
Info [IST0118] (Service mutatepodimages.default) Port name  (port: 443, targetPort: 8443) doesn't follow the naming convention of Istio port.
Error: Analyzers found issues when analyzing namespace: default.

为了解决该问题,可以修改网关的配置,使用一个有效的负载端口,并重新部署即可。

InternalError

Message Name InternalError
Message Code IST0001
Description There was an internal error in the toolchain. This is almost always a bug in the implementation.
Level Error

极有可能是因为Istio的内部错误造成的。可以参见Istio的issue页面来了解会提交问题。

IstioProxyImageMismatch

Message Name IstioProxyImageMismatch
Message Code IST0105
Description The image of the Istio proxy running on the pod does not match the image defined in the injection configuration.
Level Warning

当一个Pod出现如下条件时会发生该问题:

  • 启用sidecar自动注入(默认是启用的,除非在安装时禁用)
  • pod运行在一个启用sidecar注入的命名空间中(给命名空间打上标签istio-injection=enabled)
  • 运行在sidecar中的代理版本与自动注入的版本不匹配

该问题通常会发生在更新Istio的控制面之后,在升级Istio后,所有带Istio sidecar运行的负载必须重启来注入新版本的sidecar。

为了解决该问题,可以通过滚动策略来重新部署应用的sidecar。对于kubernetes的deployment:

  1. 如果使用kubernetes 1.15或更高版本,可以运行 kubectl rollout restart <my-deployment>来触发滚动
  2. 或者,可以修改deployment的template字段来强制触发滚动。这通常是通过在模板的pod定义中添加诸如force-redeploy = <current-timestamp>之类的标签来触发deployment滚动的。

JwtFailureDueToInvalidServicePortPrefix

Message Name JwtFailureDueToInvalidServicePortPrefix
Message Code IST0119
Description Authentication policy with JWT targets Service with invalid port specification.
Level Warning

当一个认证策略使用JWT认证时,而目标kubernetes service配置不正确时会出现该消息。正确的kubernetes service要求port使用http|http2|https作为前缀来命名(参见Protocol Selection),并且协议为TCP。默认的协议为TCP。

举例

当集群中存在如下策略时:

apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: secure-httpbin
namespace: default
spec:
targets:
- name: httpbin
origins:
- jwt:
issuer: "testing@secure.istio.io"
jwksUri: "https://raw.githubusercontent.com/istio/istio-1.4/security/tools/jwt/samples/jwks.json"

target的service配置如下:

apiVersion: v1
kind: Service
metadata:
name: httpbin
namespace: default
labels:
app: httpbin
spec:
ports:
- name: svc-8080
port: 8080
targetPort: 80
protocol: TCP
selector:
app: httpbin

在上面例子中,port svc-8080并没有遵守语法: name: <http|https|http2>[-<suffix>]。将会接收到如下消息:

Warn [IST0119] (Policy secure-httpbin.default) Authentication policy with JWT targets Service with invalid port specification (port: 8080, name: svc-8080, protocol: TCP, targetPort: 80).

JWT认证仅支持http,https或http2,修改Service 端口名,使其遵守 <http|https|http2>[-<suffix>]即可。

MisplacedAnnotation

Message Name MisplacedAnnotation
Message Code IST0107
Description An Istio annotation is applied to the wrong kind of resource.
Level Warning

当Istio的annotation附加到一个无效的资源或错误的位置上时会出现该消息。例如,如果创建一个deployment,然后将annotation附加到该deployment,而不是pods上时就会出现该错误提示。

将annotation放到正确的位置即可修改该问题。

MTLSPolicyConflict

Message Name MTLSPolicyConflict
Message Code IST0113
Description A DestinationRule and Policy are in conflict with regards to mTLS.
Level Error

当一个destination rule资源和一个策略资源因为mutual TLS冲突时会出现该消息。当两个资源选择的TLS模式不匹配时就会出现这种情况。该冲突意味着,匹配到destination rule的流量将会被拒绝。

该消息已经被废弃,仅在使用alpha认证策略的服务网格中使用。(了解该问题仍然可以避免配置错误)

哪些destination rules和策略与服务相关

为了有效解决mutual TLS的冲突,需要同时了解destination rule和策略是如何影响到一个服务的流量的。考虑一个my-namespace命名空间中的名为my-service的服务。为了确定应用到my-service上的是哪个策略对象,按顺序匹配以下资源:

  1. my-namespace命名空间中的策略资源包含一个target,指定了my-service
  2. my-namespace命名空间中的一个名为default的策略资源不包含一个target,意味着该策略适用于整个命名空间。
  3. 名为default的网格策略资源

为了确定哪个destination rule应用到到达my-service的流量,首先要知道流量来自哪个命名空间。本例中,假设命名空间为other-namespace。destination rule按照如下方式进行匹配:

  1. other-namespace命名空间中的destination rule会指定一个host来匹配 my-service.my-namespace.svc.cluster.local(可能会通过完整匹配或通配符匹配)。注意exportTo字段,该字段控制了配置资源的可见性,当目标资源与源服务在相同的命名空间时会被忽略(相同命名空间下的服务总是可见的)。
  2. my-namespace命名空间中的destination rule会指定一个host来匹配 my-service.my-namespace.svc.cluster.local(可能会通过完整匹配或通配符匹配)。注意为了进行匹配,exportTo字段必须将该资源指定为公共的(即,值为*或不指定)。
  3. 根命名空间(默认为istio-system)中的destination rule会匹配 my-service.my-namespace.svc.cluster.localMeshConfig 资源中的rootNamespace属性会控制根命名空间。注意为了进行匹配,exportTo字段必须将该资源指定为公共的(即,值为*或不指定)。对rootNamespace的描述如下

The namespace to treat as the administrative root namespace for Istio configuration. When processing a leaf namespace Istio will search for declarations in that namespace first and if none are found it will search in the root namespace. Any matching declaration found in the root namespace is processed as if it were declared in the leaf namespace.

最后,注意在遵循这些规则时,Istio不会应用任何继承概念,它将使用符合指定条件的第一个资源。

问题解决

查看如下输出:

Error [IST0113] (DestinationRule default-rule.istio-system) A DestinationRule
and Policy are in conflict with regards to mTLS for host
myhost.my-namespace.svc.cluster.local:8080. The DestinationRule
"istio-system/default-rule" specifies that mTLS must be true but the Policy
object "my-namespace/my-policy" specifies Plaintext.

可以看出两个资源是冲突的:

  • 策略资源my-namespace/my-policy使用Plaintext来支持mutual TLS模式
  • destination rule资源istio-system/default-rule,指定发送到host myhost.my-namespace.svc.cluster.local:8080的流量需要启用mutual TLS

可以使用下面的方式之一来修复该问题:

  • 修改策略资源my-namespace/my-policy来启用mutual TLS作为认证模式。
  • 修改destination rule istio-system/default-rule,通过移除ISTIO_MUTUAL来禁用mutual TLS。注意default-rule位于istio-system命名空间,即默认的根命名空间中,意味着该destination rule会影响到网格中过的所有其他服务。
  • 在与服务相同的命名空间(my-namespace)中添加一个新的destination rule,该destination rule不指定流量策略mutual TLS。由于该规则位于与服务相同的命名空间中,它不会覆盖全局destination rule istio-system/default-rule.

MultipleSidecarsWithoutWorkloadSelectors

Message Name MultipleSidecarsWithoutWorkloadSelectors
Message Code IST0111
Description More than one sidecar resource in a namespace has no workload selector
Level Error

当一个命名空间中的多个sidecar资源没有定义任何负载选择器时会出现该消息,导致不可预知的行为。更多参见Sidecar

一个命名空间仅允许一个sidecar资源不指定负载选择器。

NamespaceNotInjected

Message Name NamespaceNotInjected
Message Code IST0102
Description A namespace is not enabled for Istio injection.
Level Warning

当一个命名空间没有annotation(如sidecar.istio.io/inject.)指明该命名空间是否需要自动注入sidecar时会出现该提示。错误信息如下:

Warn [IST0102] (Namespace default) The namespace is not enabled for Istio
injection. Run 'kubectl label namespace default istio-injection=enabled' to
enable it, or 'kubectl label namespace default istio-injection=disabled' to
explicitly mark it as not needing injection Error: Analyzer found issues.

可以通过给命名空间打标签来解决该问题,明确声明是否需要启用sidecar自动注入:

$ kubectl label namespace <namespace-name> istio-injection=enabled

强烈建议明确指定sidecar注入行为。忘记注释命名空间是导致错误的常见原因。

SchemaValidationError

Message Name SchemaValidationError
Message Code IST0106
Description The resource has a schema validation error.
Level Error

当Istio的配置没有通过模式验证时会出现该错误。如:

Error [IST0106] (VirtualService ratings-bogus-weight-default.default) Schema validation error: percentage 888 is not in range 0..100

Istio配置为:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings-bogus-weight-default
namespace: default
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
weight: 999
- destination:
host: ratings
subset: v2
weight: 888

本例中可以看到weight元素为一个无效的值。可以通过消息的details字段来检查哪个元素或值没有符合模式要求,然后进行修正。

VirtualServiceDestinationPortSelectorRequired

Message Name VirtualServiceDestinationPortSelectorRequired
Message Code IST0112
Description A VirtualService routes to a service with more than one port exposed, but does not specify which to use.
Level Error

当一个virtual service路由到暴露多个port的服务,且没有指定使用哪个端口时会出现该错误。这种模糊性可能导致不确定的行为。

可以在virtual service Destination中增加port字段来解决该问题。

UnknownAnnotation

Message Name UnknownAnnotation
Message Code IST0108
Description An Istio annotation is not recognized for any kind of resource
Level Warning

当将格式为*.istio.io的无法识别的注释附加到名称空间时,会出现此消息。Istio仅能识别特定的annotation名称

ReferencedResourceNotFound

Message Name ReferencedResourceNotFound
Message Code IST0101
Description A resource being referenced does not exist.
Level Error

当Istio资源相关的资源不存在时会出现该错误。当Istio尝试查找引用的资源但无法找到时,将导致错误。错误信息如:

Error [IST0101] (VirtualService httpbin.default) Referenced gateway not found: "httpbin-gateway-bogus"

本例中,VirtualService引用了一个不存在的网关。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: httpbin-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http2
protocol: HTTP2
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- "*"
gateways:
- httpbin-gateway-bogus #  Should have been "httpbin-gateway"
http:
- route:
- destination:
host: httpbin-gateway

为了解决该问题,查看detaild错误消息中的资源类型,然后修正Istio配置即可。

PortNameIsNotUnderNamingConvention

Message Name PortNameIsNotUnderNamingConvention
Message Code IST0118
Description Port name is not under naming convention. Protocol detection is applied to the port.
Level Info

当端口不遵守Istio服务端口命名规范或端口未命名时会出现该错误。错误信息如:

Info [IST0118] (Service httpbin.default) Port name foo-http (port: 80, targetPort: 80) doesn't follow the naming convention of Istio port.

对应的Service为:

apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
spec:
ports:
- name: foo-http
port: 8000
targetPort: 80
selector:
app: httpbin

可以通过将port foo-http按照语法name: <protocol>[-<suffix>]修改即可。

问题解决

  • 如果知道服务端口的协议,使用 <protocol>[-<suffix>] 格式重命名即可
  • 如果不知道服务端口的协议,则需要从Prometheus请求metrics来获取
  • 执行请求istio_requests_total
  • 如果有输出,可以在metrics的request_protocol字段中看到使用的协议
  • 如果没有输出,则可以保留端口不变。

PodMissingProxy

Message Name PodMissingProxy
Message Code IST0103
Description A pod is missing the Istio proxy.
Level Warning

当没有sidecar或sidecar不正常时会出现该错误。

通常是因为启用了自动注入,但后续没有重启pod导致sidecar不存在。

可以使用如下命令修复:

$ kubectl rollout restart deployment
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
存储 JSON 监控
Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
【2月更文挑战第30天】Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
54 1
|
JSON Rust 安全
Istio Ambient Mesh Ztunnel实现剖析(1)配置解析
前言在Istio Ambient Mesh中,社区引入了名为ztunnel的新组件,ztunnel的名字来源于Zero-Trust Tunnel,即零信任管道,Ztunnel 旨在专注于Ambient Mesh中工作负载4层安全能力,例如 mTLS、身份验证、L4 授权,而无需进行七层流量解析。ztunnel 确保流量高效、安全地传输到负责七层处理的Waypoint Proxy或在对端无waypo
363 0
|
3月前
|
Prometheus 网络协议 Cloud Native
Istio中的流量配置
Istio中的流量配置
59 1
|
6月前
|
Shell Python Perl
深入理解Istio流量管理的熔断配置
创建目标规则,访问 httpbin 服务时应用熔断配置 在 fortio 服务中向 httpbin 服务的发出并发请求
157 3
深入理解Istio流量管理的熔断配置
|
Kubernetes 监控 Go
在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格
在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格
265 0
|
Kubernetes Cloud Native Go
MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置
上一篇我们用 Go 扩展实现了 Basic Auth,体验了 Go 扩展从 Envoy 接受配置。之所以这么设计,是想复用 Envoy 原有的 xDS 配置推送通道,今天我们就来体验一番,云原生的配置变更。
|
微服务
自从用了 Kiali 以后才知道,配置 Istio 的 流量管理 是如此容易
在生产环境中,直接登录服务器是非常不方便的,我们可以使用Kiali配置Istio的流量管理。
369 0
自从用了 Kiali 以后才知道,配置 Istio 的 流量管理 是如此容易
|
Cloud Native 搜索推荐 开发者
直播预告 | 服务网格规模化应用下的 Istio Sidecar 灵活配置实践
5 月 25 日(周三), 阿里云服务网格技术专家张岚(宗泉)、阿里云服务网格开发工程师刘阳(奇方),将通过直播的方式为大家带来服务网格规模化应用下的 Istio Sidecar 灵活配置实践。从 Istio Sidecar 代理配置现状分析,到阿里云服务网格中多维度灵活配置方案解读,再到业务场景中的 Sidecar 代理配置实践......通过本次分享,希望能帮助大家在不同的业务场景下灵活配置 Sidecar 代理的配置来满足个性化需求、优化系统性能。
直播预告 | 服务网格规模化应用下的 Istio Sidecar 灵活配置实践
|
Kubernetes 网络协议 容器