Tim Wang Tech Blog

如何解决 Istioctl Analyze -A 命令报invalid memory address问题

问题描述

最近我在尝试用 Istioctl Analyze -A来对整体的Istio配置进行分析,但是在执行命令的时候,我遇到了如下错误:


panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x90 pc=0x104d85f9c]

goroutine 1 [running]:
istio.io/istio/pkg/config/analysis/analyzers/authz.(*AuthorizationPoliciesAnalyzer).analyzeNamespaceNotFound(0x140080985a0?, 0x140080985a0, {0x105ed1480, 0x140066a7c20?})
 istio.io/istio/pkg/config/analysis/analyzers/authz/authorizationpolicies.go:145 +0xdc
istio.io/istio/pkg/config/analysis/analyzers/authz.(*AuthorizationPoliciesAnalyzer).Analyze.func1(0x104f6cdda?)
 istio.io/istio/pkg/config/analysis/analyzers/authz/authorizationpolicies.go:59 +0x58
istio.io/istio/pkg/config/analysis/local.(*istiodContext).ForEach(0x140066a7c20, {{0x104f6cdda, 0x11}, {0x104f5243f, 0x7}, {0x104f72cd1, 0x13}}, 0x14006897980)
 istio.io/istio/pkg/config/analysis/local/context.go:168 +0x574
istio.io/istio/pkg/config/analysis/analyzers/authz.(*AuthorizationPoliciesAnalyzer).Analyze(0x107d30e20, {0x105ed1480?, 0x140066a7c20})
 istio.io/istio/pkg/config/analysis/analyzers/authz/authorizationpolicies.go:57 +0xf0
istio.io/istio/pkg/config/analysis.(*CombinedAnalyzer).Analyze(0x14000cbe6c0, {0x105ed1480, 0x140066a7c20})
 istio.io/istio/pkg/config/analysis/analyzer.go:75 +0xcc
istio.io/istio/pkg/config/analysis/local.(*IstiodAnalyzer).internalAnalyze(0x14000a7ec30, 0x1400007faa0?, 0x1400007faa0)
 istio.io/istio/pkg/config/analysis/local/istiod_analyze.go:146 +0x244
istio.io/istio/pkg/config/analysis/local.(*IstiodAnalyzer).ReAnalyze(...)
 istio.io/istio/pkg/config/analysis/local/istiod_analyze.go:131
istio.io/istio/pkg/config/analysis/local.(*IstiodAnalyzer).Analyze(0x14000a7ec30, 0x105ee1ee8?)
 istio.io/istio/pkg/config/analysis/local/istiod_analyze.go:171 +0xac
istio.io/istio/istioctl/pkg/analyze.Analyze.func1(0x14000d6f200?, {0x140008e8020, 0x0, 0x2})
 istio.io/istio/istioctl/pkg/analyze/analyze.go:229 +0xb74
github.com/spf13/cobra.(*Command).execute(0x14000d50f00, {0x140008e8000, 0x2, 0x2})
 github.com/spf13/cobra@v1.7.0/command.go:940 +0x66c
github.com/spf13/cobra.(*Command).ExecuteC(0x14000a96000)
 github.com/spf13/cobra@v1.7.0/command.go:1068 +0x320
github.com/spf13/cobra.(*Command).Execute(0x1400006e090?)
 github.com/spf13/cobra@v1.7.0/command.go:992 +0x1c
main.main()
 istio.io/istio/istioctl/cmd/istioctl/main.go:39 +0xd0

咋一眼看上去,这个问题好像是因为内存地址无效或者空指针引用导致的,从错误日志来看,函数 AuthorizationPoliciesAnalyzer.analyzeNamespaceNotFound 在 authorizationpolicies.go 文件中的第145行引发了panic。函数的定义似乎是为了处理找不到namespace的情况,但它似乎没有正确地处理这种情况。

istioctl Analyze介绍

Istio是一个开源的服务网格,它提供了一种统一的方法来连接、保护、控制和观察服务。istioctl是Istio的命令行工具,用于安装、管理和故障排除Istio服务网格。istioctl analyzeistioctl的一个子命令,用于分析Istio配置的有效性并提供反馈。

如何使用istioctl analyze

  1. 安装Istio: 在使用istioctl analyze之前,你需要在你的集群上安装Istio。你可以从Istio的官网下载Istio并按照指南进行安装。

  2. 配置Istio: 配置Istio通常涉及到创建和修改Istio资源,比如GatewayVirtualServiceDestinationRule等。

  3. 运行istioctl analyze: 使用以下命令来分析你的Istio配置文件:

    istioctl analyze <path-to-configuration-file>
    

    或者,如果你想要分析当前目录下的所有配置文件,可以使用:

    istioctl analyze
    

具体例子

假设你有一个名为my-gateway.yaml的Istio配置文件,内容如下:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

你可以使用以下命令来分析这个配置文件:

istioctl analyze my-gateway.yaml

执行这个命令后,istioctl analyze将会检查配置文件的语法和逻辑错误,并给出相应的反馈。例如,如果配置文件中的hosts字段不正确,istioctl analyze可能会返回一个错误消息,指出问题所在。

输出示例

如果配置正确,你可能会看到如下输出:

✔ Valid configuration

如果配置有误,输出可能会包含错误或警告信息,例如:

W01: MyWarning - This is a warning message.
E01: MyError - This is an error message.

istioctl analyze是一个非常有用的工具,可以帮助你确保Istio配置的正确性,避免在部署时出现问题。通过这种方式,你可以在部署之前验证配置的有效性,从而提高部署的成功率和效率。

问题原因

在查看了当前k8s cluster中所有的 Istio AuthorizationPolicy之后,并没有发现有任何Namespace不存在的情况。因此,我怀疑这个问题可能是由于某些特定的配置导致的。

解决方案

在查看了这个Github issue istioctl analyze invalid memory address之后,我开始查看是否有某些AuthorizationPolicy的配置可能导致了这个问题。最终,我发现了一个AuthorizationPolicy的配置中有一个from字段为空的情况,如下:

spec:
  action: ALLOW
  rules:
  - from:
    - {}

然而,正确的配置应该是这样的:

spec:
  rules:
    - from:
        - source:
            principals:
              - cluster.local/ns/promtail/sa/promtail

在尝试删除这个错误的AuthorizationPolicy配置之后,我再次运行了istioctl analyze -A命令,这次命令成功执行,没有再出现错误。最终的原因是其他同事不熟悉Istio的配置规则,导致了这个错误的配置。