解决 Anthos Service Mesh 中的虚拟机支持问题
以下步骤和日志对于排查 Anthos Service Mesh 虚拟机支持问题非常有用。
调试虚拟机
如果您看到虚拟机实例正在运行但无法从网格到达,请在虚拟机实例上执行以下步骤。
验证代理
检查 envoy 代理运行状况:
curl localhost:15000/ready -v
检查 envoy 错误日志
less /var/log/envoy/envoy.err.log
检查是否存在
service-proxy-agent
错误:journalctl -u service-proxy-agent
在实例的 Google Cloud 运维套件日志中或在 Debian 的
/var/log/syslog
下和 Centos 的/var/log/messages
下的虚拟机上查看syslog
。
验证代理运行状况
要调试代理的配置,请在虚拟机上运行以下命令:
curl localhost:15000/config_dump > config.out
复制该文件并运行以下命令:
istioctl proxy-config [cluster|route|listener] --file config.out
令牌错误无效
您可能会在 envoy 错误日志中看到类似于以下内容的错误:
E0217 17:59:17.206995798 2411 oauth2_credentials.cc:152] Call to http server ended with error 500 [{
"error": "invalid_target",
"error_description": "federated token response does not have access token. {\"error\":\"invalid_grant\",\"error_description\":\"JWT expired.\"}",
"error_uri": ""
}].
在这种情况下,请检查虚拟机上的 /var/run/secrets/tokens/istio-token
中的令牌是否已过期,并确认 exp
(周期秒)值未到期:
cat /var/run/secrets/tokens/istio-token | cut -d '.' -f2 | base64 -d | python -m json.tool
{
...
"azp": "...",
"email": "example-service-account@developer.gserviceaccount.com",
"email_verified": true,
"exp": 1613995395,
"google": {
"compute_engine": {
"instance_creation_timestamp": 1613775765,
"instance_id": "5678",
"instance_name": "vm-instance-03-0mqh",
"project_id": "...",
"project_number": 1234,
"zone": "us-central1-c"
}
},
"iat": ...,
"iss": "https://accounts.google.com",
"sub": "..."
}
不支持操作系统分发警告信息
在验证代理中,如果您在 service-proxy-agent 日志中看到类似于以下内容的警告消息:
E0217 17:59:17.206995798 2021-04-09T21:21:29.6091Z service-proxy-agent Warn
Detected image is unsupported: [Ubuntu|Fedora|Suse]. Envoy may not work correctly.
这意味着您的 Linux 发行版可能不受支持,这可能导致您的代理出现意外行为。
调试集群
请按以下步骤排查集群问题。
验证自动注册是否正常运行
检查
istiod
自动生成的WorkloadEntry
:kubectl get workloadentry -n WORKLOAD_NAMESPACE
此外,您可以检查 Kubernetes 对象浏览器中其是否存在。
如果该文件不存在,请检查
istiod
日志中是否存在错误(您可以在 Google Cloud 的操作套件中查看相应日志)。您也可以直接检索它们:kubectl -n istio-system get pods -l app=istiod
预期输出如下所示:
NAME READY STATUS RESTARTS AGE istiod-asm-190-1-7f6699cfb-5mzxw 1/1 Running 0 5d13h istiod-asm-190-1-7f6699cfb-pgvpf 1/1 Running 0 5d13h
设置 pod 环境变量并使用它来导出日志:
export ISTIO_POD=istiod-asm-190-1-7f6699cfb-5mzxw kubectl logs -n istio-system ${ISTIO_POD} | grep -i 'auto-register\|WorkloadEntry'
检查连接的代理
您可以使用 proxy-status
命令列出所有连接的代理,包括虚拟机的代理:
istioctl proxy-status
输出应显示类似如下所示的代理:
NAME CDS LDS EDS RDS ISTIOD VERSION
details-v1-5f449bdbb9-bhl8d.default SYNCED SYNCED SYNCED SYNCED istiod-asm-190-1-7f6699cfb-5mzxw 1.9.0-asm.1
httpbin-779c54bf49-647vd.default SYNCED SYNCED SYNCED SYNCED istiod-asm-190-1-7f6699cfb-pgvpf 1.9.0-asm.1
istio-eastwestgateway-5b6d4ddd9d-5rzx2.istio-system SYNCED SYNCED SYNCED NOT SENT istiod-asm-190-1-7f6699cfb-pgvpf 1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-ctb6b.istio-system SYNCED SYNCED SYNCED SYNCED istiod-asm-190-1-7f6699cfb-pgvpf 1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-vk4bb.istio-system SYNCED SYNCED SYNCED SYNCED istiod-asm-190-1-7f6699cfb-5mzxw 1.9.0-asm.1
vm-instance-03-39b3.496270428946 SYNCED SYNCED SYNCED SYNCED istiod-asm-190-1-7f6699cfb-pgvpf 1.9.0
vm-instance-03-nh5k.496270428946 SYNCED SYNCED SYNCED SYNCED istiod-asm-190-1-7f6699cfb-pgvpf 1.9.0
vm-instance-03-s4nl.496270428946 SYNCED SYNCED SYNCED SYNCED istiod-asm-190-1-7f6699cfb-5mzxw 1.9.0
如需详细了解命令选项,请参阅 istioctl proxy-config。
检查工作负载身份配置
检查 mesh
状态,以查看集群中是否存在潜在错误。请注意,必须使用最新版本的 gcloud。如需了解详情,请参阅更新到最新版本。
gcloud alpha container hub mesh describe --project=PROJECT_ID
在有效配置中,成员集群状态代码为 OK
:
createTime: '2021-06-15T21:56:10.221032150Z'
featureState:
detailsByMembership:
projects/<your project number>/locations/global/memberships/<your cluster name>:
code: OK
description: Revision(s) ready for use: istiod-asm-195-2.
updateTime: 2021-06-15T21:56:10.221032402Z
lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T21:56:10.221032402Z'
如果虚拟机配置不正确,则状态代码将为 WARNING
,并在说明中提供更多详细信息:
createTime: '2021-06-15T22:56:10.227167202Z'
featureState:
detailsByMembership:
projects/<your project number>/locations/global/memberships/<your cluster name>:
code: WARNING
description: |-
Revision(s) ready for use: istiod-asm-195-2.
WorkloadGroup <namespace>/<workloadgroup name> missing ServiceAccount field, please see https://cloud.google.com/service-mesh/docs/troubleshooting/troubleshoot-vms#verify_the_workloadgroup_is_set_up_correctly.
servicemeshFeatureState: {}
updateTime: '2021-06-15T22:56:00.220164192Z'
lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T22:56:10.227167402Z'
验证身份提供商是否正确设置
检查 IdentityProvider
资源字段:
kubectl describe identityprovider
确保这些字段满足以下要求:
serviceAccount
字段设置为request.auth.claims["email"]
issuerURI
字段设置为https://accounts.google.com
(我们目前仅支持 Google 作为 issuerURI)元数据下的提供商
name
字段必须设为google
,这是目前唯一受支持的提供商。有效的
IdentityProvider
CR 示例:apiVersion: security.cloud.google.com/v1alpha1 kind: IdentityProvider metadata: name: google spec: authentication: oidc: issuerUri: https://accounts.google.com serviceAccount: request.auth.claims["email"]
验证 WorkloadGroup
已正确设置
检查 WorkloadGroup
:
kubectl get workloadgroup -n WORKLOAD_NAMESPACE
确保结果满足以下要求:
- 已正确设置
serviceAccount
字段,例如373206437219-compute@developer.gserviceaccount.com
,其中的帐号与虚拟机实例使用的服务帐号相同 - 已设置注解字段下的
security.cloud.google.com/IdentityProvider
,例如security.cloud.google.com/IdentityProvider: google
工作负载组引用有效的
IdentityProvider
,您可以通过检查现有身份提供商进行验证:kubectl describe identityprovider
输出应为现有提供商的列表,如下所示:
NAME AGE google 39m
检查
WorkloadGroup
中的security.cloud.google.com/IdentityProvider
字段,查看提供商是否位于现有提供商列表中。有效的
WorkloadGroup
CR 示例:apiVersion: networking.istio.io/v1alpha3 kind: WorkloadGroup metadata: name: wg-a namespace: foo spec: metadata: annotations: security.cloud.google.com/IdentityProvider: google labels: app: wg-a template: ports: grpc: 3550 http: 8080 serviceAccount: 373206437219-compute@developer.gserviceaccount.com
发现内部错误
如果您收到消息 Internal Error Found
,请参阅获取支持。
Istio 虚拟机问题排查指南
如需了解其他问题排查步骤,请参阅调试虚拟机。