数据面相关诊断项说明

ASM提供了对Istio配置状态的详细分析,以便标识无效或次优的配置。本文介绍此分析可能产生的数据面相关的错误或警告消息的详细说明。

ST0102: 命名空间注入未开启

消息名称

消息代码

等级

描述

NamespaceNotInjected

IST0102

Info

命名空间未开启Sidecar自动注入。

当命名空间缺少 istio-injection 标签(用于启用/禁用 Sidecar 注入)或 istio.io/rev 标签(用于标识sidecarIstio控制平面版本)或者 .values.sidecarInjectorWebhook.enableNamespacesByDefault 未被启用时,会出现此消息。

异常示例

您可能看到以下错误:

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.

修复方式

请您使用标签明确声明您是否希望命名空间被自动注入。例如:

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

IST0103: Pod缺失Sidecar

消息名称

消息代码

等级

描述

PodMissingProxy

IST0103

Warning

Pod中不存在istio Proxy。

当 Sidecar 不存在或不能正常工作时,将出现此消息。

最常见的情况是,您开启了自动注入,但之后没有重新启动您的 Pod,导致还未被注入 Sidecar。

为了解决这个问题,请重新启动您的 Pod 以便进行注入。您也可以使用以下命令重新启动Pod:

kubectl rollout restart deployment

IST0107: 注解错误标注

消息名称

消息代码

等级

描述

MisplacedAnnotation

IST0107

Warning

Istio 注解被应用到了错误的资源类型上。

当 Istio annotation 被添加到无效的资源上或目标资源的位置错误时,将出现此错误消息。

比如,当您创建一个 Deployment 并且把注解添加 Deployment 上而不是它创建的 Pod 上时就会出现此消息。

为了解决此问题,请检查您的注解是否被放在了正确的地方,然后重试。

IST0108: 未知注解

消息名称

消息代码

等级

描述

UnknownAnnotation

IST0108

Warning

Istio 注解在任何类型的资源上均未被识别。

当您为某个命名空间使用了格式为 *.istio.io 的、未识别的注解时会出现此错误消息。

请检查注解名称后重试。

IST0116: Pod端口协议冲突

消息名称

消息代码

等级

描述

DeploymentAssociatedToMultipleServices

IST0116

Warning

服务网格部署生成的 Pod 无法与使用相同端口但不同协议的多个服务关联。

当 Deployment 的 Pod 被关联到多个使用相同端口但使用不同协议的 Service 时, 会出现此消息。

异常示例

例如以下Service:

apiVersion: v1
kind: Service
metadata:
  name: productpage-tcp-v1
spec:
  ports:
    - port: 9080
      name: tcp
      protocol: TCP
  selector:
    app: productpage
---
apiVersion: v1
kind: Service
metadata:
  name: productpage-http-v1
spec:
  ports:
    - port: 9080
      name: http
      protocol: HTTP
  selector:
    app: productpage

这个示例展示了使用 HTTP 和 TCP 协议的同时关联到了 9080 端口。不可以存在两个 Service 在同一个端口上使用不同协议。

IST0118: 不规范的Pod端口名称定义

消息名称

消息代码

等级

描述

PortNameIsNotUnderNamingConvention

IST0118

Info

端口名称不符合命名规范。该端口已启用协议检测。

当端口不遵循 Istio 服务端口命名约定或端口未命名时, 会出现此消息。

异常示例

当您的集群有以下 Service 时:

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

在这个示例中,端口名 foo-http 不符合命名语法:name: <protocol>[-<suffix>]

您将收到以下消息:

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

修复方式

  • 如果您知道 Service 端口的协议,将端口重命名为 <protocol>[-<suffix>] 格式就行;

  • 如果您不知道 Service 端口的协议,您需要从 Prometheus 查询指标

    • 查询 istio_requests_total{reporter="destination",destination_service_name="SERVICE_NAME",response_code="200"}[TIME_RANGE]。 如果您使用遥测指标覆盖,也可以查询 istio_requests_total{reporter="destination",destination_service_name="SERVICE_NAME",response_code="200",destination_port="TARGET_PORT"}[TIME_RANGE]

    • 如果有输出,您可以从记录中找到 request_protocol。例如, 如果 request_protocol 是 http,则将端口重命名为 http-foo

    • 如果没有输出,您可以将端口保持原样。

IST0123: 命名空间存在多个注入标签

消息名称

消息代码

等级

描述

NamespaceMultipleInjectionLabels

IST0123

Warning

该命名空间存在多种类型的注入标签。

当某个命名空间同时定义了新老版本的自动注入标签时,会出现此消息。

异常示例

当集群有下面的命名空间时:

apiVersion: v1
kind: Namespace
metadata:
  name: busted
  labels:
    istio-injection: enabled
    istio.io/rev: canary

您会收到这条消息:

Warning [IST0123] (Namespace busted) The namespace has both new and legacy injection labels. Run 'kubectl label namespace busted istio.io/rev-' or 'kubectl label namespace busted istio-injection-'

此示例中,命名空间 busted 同时使用了新老版本的注入标签。

修复方式

  • 移除 istio-injection 标签

  • 移除 istio.io/rev 标签

IST0125: 无效的注解

消息名称

消息代码

等级

描述

InvalidAnnotation

IST0125

Info

此资源使用了不合法的istio注解。

当集群的某些资源与 Istio 相关(名称归属 istio.io)但注解(annotation)包含以下情况时:

  • 在此版本中不存在的注解

  • 此版本中存在,但是其值不符合规范,比如要求值是数字但是设置了一个字符串

  • 注解给到了错误的资源对象,比如本身需要归属 Pod 却给到了 Service

会出现此消息。

异常示例

当集群包含以下资源时:

apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
  annotations:
    # 没有这种 Istio 注解
    networking.istio.io/exportTwo: bar
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin

您会收到此消息:

Warning [IST0108] (Service httpbin.default) Unknown annotation: networking.istio.io/exportTwo

此示例中,Service httpbin 想要使用 networking.istio.io/exportTwo 代替 networking.istio.io/exportTo

修复方式

  • 删除或重命名未知的注解

  • 修改不允许的值

IST0126: 未知的网格网络服务注册中心

网格网络中存在未知的服务注册中心。

IST0135: 注解废弃

消息名称

消息代码

等级

描述

DeprecatedAnnotation

IST0135

Info

此资源使用了已弃用的istio注解。

在 Istio 或 Kubernetes 资源中使用已弃用的 Istio 注解时,会出现此消息。

修复方式

当 Istio 控制平面升级时可能会出现此消息。在升级之前,请移除或使用替代方案替换相关注解。

IST0136: 使用测试阶段注解

消息名称

消息代码

等级

描述

AlphaAnnotation

IST0136

Info

此资源使用了实验版本的istio注解。

当 Istio 或 Kubernetes 资源含有一个实验版本或者缺少性能测试的新注解时,会出现此消息。

修复方式

使用 Alpha 级别的注解并不是问题。这可能是体验 Istio 实验性功能的最好方法。建议您仅在测试环境使用,并在切换到生产环境前改为GA级别的注解。

IST0137: Service端口定义冲突

消息名称

消息代码

等级

描述

DeploymentConflictingPorts

IST0137

Warning

选择同一工作负载且使用相同 targetPort 的两个服务必须引用相同的端口。

当两个 Service 选择了同一个工作负载的同一个目标端口(targetPort) 但却指定了不同的服务端口 port,会出现此消息。

异常示例

以此Service为例:

apiVersion: v1
kind: Service
metadata:
  name: nginx-a
spec:
  ports:
    - port: 8080
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-b
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx

在这个示例中,Service nginx-a 和 nginx-b 选择了工作负载 nginx 的同一个目标端口 80,但是它们对应的服务端口(port)却不一致。

修复方式

修复此问题有两个选择:

  • 两个 Service 使用相同的端口(port)。需要重新配置客户端以连接到修改之后的服务端口。

  • 两个 Service 使用不同的目标端口(targetPort)。 需要修改工作负载的 Pod 监听到修改之后的目标端口以提供服务。

IST0139: 无效的Webhook服务

Admission Webhook中引用的服务在集群中不存在。

IST0142: Kubernetes版本不兼容

不支持的Kubernetes版本。

IST0144: 应用用户ID冲突

消息名称

消息代码

等级

描述

InvalidApplicationUID

IST0144

Warning

应用Pod不应该以用户ID(UID)为1337运行。

重要

User ID (UID) 1337 保留用于 Sidecar Proxy。

当工作负载以 User ID (UID) 1337 运行时,会出现此消息。应用程序的 Pod 不应该以 User ID (UID) 1337 运行,因为 istio-proxy 容器默认以 UID 1337 运行。 当使用相同的 UID 运行您的容器应用时,将导致它的 iptables 配置冲突。

异常示例

此示例Deployment使用 UID 1337 在 Pod 级别或容器级别运行:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-con-sec-uid
  labels:
    app: helloworld
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
      version: v1
  template:
    metadata:
      labels:
        app: helloworld
        version: v1
    spec:
      securityContext:
        runAsUser: 1337
      containers:
      - name: helloworld
        image: docker.io/istio/examples-helloworld-v1
        securityContext:
          runAsUser: 1337
        resources:
          requests:
            cpu: "100m"
        imagePullPolicy: IfNotPresent #Always
        ports:
        - containerPort: 5000

修复方式

由于 User ID (UID) 1337 是为 Sidecar 代理保留的,所以您可以为您的工作负载使用除了 1337 以外的 User ID (UID),例如 1338

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-con-sec-uid
  labels:
    app: helloworld
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
      version: v1
  template:
    metadata:
      labels:
        app: helloworld
        version: v1
    spec:
      securityContext:
        runAsUser: 1338
      containers:
      - name: helloworld
        image: docker.io/istio/examples-helloworld-v1
        securityContext:
          runAsUser: 1338
        resources:
          requests:
            cpu: "100m"
        imagePullPolicy: IfNotPresent #Always
        ports:
        - containerPort: 5000

IST0150: ExternalNamep类型服务端口名称无效

消息名称

消息代码

等级

描述

ExternalNameServiceTypeInvalidPortName

IST0150

Warning

代理可能会阻止发往 ExternalName 服务的、通过 TCP 命名端口和 TCP 协议端口上的未匹配流量的正确转发。

对于 ExternalName 类型的服务,当端口不遵循 Istio 服务端口命名协议、端口未命名或端口命名为 TCP 时,会出现此消息。

异常示例

当您的集群有以下服务时:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  externalName: nginx.example.com
  ports:
  - name: tcp
    port: 443
    protocol: TCP
    targetPort: 443
  type: ExternalName

您将收到以下信息:

Warning [IST0150] (Service nginx.default) Port name for ExternalName service is invalid. Proxy may prevent tcp named ports and unmatched traffic for ports serving TCP protocol from being forwarded correctly.

修复方式

如果您有一个服务类型为 ExternalName 并且服务协议为 TCP,那么将端口重命名为 <protocol>[-<suffix>] 或者 <protocol> ,其中协议指的是 https 或者 tls

IST0156: 不兼容的Gateway API版本

当前 Gateway API 版本不兼容。

IST0158: Sidecar镜像不匹配

消息名称

消息代码

等级

描述

PodsIstioProxyImageMismatchInNamespace

IST0158

Warning

命名空间中 Pod 所使用的 Istio 代理镜像,与注入配置中定义的镜像不一致。

当命名空间开启了自动注入 Sidecar, 但命名空间中的某些 Pod 没有正确地完成 Sidecar 注入时,会出现此消息。

如果命名空间中的任何 Pod 未运行正确版本的 Sidecar,将上报此消息。 这些 Pod 的名称将被列在消息的详情中。

这样的结果通常会在升级 Istio 控制平面的时候触发; 当升级 Istio(包括 Sidecar 注入器)后, 所有运行中带有 Istio Sidecar 的工作负载必须被重新创建,以便注入新版本的 Sidecar 使得新版本 Sidecar 被允许注入。

修复方式

请使用正常滚动策略重新部署应用程序来更新其 Sidecar 版本。 对于 Kubernetes Deployment:

  • 如果您正在使用 Kubernetes 1.15 或更高版本, 您可以运行 kubectl rollout restart <my-deployment> 来触发一次新的滚动操作。

  • 或者,您可以修改 Deployment 的 ’template’ 字段来强制执行一次新的滚动操作。 该操作通常会通过在 Pod 定义模板中添加一个如同 force-redeploy=<current-timestamp> 的标签来完成。

IST0164: 外部控制面地址错误

消息名称

消息代码

等级

描述

ExternalControlPlaneAddressIsNotAHostname

IST0164

Info

外部控制面的入口网关地址是 IP 地址,而非主机名。

当为外部控制面上的入口网关提供的地址是 IP 地址而不是主机名时,会出现此消息。

异常示例

当您的集群具有以下 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration时:

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: istio-validator-external-istiod
webhooks:
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    url: https://test.com:15017/validate
  name: rev.validation.istio.io

---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: istiod-default-validator
webhooks:
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    url: https://test.com:15017/validate
  failurePolicy: Ignore
  name: validation.istio.io

---
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: istio-sidecar-injector-external-istiod
webhooks:
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    url: https://999.999.999.999:5100/inject/cluster/your-cluster-name/net/network1
  failurePolicy: Fail
  name: rev.namespace.sidecar-injector.istio.io
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    url: https://test.com/inject/cluster/your-cluster-name/net/network1
  failurePolicy: Fail
  name: rev.object.sidecar-injector.istio.io
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    url: https://test.com/inject/cluster/your-cluster-name/net/network1
  failurePolicy: Fail
  name: namespace.sidecar-injector.istio.io
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    url: https://test.com/inject/cluster/your-cluster-name/net/network1
  failurePolicy: Fail
  name: object.sidecar-injector.istio.io

您将收到消息:

Info [IST0164] (MutatingWebhookConfiguration istio-sidecar-injector-external-istiod testing.yml:28) The address (https://999.999.999.999:5100/inject/cluster/your-cluster-name/net/network1) that was provided for the webhook (rev.namespace.sidecar-injector.istio.io) to reach the ingress gateway on the external control plane cluster is an IP address. This is not recommended for a production environment.

修复方式

不建议在生产环境中为在外部控制平面中运行的入口网关使用 IP 地址而不是主机名。

如果您使用的是生产环境,修复这条信息类消息的方式为:将此地址更改为一个有效的主机名, 将其解析为入口网关的 IP 地址。

IST0170: 多集群服务定义冲突

在多集群部署模型下,位于不同集群中的服务不一致。