[zh] improve app-health-check config-resource-ready (#13171)

Signed-off-by: xin.li <xin.li@daocloud.io>
This commit is contained in:
my-git9 2023-05-08 10:08:01 +08:00 committed by GitHub
parent 7fa49ea88f
commit f08ef67b91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 73 additions and 47 deletions

View File

@ -23,18 +23,26 @@ test: yes
命令方式无需更改即可工作,但 HTTP 请求和 TCP 探针需要 Istio 更改 Pod 的配置。
`liveness-http` 服务的健康检查请求由 Kubelet 发送。当启用双向 TLS 时,这会成为一个问题,因为 Kubelet 没有 Istio 颁发的证书。
`liveness-http` 服务的健康检查请求由 kubelet 发送。当启用双向 TLS 时,
这会成为一个问题,因为 kubelet 没有 Istio 颁发的证书。
因此,健康检查请求将失败。
TCP 探针检查需要特殊处理,因为 Istio 将所有传入的流量重定向到 Sidecar所以所有 TCP 端口都显示为开放。Kubelet 仅检查某个进程是否正在监听指定的端口,因此只要 Sidecar 正在运行,该探针就总会成功。
TCP 探针检查需要特殊处理,因为 Istio 将所有传入的流量重定向到 Sidecar
所以所有 TCP 端口都显示为开放。kubelet 仅检查某个进程是否正在监听指定的端口,
因此只要 Sidecar 正在运行,该探针就总会成功。
Istio 通过重写应用程序 `PodSpec` 就绪/存活探针来解决这两个问题,以便将探针请求发送到 [Sidecar 代理](/zh/docs/reference/commands/pilot-agent/)。对于 HTTP 和 gRPC 请求Sidecar 代理将请求重定向到应用程序并剥离响应体,仅返回响应代码。对于 TCP 探针Sidecar 代理会在避免流量重定向的同时进行端口检查。
Istio 通过重写应用程序 `PodSpec` 就绪/存活探针来解决这两个问题,
以便将探针请求发送到 [Sidecar 代理](/zh/docs/reference/commands/pilot-agent/)。
对于 HTTP 和 gRPC 请求Sidecar 代理将请求重定向到应用程序并剥离响应体,仅返回响应代码。
对于 TCP 探针Sidecar 代理会在避免流量重定向的同时进行端口检查。
在所有内置的 Istio [配置文件](/zh/docs/setup/additional-setup/config-profiles/)中,有问题的探针的重写是默认启用的,但可以如下所述禁用。
在所有内置的 Istio [配置文件](/zh/docs/setup/additional-setup/config-profiles/)中,
有问题的探针的重写是默认启用的,但可以如下所述禁用。
## 使用命令方式的存活和就绪探针{#liveness-and-readiness-probes-using-the-command-approach}
## 使用命令方式的存活和就绪探针 {#liveness-and-readiness-probes-using-the-command-approach}
Istio 提供了一个[存活示例]({{< github_file >}}/samples/health-check/liveness-command.yaml)来实现这种方式。为了演示该探针在启用双向 TLS 的情况下如何工作,本例先创建一个命名空间:
Istio 提供了一个[存活示例]({{< github_file >}}/samples/health-check/liveness-command.yaml)来实现这种方式。
为了演示该探针在启用双向 TLS 的情况下如何工作,本例先创建一个命名空间:
{{< text bash >}}
$ kubectl create ns istio-io-health
@ -69,14 +77,18 @@ NAME READY STATUS RESTARTS AGE
liveness-6857c8775f-zdv9r 2/2 Running 0 4m
{{< /text >}}
## 使用 HTTP、TCP 和 gRPC 方式的存活和就绪探针{#liveness-and-readiness-probes-using-the-http-request-approach}
## 使用 HTTP、TCP 和 gRPC 方式的存活和就绪探针 {#liveness-and-readiness-probes-using-the-http-request-approach}
如上所述Istio 默认使用探针重写来实现 HTTP、TCP 和 gRPC 探针。您可以为特定 Pod 或全局禁用此特性。
如上所述Istio 默认使用探针重写来实现 HTTP、TCP 和 gRPC 探针。
您可以为特定 Pod 或全局禁用此特性。
### 为 Pod 禁用探针重写{#disable-the-http-probe-rewrite-for-a-pod}
### 为 Pod 禁用探针重写 {#disable-the-http-probe-rewrite-for-a-pod}
您可以使用 `sidecar.istio.io/rewriteAppHTTPProbers: "false"` 来[为 Pod 添加注解](/zh/docs/reference/config/annotations/)
以禁用探针重写选项。确保将注解添加到 [Pod 资源](https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-overview/),因为它会在其他任何地方被忽略(例如,在封闭的 Deployment 资源上)。
您可以使用 `sidecar.istio.io/rewriteAppHTTPProbers: "false"`
来[为 Pod 添加注解](/zh/docs/reference/config/annotations/)
以禁用探针重写选项。确保将注解添加到
[Pod 资源](https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-overview/)
因为在其他任何地方该注解会被忽略(例如,在封闭的 Deployment 资源上)。
{{< tabset category-name="disable-probe-rewrite" >}}
@ -124,31 +136,31 @@ kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: liveness-grpc
name: liveness-grpc
spec:
selector:
matchLabels:
app: liveness-grpc
version: v1
template:
metadata:
labels:
app: liveness-grpc
version: v1
annotations:
sidecar.istio.io/rewriteAppHTTPProbers: "false"
spec:
containers:
- name: etcd
image: registry.k8s.io/etcd:3.5.1-0
command: ["--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
ports:
- containerPort: 2379
livenessProbe:
grpc:
port: 2379
initialDelaySeconds: 10
periodSeconds: 5
selector:
matchLabels:
app: liveness-grpc
version: v1
template:
metadata:
labels:
app: liveness-grpc
version: v1
annotations:
sidecar.istio.io/rewriteAppHTTPProbers: "false"
spec:
containers:
- name: etcd
image: registry.k8s.io/etcd:3.5.1-0
command: ["--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
ports:
- containerPort: 2379
livenessProbe:
grpc:
port: 2379
initialDelaySeconds: 10
periodSeconds: 5
EOF
{{< /text >}}
@ -156,18 +168,20 @@ EOF
{{< /tabset >}}
这种方式允许您在单个 Deployment 上逐步禁用健康检查探针重写,而无需重新安装 Istio。
这种方式允许您在单个 Deployment 上逐步禁用健康检查探针重写,
而无需重新安装 Istio。
### 全局禁用探针重写{#disable-the-probe-rewrite-globally}
### 全局禁用探针重写 {#disable-the-probe-rewrite-globally}
[安装 Istio](/zh/docs/setup/install/istioctl/) 时使用 `--set values.sidecarInjectorWebhook.rewriteAppHTTPProbe=false`
全局禁用探针重写。**或者**,更新 Istio Sidecar 注入器的配置映射:
[安装 Istio](/zh/docs/setup/install/istioctl/) 时使用
`--set values.sidecarInjectorWebhook.rewriteAppHTTPProbe=false`
全局禁用探针重写。**或者**更新 Istio Sidecar 注入器的配置映射:
{{< text bash >}}
$ kubectl get cm istio-sidecar-injector -n istio-system -o yaml | sed -e 's/"rewriteAppHTTPProbe": true/"rewriteAppHTTPProbe": false/' | kubectl apply -f -
{{< /text >}}
## 清理{#cleanup}
## 清理 {#cleanup}
移除这些示例所用的命名空间:

View File

@ -7,16 +7,24 @@ test: yes
---
{{< warning >}}
该功能还处于 `Alpha` 阶段,参考 [Istio 功能状态](/zh/about/feature-stages/)。欢迎在 [Istio 用户经验探讨区](https://discuss.istio.io/c/UX/23) 提出您的反馈。目前这些功能仅在单控制平面低容量存储版本的集群中进行了测试。
该功能还处于 `Alpha` 阶段,参考 [Istio 功能状态](/zh/about/feature-stages/)。
欢迎在 [Istio 用户经验探讨区](https://discuss.istio.io/c/UX/23)提出您的反馈。
目前这些功能仅在单控制平面低容量存储版本的集群中进行了测试。
{{< /warning >}}
Istio 的网格配置是声明式的,意味着您声明或修改一个配置信息不会立即生效而是随着时间慢慢应用到网格中。因此您的命令很可能在相关资源就绪之前就开始使用了网格服务。
Istio 的网格配置是声明式的,意味着您声明或修改一个配置信息不会立即生效而是随着时间慢慢应用到网格中。
因此您的命令很可能在相关资源就绪之前就开始使用了网格服务。
在 Istio 1.6 及之后的版本,您可以使用 `kubectl wait` 命令对 Istio 应用配置更改到网格中的方式实行更好的掌控。为了实现该目的, `kubectl wait` 命令监控资源状态的 [`status`](/zh/docs/reference/config/config-status/) 字段,该字段在 Istio 完成配置更改时会被更新。
在 Istio 1.6 及之后的版本,您可以使用 `kubectl wait` 命令对
Istio 应用配置更改到网格中的方式实行更好的掌控。为了实现该目的,
`kubectl wait` 命令监控资源状态的 [`status`](/zh/docs/reference/config/config-status/)
字段,该字段在 Istio 完成配置更改时会被更新。
## 开始之前 {#before-you-begin}
该功能在默认情况下是关闭的。在安装的过程中使用以下命令设置 `status` 的相关配置参数开启该功能,此外您还必须启用 `config_distribution_tracking` 参数。
该功能在默认情况下是关闭的。在安装的过程中使用以下命令设置 `status`
的相关配置参数开启该功能,此外您还必须启用 `config_distribution_tracking`
参数。
{{< text syntax=bash snip_id=install_with_enable_status >}}
$ istioctl install --set values.pilot.env.PILOT_ENABLE_STATUS=true --set values.pilot.env.PILOT_ENABLE_CONFIG_DISTRIBUTION_TRACKING=true --set values.global.istiod.enableAnalysis=true
@ -24,7 +32,8 @@ $ istioctl install --set values.pilot.env.PILOT_ENABLE_STATUS=true --set values.
## 等待资源就绪 {#wait-for-resource-readiness}
您可以先 `apply` 更改的内容,然后等待完成。例如,等待下面的 `virtual service`,可以使用以下命令:
您可以先 `apply` 更改的内容,然后等待完成。例如,等待下面的
`virtual service`,可以使用以下命令:
{{< text syntax=bash snip_id=apply_and_wait_for_httpbin_vs >}}
$ kubectl apply -f @samples/httpbin/httpbin.yaml@
@ -33,8 +42,11 @@ $ kubectl wait --for=condition=Reconciled virtualservice/httpbin
virtualservice.networking.istio.io/httpbin condition met
{{< /text >}}
该命令会一直保持阻塞状态,直到 `virtual service` 被成功下发到网格内所有的代理中,或者命令执行超时。
该命令会一直保持阻塞状态,直到 `virtual service` 被成功下发到网格内所有的代理中,
或者命令执行超时。
当您在脚本中使用 `kubectl wait` 命令时,返回码 `0` 代表成功,非 `0` 代表超时状态。
关于更多用法和语法信息请参考 [kubectl wait](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#wait) 命令。
关于更多用法和语法信息请参考
[kubectl wait](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#wait)
命令。