使用 Istioctl Analyze 分析配置

istioctl analyze 是一款诊断工具,可以检测 Istio 配置中潜在的问题。它可以针对实时集群或一组本地配置文件运行。它还可以针对两者的组合运行,允许您在将更改应用到集群之前捕获问题。

一分钟内入门

您可以通过运行以下命令来分析您当前的实时 Kubernetes 集群:

$ istioctl analyze --all-namespaces

就是这样!它会提供任何适用的建议。

例如,如果您忘记启用 Istio 注入(一个非常常见的问题),您将收到以下“信息”消息:

Info [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.

修复问题

$ kubectl label namespace default istio-injection=enabled

然后重试

$ istioctl analyze --namespace default
✔ No validation issues found when analyzing namespace: default.

分析实时集群、本地文件或两者

分析当前的实时集群,模拟应用其他 yaml 文件(如 samples/bookinfo/networking 目录中的 bookinfo-gateway.yamldestination-rule-all.yaml)的效果

ZipZip
$ istioctl analyze @samples/bookinfo/networking/bookinfo-gateway.yaml@ @samples/bookinfo/networking/destination-rule-all.yaml@
Error [IST0101] (Gateway default/bookinfo-gateway samples/bookinfo/networking/bookinfo-gateway.yaml:9) Referenced selector not found: "istio=ingressgateway"
Error [IST0101] (VirtualService default/bookinfo samples/bookinfo/networking/bookinfo-gateway.yaml:41) Referenced host not found: "productpage"
Error: Analyzers found issues when analyzing namespace: default.
See https://istio.ac.cn/v1.24/docs/reference/config/analysis for more information about causes and resolutions.

分析整个 networking 文件夹

$ istioctl analyze samples/bookinfo/networking/

分析 networking 文件夹中的所有 yaml 文件

$ istioctl analyze samples/bookinfo/networking/*.yaml

以上示例在活动集群上执行分析。该工具还支持对一组本地 Kubernetes yaml 配置文件进行分析,或对本地文件和活动集群的组合进行分析。当分析一组本地文件时,预计文件集是完全自包含的。通常,这用于分析打算部署到集群的整套配置文件。要使用此功能,只需添加--use-kube=false标志。

分析 networking 文件夹中的所有 yaml 文件

$ istioctl analyze --use-kube=false samples/bookinfo/networking/*.yaml

您可以运行istioctl analyze --help以查看所有选项。

高级

为资源状态启用验证消息

从 v1.5 开始,Istio 可以设置为通过istiod.enableAnalysis标志在其主要负责的配置分发 alongside 执行配置分析。此分析使用与使用istioctl analyze时相同的逻辑和错误消息。来自分析的验证消息将写入受影响的 Istio 资源的状态子资源。

例如,如果您在“ratings”虚拟服务上有一个配置错误的网关,运行kubectl get virtualservice ratings将为您提供类似以下内容:

apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
  gateways:
  - bogus-gateway
  hosts:
  - ratings
...
status:
  observedGeneration: "1"
  validationMessages:
  - documentationUrl: https://istio.ac.cn/v1.24/docs/reference/config/analysis/ist0101/
    level: ERROR
    type:
      code: IST0101

enableAnalysis在后台运行,并将使资源的状态字段与其当前验证状态保持最新。请注意,这不是istioctl analyze的替代品。

  • 并非所有资源都具有自定义状态字段(例如 Kubernetes namespace资源),因此附加到这些资源的消息将不会显示验证消息。
  • enableAnalysis仅适用于 Istio 1.5 及更高版本,而istioctl analyze可用于旧版本。
  • 虽然它使查看特定资源的问题变得很容易,但难以获得网格中验证状态的整体视图。

您可以使用以下方法启用此功能:

$ istioctl install --set values.global.istiod.enableAnalysis=true

通过 CLI 忽略特定分析器消息

有时您可能会发现,在某些情况下隐藏或忽略分析器消息很有用。例如,假设出现有关您没有权限更新的资源的消息的情况。

$ istioctl analyze -k --namespace frod
Info [IST0102] (Namespace frod) The namespace is not enabled for Istio injection. Run 'kubectl label namespace frod istio-injection=enabled' to enable it, or 'kubectl label namespace frod istio-injection=disabled' to explicitly mark it as not needing injection.

由于您没有权限更新命名空间,因此您无法通过注释命名空间来解决该消息。相反,您可以指示istioctl analyze抑制资源上的上述消息。

$ istioctl analyze -k --namespace frod --suppress "IST0102=Namespace frod"
✔ No validation issues found when analyzing namespace: frod.

用于抑制的语法与在istioctl中引用资源时使用的语法相同:<kind> <name>.<namespace>,或仅对集群范围的资源(如Namespace)使用<kind> <name>。如果要抑制多个对象,可以重复--suppress参数或使用通配符。

$ # Suppress code IST0102 on namespace frod and IST0107 on all pods in namespace baz
$ istioctl analyze -k --all-namespaces --suppress "IST0102=Namespace frod" --suppress "IST0107=Pod *.baz"

通过注解忽略特定分析器消息

您还可以使用资源上的注释忽略特定的分析器消息。例如,要忽略资源deployment/my-deployment上的代码 IST0107(MisplacedAnnotation)。

$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107

要忽略资源的多个代码,请用逗号分隔每个代码。

$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107,IST0002

帮助我们改进此工具

我们正在继续添加更多分析功能,我们希望您能帮助我们识别更多用例。如果您发现了一些 Istio 配置“陷阱”,一些给您造成一些问题的棘手情况,请打开一个 issue 并让我们知道。我们可能会自动标记此问题,以便其他人能够首先发现并避免此问题。

为此,请打开一个 issue 描述您的场景。例如:

  • 查看所有虚拟服务。
  • 对于每个虚拟服务,查看其网关列表。
  • 如果某些网关不存在,则生成错误。

我们已经为此特定场景提供了一个分析器,因此这只是一个说明您应该提供哪些信息的示例。

问答

  • 此工具针对哪个 Istio 版本?

    与其他istioctl工具一样,我们通常建议使用与集群中部署的版本匹配的下载版本。

    目前,分析通常向后兼容,因此例如,您可以对运行较旧 Istio 1.x 版本的集群运行 1.24 版本的istioctl analyze并期望获得有用的反馈。与较旧的 Istio 版本无关的分析规则将被跳过。

    如果您决定将最新的istioctl用于在运行较旧 Istio 版本的集群上进行分析,我们建议您将其保存在与用于管理已部署 Istio 版本的二进制文件的版本不同的文件夹中。

  • 今天支持哪些分析器?

    我们仍在努力记录分析器。同时,您可以在Istio 源代码中查看所有分析器。

    您还可以查看支持的配置分析消息,以了解当前涵盖的内容。

  • 分析是否会对我的集群造成任何损害?

    分析永远不会更改配置状态。这是一个完全只读的操作,永远不会更改集群的状态。

  • 超越配置的分析呢?

    目前,分析纯粹基于 Kubernetes 配置,但将来我们希望扩展到超出此范围。例如,我们可以允许分析器还查看日志以生成建议。

  • 在哪里可以找到如何修复我遇到的错误的信息?

    一组配置分析消息包含每个消息的描述以及建议的修复方法。

此信息是否有用?
您是否有任何改进建议?

感谢您的反馈!