diff --git a/content/zh/docs/ops/diagnostic-tools/istioctl-analyze/index.md b/content/zh/docs/ops/diagnostic-tools/istioctl-analyze/index.md index 13cca05e54..818c71fb85 100644 --- a/content/zh/docs/ops/diagnostic-tools/istioctl-analyze/index.md +++ b/content/zh/docs/ops/diagnostic-tools/istioctl-analyze/index.md @@ -13,42 +13,143 @@ test: yes 可以使用如下的命令分析您当前的集群: -{{< text bash >}} -$ istioctl analyze +{{< text syntax=bash snip_id=analyze_all_namespaces >}} +$ istioctl analyze --all-namespaces {{< /text >}} 就是这样!它会给你任何合适的建议。 例如,如果您忘记启用 Istio 注入(一个非常常见的问题),则会收到以下警告: -{{< text plain >}} -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 +{{< text syntax=plain snip_id=analyze_all_namespace_sample_response >}} +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. {{< /text >}} -## 分析实时群集,本地文件或同时分析两者{#analyzing-live-clusters-local-files-or-both} +可使用如下命令修复: -上面的例子是对运行的集群进行分析。但是该工具还支持对一组本地 Kubernetes yaml 配置文件,或对本地文件和运行集群的组合进行分析。当分析一组本地文件时,文件集应该是完全独立的。通常,这用于分析打算部署到集群的整个配置文件集。 - -分析一组特定的本地文件: - -{{< text bash >}} -$ istioctl analyze --use-kube=false a.yaml b.yaml +{{< text syntax=bash snip_id=fix_default_namespace >}} +$ kubectl label namespace default istio-injection=enabled {{< /text >}} -分析当前文件夹中的所有 yaml 文件: +然后再重试一下: -{{< text bash >}} -$ istioctl analyze --use-kube=false *.yaml +{{< text syntax=bash snip_id=try_with_fixed_namespace >}} +$ istioctl analyze --namespace default +✔ No validation issues found when analyzing namespace: default. {{< /text >}} -模拟将当前文件夹中的文件应用于当前集群: +## 分析活动群集,本地文件或同时分析两者{#analyzing-live-clusters-local-files-or-both} -{{< text bash >}} -$ istioctl analyze *.yaml +分析当前的活动集群,模拟在 `samples/bookinfo/networking` 目录下应用诸如 `bookinfo-gateway.yaml` 和 `destination-rule-all.yaml` 等额外 yaml 文件的效果: + +{{< text syntax=bash snip_id=analyze_sample_destrule >}} +$ istioctl analyze @samples/bookinfo/networking/bookinfo-gateway.yaml@ @samples/bookinfo/networking/destination-rule-all.yaml@ +Error [IST0101] (VirtualService bookinfo.default samples/bookinfo/networking/bookinfo-gateway.yaml:39) Referenced host not found: "productpage" +Error: Analyzers found issues when analyzing namespace: default. +See https://istio.io/v{{< istio_version >}}/zh/docs/reference/config/analysis for more information about causes and resolutions. +{{< /text >}} + +分析整个 `networking` 目录: + +{{< text syntax=bash snip_id=analyze_networking_directory >}} +$ istioctl analyze samples/bookinfo/networking/ +{{< /text >}} + +分析 `networking` 目录下的所有 yaml 文件: + +{{< text syntax=bash snip_id=analyze_all_networking_yaml >}} +$ istioctl analyze samples/bookinfo/networking/*.yaml +{{< /text >}} + +上面的例子是对活动集群进行分析。但是该工具还支持对一组本地 Kubernetes yaml 配置文件,或对本地文件和活动集群的组合进行分析。当分析一组本地文件时,文件集应该是完全独立的。通常,这用于分析打算部署到集群的整个配置文件集。 要使用此功能,只需添加 `--use-kube=false` 标志。 + +分析 `networking` 目录下的所有 yaml 文件: + +{{< text syntax=bash snip_id=analyze_all_networking_yaml_no_kube >}} +$ istioctl analyze --use-kube=false samples/bookinfo/networking/*.yaml {{< /text >}} 可以运行 `istioctl analyze --help` 来查看完整的选项集。 +## 高级功能{#advanced} + +### 为资源状态启用验证消息{#enabling-validation-messages-for-resource-status} + +{{< boilerplate experimental-feature-warning >}} + +从 Istio 1.5 开始,可以通过`istiod.enableAnalysis`标志将 Galley 设置为与其主要负责的配置分发一起执行配置分析。 + +此分析使用与`istioctl analysis`相同的逻辑和错误消息。 来自分析的验证消息被写入受影响的 Istio 资源的状态子资源。 + +例如:如果您的“ratings”虚拟服务上的网关配置错误,运行 `kubectl get virtualservice ratings` 会给你类似这样的结果: + +{{< text syntax=yaml snip_id=vs_yaml_with_status >}} +apiVersion: networking.istio.io/v1beta1 +kind: VirtualService +... +spec: + gateways: + - bogus-gateway + hosts: + - ratings +... +status: + validationMessages: + - documentation_url: https://istio.io/v{{< istio_version >}}/zh/docs/reference/config/analysis/ist0101/?ref=status-controller + level: 3 + type: + code: IST0101 +{{< /text >}} + +`enableAnalysis` 在后台运行,并将保持资源的状态字段与其当前验证状态保持同步。 请注意,这不是`istioctl analysis`的替代品: + +- 并非所有资源都有自定义状态字段(例如 Kubernetes `namespace`资源),因此附加到这些资源的消息不会显示验证消息。 +- `enableAnalysis` 仅适用于从 1.5 开始的 Istio 版本,而 `istioctl analysis` 可用于旧版本。 +- 虽然可以轻松查看特定资源的问题,但很难全面了解网格中的验证状态。 + +您可以通过以下方式命令此功能: + +{{< text syntax=bash snip_id=install_with_custom_config_analysis >}} +$ istioctl install --set values.global.istiod.enableAnalysis=true +{{< /text >}} + +### 通过 CLI 忽略特定的分析者消息{#ignoring-specific-analyzer-messages-via-cli} + +有时您可能会发现在某些情况下隐藏或忽略分析器消息很有用。 例如,想象这样一种情况,其中发出一条关于您无权更新的资源的消息: + +{{< text syntax=bash snip_id=analyze_k_frod >}} +$ 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. +{{< /text >}} + +由于您无权更新命名空间,因此无法通过注释命名空间来解析消息。 相反,您可以使用`istioctl analysis`来抑制资源上的上述消息: + +{{< text syntax=bash snip_id=analyze_suppress0102 >}} +$ istioctl analyze -k --namespace frod --suppress "IST0102=Namespace frod" +✔ No validation issues found when analyzing namespace: frod. +{{< /text >}} + +当引用:` .`资源时,用于抑制的语法与整个 `istioctl` 中使用的语法相同,或者仅使用` `对于`Namespace`集群范围的资源。如果你想抑制多个对象,你可以重复 `--suppress` 参数或使用通配符: + +{{< text syntax=bash snip_id=analyze_suppress_frod_0107_baz >}} +$ # 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" +{{< /text >}} + +### 通过注释忽略特定的分析器消息{#ignoring-specific-analyzer-messages-via-annotations} + +您也可以使用资源上的注释忽略特定的分析器消息。例如,要忽略资源`deployment/my deployment`上的代码IST0107(`MisplacedAnnotation`): + +{{< text syntax=bash snip_id=annotate_for_deployment_suppression >}} +$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107 +{{< /text >}} + +要忽略资源的多个代码,请用逗号分隔每个代码: + +{{< text syntax=bash snip_id=annotate_for_deployment_suppression_107 >}} +$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107,IST0002 +{{< /text >}} + ## 帮助我们改进此工具{#helping-us-improve-this-tool} 我们将不断增加更多的分析功能,并希望您能帮助我们发现更多的用例。 @@ -89,120 +190,4 @@ $ istioctl analyze *.yaml - **在哪里可以找到解决错误的方法?** - [配置分析消息](/zh/docs/reference/config/analysis/)集包含每个消息的描述以及建议的修复程序。 - -## 高级功能{#advanced} - -### 获取最新版本的 `istioctl analyze`{#getting-the-latest-version-of-Istio-analyze} - -虽然 `istioctl analyze` 是包含在了 Istio 1.4 以及更高级的版本中,但是还可以直接下载最新版本到集群中使用的。最新版本可能不稳定,但是会有最完整和最新的分析程序集,并且可能会发现旧版本遗漏的问题。 - -可以使用下面的命令下载最新的 `istioctl` 到当前目录: - -{{< tabset category-name="platform" >}} - -{{< tab name="Mac" category-value="macos" >}} - -{{< text bash >}} -$ curl https://storage.googleapis.com/istio-build/dev/latest | xargs -I {} curl https://storage.googleapis.com/istio-build/dev/{}/istioctl-{}-osx.tar.gz | tar xvz -{{< /text >}} - -{{< /tab >}} - -{{< tab name="Linux" category-value="linux" >}} - -{{< text bash >}} -$ curl https://storage.googleapis.com/istio-build/dev/latest | xargs -I {} curl https://storage.googleapis.com/istio-build/dev/{}/istioctl-{}-linux-amd64.tar.gz | tar xvz -{{< /text >}} - -{{< /tab >}} - -{{< /tabset >}} - -### 为资源状态启用验证消息{#enabling-validation-messages-for-resource-status} - -从 Istio 1.4 开始,可以通过 `galley.enableAnalysis` 标志将 Galley 设置为与主要负责的配置分发一起执行配置分析。该分析使用与 `istioctl analyze` 相同的逻辑和错误消息。来自分析的验证消息将写入受影响的 Istio 资源的状态子资源。 - -例如,如果您在 "ratings" 虚拟服务上网关配置错误,运行 `kubectl get virtualservice ratings` 将为您提供以下信息: - -{{< text yaml >}} -apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - annotations: - kubectl.kubernetes.io/last-applied-configuration: | - {"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"ratings","namespace":"default"},"spec":{"hosts":["ratings"],"http":[{"route":[{"destination":{"host":"ratings","subset":"v1"}}]}]}} - creationTimestamp: "2019-09-04T17:31:46Z" - generation: 11 - name: ratings - namespace: default - resourceVersion: "12760039" - selfLink: /apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices/ratings - uid: dec86702-cf39-11e9-b803-42010a8a014a -spec: - gateways: - - bogus-gateway - hosts: - - ratings - http: - - route: - - destination: - host: ratings - subset: v1 -status: - validationMessages: - - code: IST0101 - level: Error - message: 'Referenced gateway not found: "bogus-gateway"' -{{< /text >}} - -`enableAnalysis` 在后台运行,并将使资源的状态字段保持其当前验证状态的最新状态。请注意,这不能代替 `istioctl analyze`: - -- 并非所有资源都有自定义状态字段 (例如 Kubernetes `namespace` 资源),因此附加到这些资源的消息将不会显示验证消息。 -- `enableAnalysis` 仅适用于从 1.4 开始的 Istio 版本,而 `istioctl analysis` 可以用于较早的版本。 -- 尽管可以轻松查看特定资源的问题所在,但要在网格中全面了解验证状态更加困难。 - -您可以通过以下方式启用此功能: - -{{< text bash >}} -$ istioctl manifest apply --set values.galley.enableAnalysis=true -{{< /text >}} - -### 通过 CLI 忽略特定的分析器消息{#ignoring-specific-analyzer-messages-via-cli} - -有时候你可能会发现,在某些情况下隐藏或忽略分析器消息很有用。例如,假设出现这样一种情况,其发出有关您无权更新资源的消息: - -{{< text bash >}} -$ istioctl analyze -k --all-namespaces -Warn [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 -Error: Analyzers found issues. -See https://istio.io/docs/reference/config/analysis for more information about causes and resolutions. -{{< /text >}} - -因为您没有更新命名空间的权限,所以无法通过注释命名空间来解析消息。相反,您可以直接使用 `istioctl analyze` 来抑制上述资源中的消息: - -{{< text bash >}} -$ istioctl analyze -k --all-namespaces --suppress "IST0102=Namespace frod" -✔ No validation issues found. -{{< /text >}} - -用于抑制的语法与引用资源时在整个 `istioctl` 中使用的语法相同:` .`。或只是 ` ` 用于集群范围内的资源,例如,`Namespace`。如果要抑制多个对象,则可以重复使用 `--suppress` 参数或使用通配符: - -{{< text bash >}} -$ # 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" -{{< /text >}} - -### 通过注释忽略特定的分析器消息{#ignoring-specific-analyzer-messages-via-annotations} - -您还可以使用资源上的注释忽略特定的分析器消息。例如,忽略资源 `deployment/my-deployment` 上的代码 IST0107(`MisplacedAnnotation`): - -{{< text bash >}} -$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107 -{{< /text >}} - -要忽略资源的多处代码,请用逗号分隔每处代码: - -{{< text bash >}} -$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107,IST0002 -{{< /text >}} + [配置分析消息](/zh/docs/reference/config/analysis/)集包含每个消息的描述以及建议的修复程序。 \ No newline at end of file diff --git a/content/zh/docs/ops/diagnostic-tools/istioctl-describe/index.md b/content/zh/docs/ops/diagnostic-tools/istioctl-describe/index.md index d0586a0662..864012d607 100644 --- a/content/zh/docs/ops/diagnostic-tools/istioctl-describe/index.md +++ b/content/zh/docs/ops/diagnostic-tools/istioctl-describe/index.md @@ -13,7 +13,7 @@ test: no 在 Istio 1.3 中,我们新增了 [`istioctl experimental describe`](/zh/docs/reference/commands/istioctl/#istioctl-experimental-describe-pod) 命令。 一些配置可以影响 {{< gloss >}}pod{{< /gloss >}},要理解这些配置,您可以利用这个命令行工具得到一些必要的信息。 -这份指南向您展示如何使用这个实验性子命令来查看一个 pod 是否在网格中并验证它的配置。 +这份指南向您展示如何使用这个实验性质的命令来查看一个 pod 是否在网格中并验证它的配置。 该命令的基本用法如下: @@ -35,12 +35,17 @@ $ istioctl experimental describe [.] 如果 pod 里没有 {{< gloss >}}Envoy{{< /gloss >}} 代理或者代理没启动,`istioctl describe` 命令会返回一个警告。 另外,如果 [pods 的 Istio 需求](/zh/docs/ops/deployment/requirements/)未完全满足,该命令也会警告。 -例如,下面的命令发出的警告表示一个 `kubernetes-dashboard` pod 不被包含在服务网格内,因为它没有 sidecar: +例如,下面的命令发出的警告表示一个 `kube-dns` pod 不被包含在服务网格内,因为它没有 sidecar: {{< text bash >}} -$ export DASHBOARD_POD=$(kubectl -n kube-system get pod -l k8s-app=kubernetes-dashboard -o jsonpath='{.items[0].metadata.name}') -$ istioctl x describe pod -n kube-system $DASHBOARD_POD -WARNING: kubernetes-dashboard-7996b848f4-nbns2.kube-system is not part of mesh; no Istio sidecar +$ export KUBE_POD=$(kubectl -n kube-system get pod -l k8s-app=kube-dns -o jsonpath='{.items[0].metadata.name}') +$ istioctl x describe pod -n kube-system $KUBE_POD +Pod: coredns-f9fd979d6-2zsxk + Pod Ports: 53/UDP (coredns), 53 (coredns), 9153 (coredns) +WARNING: coredns-f9fd979d6-2zsxk is not part of mesh; no Istio sidecar +-------------------- +2021-01-22T16:10:14.080091Z error klog an error occurred forwarding 42785 -> 15000: error forwarding port 15000 to pod 692362a4fe313005439a873a1019a62f52ecd02c3de9a0957cd0af8f947866e5, uid : failed to execute portforward in network namespace "/var/run/netns/cni-3c000d0a-fb1c-d9df-8af8-1403e6803c22": failed to dial 15000: dial tcp4 127.0.0.1:15000: connect: connection refused[] +Error: failed to execute command on sidecar: failure running port forward process: Get "http://localhost:42785/config_dump": EOF {{< /text >}} 但对于服务网格内的 pod,如 Bookinfo 的 `ratings` 服务,该命令就不会报警,而是输出该 pod 的 Istio 配置: @@ -48,12 +53,11 @@ WARNING: kubernetes-dashboard-7996b848f4-nbns2.kube-system is not part of mesh; {{< text bash >}} $ export RATINGS_POD=$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') $ istioctl experimental describe pod $RATINGS_POD -Pod: ratings-v1-f745cf57b-qrxl2 -Pod Ports: 9080 (ratings), 15090 (istio-proxy) +Pod: ratings-v1-7dc98c7588-8jsbw + Pod Ports: 9080 (ratings), 15090 (istio-proxy) -------------------- Service: ratings - Port: http 9080/HTTP -Pilot reports that pod enforces HTTP/mTLS and clients speak HTTP + Port: http 9080/HTTP targets pod port 9080 {{< /text >}} 该输出展示了下列信息: @@ -61,7 +65,6 @@ Pilot reports that pod enforces HTTP/mTLS and clients speak HTTP - Pod 内的服务容器的端口,如本例中的 `ratings` 容器的 `9080`。 - Pod 内的 `istio-proxy` 容器的端口,如本例中的 `15090`。 - Pod 内的服务所用的协议,如本例中的端口 `9080` 上的 `HTTP`。 -- Pod 的双向 TLS 设置。 ## 验证 destination rule 配置{#verify-destination-rule-configurations} @@ -84,7 +87,6 @@ DestinationRule: ratings for "ratings" Matching subsets: v1 (Non-matching subsets v2,v2-mysql,v2-mysql-vm) Traffic Policy TLS Mode: ISTIO_MUTUAL -Pilot reports that pod enforces HTTP/mTLS and clients speak mTLS {{< /text >}} 该命令现在显示了更多的输出: diff --git a/content/zh/docs/ops/diagnostic-tools/istioctl/index.md b/content/zh/docs/ops/diagnostic-tools/istioctl/index.md index 80402bea6f..538d851809 100644 --- a/content/zh/docs/ops/diagnostic-tools/istioctl/index.md +++ b/content/zh/docs/ops/diagnostic-tools/istioctl/index.md @@ -136,6 +136,10 @@ $ brew install bash-completion 根据您选择的 shell,按照以下步骤在您的系统开启 `istioctl` 命令补全 : +{{< warning >}} +您需要下载包含自动补全文件(在`/tools`目录下)的 Istio 完整发行版本。如果你没有这么做, 现在请[下载 Istio 完整发行版本](/zh/docs/setup/getting-started/#download) 。 +{{< /warning >}} + {{< tabset category-name="profile" >}} {{< tab name="Bash" category-value="bash" >}} diff --git a/content/zh/docs/ops/diagnostic-tools/proxy-cmd/index.md b/content/zh/docs/ops/diagnostic-tools/proxy-cmd/index.md index 262dedd265..5cb6fcd585 100644 --- a/content/zh/docs/ops/diagnostic-tools/proxy-cmd/index.md +++ b/content/zh/docs/ops/diagnostic-tools/proxy-cmd/index.md @@ -1,5 +1,5 @@ --- -title: 调试 Envoy 和 Pilot +title: 调试 Envoy 和 Istiod description: 描述诊断与流量管理相关的 Envoy 配置问题的工具和技术。 weight: 20 keywords: [debug,proxy,status,config,pilot,envoy] @@ -29,31 +29,30 @@ Istio 提供了两个非常有价值的命令来帮助诊断流量管理配置 {{< text bash >}} $ istioctl proxy-status -PROXY CDS LDS EDS RDS PILOT VERSION -details-v1-6dcc6fbb9d-wsjz4.default SYNCED SYNCED SYNCED SYNCED istio-pilot-75bdf98789-tfdvh 1.1.2 -istio-egressgateway-c49694485-l9d5l.istio-system SYNCED SYNCED SYNCED NOT SENT istio-pilot-75bdf98789-tfdvh 1.1.2 -istio-ingress-6458b8c98f-7ks48.istio-system SYNCED SYNCED SYNCED NOT SENT istio-pilot-75bdf98789-n2kqh 1.1.2 -istio-ingressgateway-7d6874b48f-qxhn5.istio-system SYNCED SYNCED SYNCED SYNCED istio-pilot-75bdf98789-n2kqh 1.1.2 -productpage-v1-6c886ff494-hm7zk.default SYNCED SYNCED SYNCED STALE istio-pilot-75bdf98789-n2kqh 1.1.2 -ratings-v1-5d9ff497bb-gslng.default SYNCED SYNCED SYNCED SYNCED istio-pilot-75bdf98789-n2kqh 1.1.2 -reviews-v1-55d4c455db-zjj2m.default SYNCED SYNCED SYNCED SYNCED istio-pilot-75bdf98789-n2kqh 1.1.2 -reviews-v2-686bbb668-99j76.default SYNCED SYNCED SYNCED SYNCED istio-pilot-75bdf98789-tfdvh 1.1.2 -reviews-v3-7b9b5fdfd6-4r52s.default SYNCED SYNCED SYNCED SYNCED istio-pilot-75bdf98789-n2kqh 1.1.2 +NAME CDS LDS EDS RDS ISTIOD VERSION +details-v1-558b8b4b76-qzqsg.default SYNCED SYNCED SYNCED SYNCED istiod-6cf8d4f9cb-wm7x6 1.7.0 +istio-ingressgateway-66c994c45c-cmb7x.istio-system SYNCED SYNCED SYNCED NOT SENT istiod-6cf8d4f9cb-wm7x6 1.7.0 +productpage-v1-6987489c74-nc7tj.default SYNCED SYNCED SYNCED SYNCED istiod-6cf8d4f9cb-wm7x6 1.7.0 +prometheus-7bdc59c94d-hcp59.istio-system SYNCED SYNCED SYNCED SYNCED istiod-6cf8d4f9cb-wm7x6 1.7.0 +ratings-v1-7dc98c7588-5m6xj.default SYNCED SYNCED SYNCED SYNCED istiod-6cf8d4f9cb-wm7x6 1.7.0 +reviews-v1-7f99cc4496-rtsqn.default SYNCED SYNCED SYNCED SYNCED istiod-6cf8d4f9cb-wm7x6 1.7.0 +reviews-v2-7d79d5bd5d-tj6kf.default SYNCED SYNCED SYNCED SYNCED istiod-6cf8d4f9cb-wm7x6 1.7.0 +reviews-v3-7dbcdcbc56-t8wrx.default SYNCED SYNCED SYNCED SYNCED istiod-6cf8d4f9cb-wm7x6 1.7.0 {{< /text >}} -如果列表中缺少代理,这意味着它目前没有连接到 Pilot 实例,因此不会接收任何配置。 +如果列表中缺少代理,这意味着它目前没有连接到 Istiod 实例,因此不会接收任何配置。 -* `SYNCED` 意思是 Envoy 知晓了 Pilot 已经将最新的配置发送给了它。 -* `NOT SENT` 意思是 Pilot 没有发送任何信息给 Envoy。这通常是因为 Pilot 没什么可发送的。 -* `STALE` 意思是 Pilot 已经发送了一个更新到 Envoy,但还没有收到应答。这通常意味着 Envoy 和 Pilot 之间存在网络问题,或者 Istio 自身的 bug。 +* `SYNCED` 意思是 Envoy 知晓了 {{< gloss >}}Istiod{{< /gloss >}} 已经将最新的配置发送给了它。 +* `NOT SENT` 意思是 Istiod 没有发送任何信息给 Envoy。这通常是因为 Istiod 没什么可发送的。 +* `STALE` 意思是 Istiod 已经发送了一个更新到 Envoy,但还没有收到应答。这通常意味着 Envoy 和 Istiod 之间存在网络问题,或者 Istio 自身的 bug。 -## 检查 Envoy 和 Istio Pilot 的差异{#retrieve-diffs-between-envoy-and-Istio-pilot} +## 检查 Envoy 和 Istiod 的差异{#retrieve-diffs-between-envoy-and-Istiod} -通过提供代理 ID,`proxy-status` 命令还可以用来检查 Envoy 已加载的配置和 Pilot 发送给它的配置有什么异同,这可以帮您准确定位哪些配置是不同步的,以及问题出在哪里。 +通过提供代理 ID,`proxy-status` 命令还可以用来检查 Envoy 已加载的配置和 Istiod 发送给它的配置有什么异同,这可以帮您准确定位哪些配置是不同步的,以及问题出在哪里。 {{< text bash json >}} $ istioctl proxy-status details-v1-6dcc6fbb9d-wsjz4.default ---- Pilot Clusters +--- Istiod Clusters +++ Envoy Clusters @@ -374,36 +374,14 @@ "edsClusterConfig": { @@ -94,7 +93,7 @@ $ istioctl proxy-status details-v1-6dcc6fbb9d-wsjz4.default } Listeners Match -Routes Match +Routes Match (RDS last loaded at Tue, 04 Aug 2020 11:52:54 IST) {{< /text >}} 从这儿可以看到,监听器和路由是匹配的,但集群不同步。 @@ -105,14 +104,30 @@ Routes Match {{< text bash >}} $ istioctl proxy-config cluster -n istio-system istio-ingressgateway-7d6874b48f-qxhn5 -SERVICE FQDN PORT SUBSET DIRECTION TYPE -BlackHoleCluster - - - STATIC -details.default.svc.cluster.local 9080 - outbound EDS -heapster.kube-system.svc.cluster.local 80 - outbound EDS -istio-citadel.istio-system.svc.cluster.local 8060 - outbound EDS -istio-citadel.istio-system.svc.cluster.local 15014 - outbound EDS -istio-egressgateway.istio-system.svc.cluster.local 80 - outbound EDS +SERVICE FQDN PORT SUBSET DIRECTION TYPE DESTINATION RULE +BlackHoleCluster - - - STATIC +agent - - - STATIC +details.default.svc.cluster.local 9080 - outbound EDS details.default +istio-ingressgateway.istio-system.svc.cluster.local 80 - outbound EDS +istio-ingressgateway.istio-system.svc.cluster.local 443 - outbound EDS +istio-ingressgateway.istio-system.svc.cluster.local 15021 - outbound EDS +istio-ingressgateway.istio-system.svc.cluster.local 15443 - outbound EDS +istiod.istio-system.svc.cluster.local 443 - outbound EDS +istiod.istio-system.svc.cluster.local 853 - outbound EDS +istiod.istio-system.svc.cluster.local 15010 - outbound EDS +istiod.istio-system.svc.cluster.local 15012 - outbound EDS +istiod.istio-system.svc.cluster.local 15014 - outbound EDS +kube-dns.kube-system.svc.cluster.local 53 - outbound EDS +kube-dns.kube-system.svc.cluster.local 9153 - outbound EDS +kubernetes.default.svc.cluster.local 443 - outbound EDS ... +productpage.default.svc.cluster.local 9080 - outbound EDS +prometheus_stats - - - STATIC +ratings.default.svc.cluster.local 9080 - outbound EDS +reviews.default.svc.cluster.local 9080 - outbound EDS +sds-grpc - - - STATIC +xds-grpc - - - STRICT_DNS +zipkin - - - STRICT_DNS {{< /text >}} 为了调试 Envoy 您需要理解 Envoy 集群、监听器、路由、endpoints 以及它们是如何交互的。我们将使用带有 `-o json` 参数的 `proxy-config` 命令,根据标志过滤出并跟随特定的 Envoy,它将请求从 `productpage` pod 发送到 `reviews` pod 9080 端口。 @@ -125,45 +140,48 @@ istio-egressgateway.istio-system.svc.cluster.local {{< text bash >}} $ istioctl proxy-config listeners productpage-v1-6c886ff494-7vxhs - ADDRESS PORT TYPE - 172.21.252.250 15005 TCP <--+ - 172.21.252.250 15011 TCP | - 172.21.79.56 42422 TCP | - 172.21.160.5 443 TCP | - 172.21.157.6 443 TCP | - 172.21.117.222 443 TCP | - 172.21.0.10 53 TCP | - 172.21.126.131 443 TCP | Receives outbound non-HTTP traffic for relevant IP:PORT pair from listener `0.0.0.0_15001` - 172.21.160.5 31400 TCP | - 172.21.81.159 9102 TCP | - 172.21.0.1 443 TCP | - 172.21.126.131 80 TCP | - 172.21.119.8 443 TCP | - 172.21.112.64 80 TCP | - 172.21.179.54 443 TCP | - 172.21.165.197 443 TCP <--+ - 0.0.0.0 9090 HTTP <-+ - 0.0.0.0 8060 HTTP | - 0.0.0.0 15010 HTTP | - 0.0.0.0 15003 HTTP | - 0.0.0.0 15004 HTTP | - 0.0.0.0 15014 HTTP | Receives outbound HTTP traffic for relevant port from listener `0.0.0.0_15001` - 0.0.0.0 15007 HTTP | - 0.0.0.0 8080 HTTP | - 0.0.0.0 9091 HTTP | - 0.0.0.0 9080 HTTP | - 0.0.0.0 80 HTTP <-+ - 0.0.0.0 15001 TCP // Receives all inbound and outbound traffic to the pod from IP tables and hands over to virtual listener - 172.30.164.190 9080 HTTP // Receives all inbound traffic on 9080 from listener `0.0.0.0_15001` + ADDRESS PORT MATCH DESTINATION + 10.96.0.10 53 ALL Cluster: outbound|53||kube-dns.kube-system.svc.cluster.local + 0.0.0.0 80 App: HTTP Route: 80 + 0.0.0.0 80 ALL PassthroughCluster + 10.100.93.102 443 ALL Cluster: outbound|443||istiod.istio-system.svc.cluster.local + 10.111.121.13 443 ALL Cluster: outbound|443||istio-ingressgateway.istio-system.svc.cluster.local + 10.96.0.1 443 ALL Cluster: outbound|443||kubernetes.default.svc.cluster.local + 10.100.93.102 853 App: HTTP Route: istiod.istio-system.svc.cluster.local:853 + 10.100.93.102 853 ALL Cluster: outbound|853||istiod.istio-system.svc.cluster.local + 0.0.0.0 9080 App: HTTP Route: 9080 + 0.0.0.0 9080 ALL PassthroughCluster + 0.0.0.0 9090 App: HTTP Route: 9090 + 0.0.0.0 9090 ALL PassthroughCluster + 10.96.0.10 9153 App: HTTP Route: kube-dns.kube-system.svc.cluster.local:9153 + 10.96.0.10 9153 ALL Cluster: outbound|9153||kube-dns.kube-system.svc.cluster.local + 0.0.0.0 15001 ALL PassthroughCluster + 0.0.0.0 15006 Addr: 10.244.0.22/32:15021 inbound|15021|mgmt-15021|mgmtCluster + 0.0.0.0 15006 Addr: 10.244.0.22/32:9080 Inline Route: /* + 0.0.0.0 15006 Trans: tls; App: HTTP TLS; Addr: 0.0.0.0/0 Inline Route: /* + 0.0.0.0 15006 App: HTTP; Addr: 0.0.0.0/0 Inline Route: /* + 0.0.0.0 15006 App: Istio HTTP Plain; Addr: 10.244.0.22/32:9080 Inline Route: /* + 0.0.0.0 15006 Addr: 0.0.0.0/0 InboundPassthroughClusterIpv4 + 0.0.0.0 15006 Trans: tls; App: TCP TLS; Addr: 0.0.0.0/0 InboundPassthroughClusterIpv4 + 0.0.0.0 15010 App: HTTP Route: 15010 + 0.0.0.0 15010 ALL PassthroughCluster + 10.100.93.102 15012 ALL Cluster: outbound|15012||istiod.istio-system.svc.cluster.local + 0.0.0.0 15014 App: HTTP Route: 15014 + 0.0.0.0 15014 ALL PassthroughCluster + 0.0.0.0 15021 ALL Inline Route: /healthz/ready* + 10.111.121.13 15021 App: HTTP Route: istio-ingressgateway.istio-system.svc.cluster.local:15021 + 10.111.121.13 15021 ALL Cluster: outbound|15021||istio-ingressgateway.istio-system.svc.cluster.local + 0.0.0.0 15090 ALL Inline Route: /stats/prometheus* + 10.111.121.13 15443 ALL Cluster: outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local {{< /text >}} 1. 从上面的信息可以看到,每一个 sidecar 有一个绑定到 `0.0.0.0:15001` 的监听器,来确定 IP 表将所有进出 Pod 的流量路由到哪里。监听器设置 `useOriginalDst` 为 true 意味着它将请求传递给最适合原始请求目的地的监听器。如果找不到匹配的虚拟监听器,它会将请求发送到直接连接到目的地的 `PassthroughCluster`。 - {{< text bash json >}} + {{< text bash json >}} $ istioctl proxy-config listeners productpage-v1-6c886ff494-7vxhs --port 15001 -o json [ { - "name": "virtual", + "name": "virtualOutbound", "address": { "socketAddress": { "address": "0.0.0.0", @@ -173,22 +191,47 @@ istio-egressgateway.istio-system.svc.cluster.local "filterChains": [ { "filters": [ + { + "name": "istio.stats", + "typedConfig": { + "@type": "type.googleapis.com/udpa.type.v1.TypedStruct", + "typeUrl": "type.googleapis.com/envoy.extensions.filters.network.wasm.v3.Wasm", + "value": { + "config": { + "configuration": "{\n \"debug\": \"false\",\n \"stat_prefix\": \"istio\"\n}\n", + "root_id": "stats_outbound", + "vm_config": { + "code": { + "local": { + "inline_string": "envoy.wasm.stats" + } + }, + "runtime": "envoy.wasm.runtime.null", + "vm_id": "tcp_stats_outbound" + } + } + } + } + }, { "name": "envoy.tcp_proxy", - "config": { - "cluster": "PassthroughCluster", - "stat_prefix": "PassthroughCluster" + "typedConfig": { + "@type": "type.googleapis.com/envoy.config.filter.network.tcp_proxy.v2.TcpProxy", + "statPrefix": "PassthroughCluster", + "cluster": "PassthroughCluster" } } - ] + ], + "name": "virtualOutbound-catchall-tcp" } ], - "useOriginalDst": true + "trafficDirection": "OUTBOUND", + "hiddenEnvoyDeprecatedUseOriginalDst": true } ] {{< /text >}} -1. 我们的请求是到端口 `9080` 的出站 HTTP 请求,它将被传递给 `0.0.0.0:9080` 的虚拟监听器。这一监听器将检索在它配置的 RDS 里的路由配置。在这个例子中它将寻找 Pilot(通过 ADS)配置在 RDS 中的路由 `9080`。 +1. 我们的请求是到端口 `9080` 的出站 HTTP 请求,它将被传递给 `0.0.0.0:9080` 的虚拟监听器。这一监听器将检索在它配置的 RDS 里的路由配置。在这个例子中它将寻找 Istiod(通过 ADS)配置在 RDS 中的路由 `9080`。 {{< text bash json >}} $ istioctl proxy-config listeners productpage-v1-6c886ff494-7vxhs -o json --address 0.0.0.0 --port 9080 @@ -223,22 +266,25 @@ istio-egressgateway.istio-system.svc.cluster.local "reviews.default.svc:9080", "reviews.default", "reviews.default:9080", - "172.21.152.34", - "172.21.152.34:9080" + "10.98.88.0", + "10.98.88.0:9080" ], "routes": [ { + "name": "default", "match": { "prefix": "/" }, "route": { "cluster": "outbound|9080||reviews.default.svc.cluster.local", - "timeout": "0.000s" - }, + "timeout": "0s", + } + } + ] ... {{< /text >}} -1. 此集群配置为从 Pilot(通过 ADS)检索关联的 endpoints。所以 Envoy 会使用 `serviceName` 字段作为主键,来检查 endpoint 列表并把请求代理到其中之一。 +1. 此集群配置为从 Istiod(通过 ADS)检索关联的 endpoints。所以 Envoy 会使用 `serviceName` 字段作为主键,来检查 endpoint 列表并把请求代理到其中之一。 {{< text bash json >}} $ istioctl proxy-config cluster productpage-v1-6c886ff494-7vxhs --fqdn reviews.default.svc.cluster.local -o json @@ -248,16 +294,22 @@ istio-egressgateway.istio-system.svc.cluster.local "type": "EDS", "edsClusterConfig": { "edsConfig": { - "ads": {} + "ads": {}, + "resourceApiVersion": "V3" }, "serviceName": "outbound|9080||reviews.default.svc.cluster.local" }, - "connectTimeout": "1.000s", + "connectTimeout": "10s", "circuitBreakers": { "thresholds": [ - {} + { + "maxConnections": 4294967295, + "maxPendingRequests": 4294967295, + "maxRequests": 4294967295, + "maxRetries": 4294967295 + } ] - } + }, } ] {{< /text >}} @@ -266,15 +318,15 @@ istio-egressgateway.istio-system.svc.cluster.local {{< text bash json >}} $ istioctl proxy-config endpoints productpage-v1-6c886ff494-7vxhs --cluster "outbound|9080||reviews.default.svc.cluster.local" - ENDPOINT STATUS OUTLIER CHECK CLUSTER - 172.17.0.17:9080 HEALTHY OK outbound|9080||reviews.default.svc.cluster.local - 172.17.0.18:9080 HEALTHY OK outbound|9080||reviews.default.svc.cluster.local - 172.17.0.5:9080 HEALTHY OK outbound|9080||reviews.default.svc.cluster.local + ENDPOINT STATUS OUTLIER CHECK CLUSTER + 172.17.0.7:9080 HEALTHY OK outbound|9080||reviews.default.svc.cluster.local + 172.17.0.8:9080 HEALTHY OK outbound|9080||reviews.default.svc.cluster.local + 172.17.0.9:9080 HEALTHY OK outbound|9080||reviews.default.svc.cluster.local {{< /text >}} ## 检查 bootstrap 配置{#inspecting-bootstrap-configuration} -到目前为止,我们已经查看了从 Pilot 检索到的配置(大部分),然而 Envoy 需要一些 bootstrap 配置,其中包括诸如在何处可以找到 Pilot 之类的信息。使用下面的命令查看: +到目前为止,我们已经查看了从 Istiod 检索到的配置(大部分),然而 Envoy 需要一些 bootstrap 配置,其中包括诸如在何处可以找到 Istiod 之类的信息。使用下面的命令查看: {{< text bash json >}} $ istioctl proxy-config bootstrap -n istio-system istio-ingressgateway-7d6874b48f-qxhn5 @@ -284,51 +336,72 @@ $ istioctl proxy-config bootstrap -n istio-system istio-ingressgateway-7d6874b48 "id": "router~172.30.86.14~istio-ingressgateway-7d6874b48f-qxhn5.istio-system~istio-system.svc.cluster.local", "cluster": "istio-ingressgateway", "metadata": { - "POD_NAME": "istio-ingressgateway-7d6874b48f-qxhn5", - "istio": "sidecar" + "CLUSTER_ID": "Kubernetes", + "EXCHANGE_KEYS": "NAME,NAMESPACE,INSTANCE_IPS,LABELS,OWNER,PLATFORM_METADATA,WORKLOAD_NAME,MESH_ID,SERVICE_ACCOUNT,CLUSTER_ID", + "INSTANCE_IPS": "10.244.0.7", + "ISTIO_PROXY_SHA": "istio-proxy:f98b7e538920abc408fbc91c22a3b32bc854d9dc", + "ISTIO_VERSION": "1.7.0", + "LABELS": { + "app": "istio-ingressgateway", + "chart": "gateways", + "heritage": "Tiller", + "istio": "ingressgateway", + "pod-template-hash": "68bf7d7f94", + "release": "istio", + "service.istio.io/canonical-name": "istio-ingressgateway", + "service.istio.io/canonical-revision": "latest" + }, + "MESH_ID": "cluster.local", + "NAME": "istio-ingressgateway-68bf7d7f94-sp226", + "NAMESPACE": "istio-system", + "OWNER": "kubernetes://apis/apps/v1/namespaces/istio-system/deployments/istio-ingressgateway", + "ROUTER_MODE": "sni-dnat", + "SDS": "true", + "SERVICE_ACCOUNT": "istio-ingressgateway-service-account", + "WORKLOAD_NAME": "istio-ingressgateway" }, - "buildVersion": "0/1.8.0-dev//RELEASE" + "userAgentBuildVersion": { + "version": { + "majorNumber": 1, + "minorNumber": 15 + }, + "metadata": { + "build.type": "RELEASE", + "revision.sha": "f98b7e538920abc408fbc91c22a3b32bc854d9dc", + "revision.status": "Clean", + "ssl.version": "BoringSSL" + } + }, }, ... {{< /text >}} -## 验证到 Istio Pilot 的连通性{#verifying-connectivity-to-Istio-pilot} +## 验证到 Istiod 的连通性{#verifying-connectivity-to-Istiod} -验证与 Pilot 的连通性是一个有用的故障排除步骤。服务网格内的每个代理容器都应该能和 Pilot 通信。这可以通过几个简单的步骤来实现: +验证与 Istiod 的连通性是一个有用的故障排除步骤。服务网格内的每个代理容器都应该能和 Istiod 通信。这可以通过几个简单的步骤来实现: -1. 获取 Istio Ingress pod 的名称: +1. 创建一个 `sleep` pod: {{< text bash >}} - $ INGRESS_POD_NAME=$(kubectl get po -n istio-system | grep ingressgateway\- | awk '{print$1}'); echo ${INGRESS_POD_NAME}; + $ kubectl create namespace foo + $ kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo {{< /text >}} -1. 通过 exec 进入 Istio Ingress pod: +1. 使用`curl`测试 Istiod 的连接。下面的示例使用默认 Istiod 配置参数和启用相互 TLS 调用 v1 注册 API: {{< text bash >}} - $ kubectl exec -it $INGRESS_POD_NAME -n istio-system /bin/bash + $ kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl -sS istiod.istio-system:15014/debug/endpointz {{< /text >}} -1. 使用 `curl` 测试与 Pilot 的连通性。下面的示例使用了默认的 Pilot 配置参数和开启双向 TLS 来调用 v1 注册 API: - - {{< text bash >}} - $ curl -k --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --key /etc/certs/key.pem https://istio-pilot:8080/debug/edsz - {{< /text >}} - - 如果双向 TLS 是关闭的: - - {{< text bash >}} - $ curl http://istio-pilot:8080/debug/edsz - {{< /text >}} - -对网格内的每个服务,您将会收到一个响应,列举了 "service-key" 和 "hosts"。 +您应该收到一个响应,其中列出了网格中每个服务的“服务”和“端点”。 ## Istio 使用的 Envoy 版本是什么?{#what-envoy-version-is-Istio-using} -要在部署中找出 Envoy 的版本,您可以通过 `exec` 进入容器并查询 `server_info` endpoint: +要在部署中找出 Envoy 的版本,您可以通过 `exec` 进入容器并查询 `server_info` 终端: {{< text bash >}} -$ kubectl exec -it PODNAME -c istio-proxy -n NAMESPACE pilot-agent request GET server_info +$ kubectl exec -it productpage-v1-6b746f74dc-9stvs -c istio-proxy -n default -- pilot-agent request GET server_info --log_as_json | jq {version} { - "version": "48bc83d8f0582fc060ef76d5aa3d75400e739d9e/1.12.0-dev/Clean/RELEASE/BoringSSL" + "version": "2d4ec97f3ac7b3256d060e1bb8aa6c415f5cef63/1.17.0/Clean/RELEASE/BoringSSL" } -{{< /text >}} +{{< /text >}} \ No newline at end of file