安装 Sidecar

注入

为了利用 Istio 的所有功能,网格中的 Pod 必须运行 Istio sidecar 代理。

以下部分描述了两种将 Istio sidecar 注入 Pod 的方法:在 Pod 的命名空间中启用自动 Istio sidecar 注入,或手动使用 istioctl 命令。

在 Pod 的命名空间中启用后,自动注入将在 Pod 创建时使用准入控制器注入代理配置。

手动注入直接修改配置(如部署),通过向其中添加代理配置。

如果您不确定使用哪一种,建议使用自动注入。

自动 Sidecar 注入

可以使用 Istio 提供的 变异 Webhook 准入控制器 自动将 Sidecar 添加到适用的 Kubernetes Pod 中。

当您在命名空间上设置 istio-injection=enabled 标签且注入 Webhook 已启用时,在该命名空间中创建的任何新 Pod 将自动添加一个 Sidecar。

请注意,与手动注入不同,自动注入发生在 Pod 级别。您不会看到对部署本身的任何更改。相反,您需要检查各个 Pod(通过 kubectl describe)以查看注入的代理。

部署应用程序

部署 curl 应用程序。验证部署和 Pod 是否都只有一个容器。

压缩
$ kubectl apply -f @samples/curl/curl.yaml@
$ kubectl get deployment -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                    SELECTOR
curl    1/1     1            1           12s   curl         curlimages/curl           app=curl
$ kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
curl-8f795f47d-hdcgs    1/1     Running   0          42s

使用 istio-injection=enableddefault 命名空间添加标签。

$ kubectl label namespace default istio-injection=enabled --overwrite
$ kubectl get namespace -L istio-injection
NAME                 STATUS   AGE     ISTIO-INJECTION
default              Active   5m9s    enabled
...

注入发生在 Pod 创建时。终止正在运行的 Pod 并验证是否创建了一个包含注入 Sidecar 的新 Pod。原始 Pod 有 1/1 READY 个容器,而包含注入 Sidecar 的 Pod 有 2/2 READY 个容器。

$ kubectl delete pod -l app=curl
$ kubectl get pod -l app=curl
pod "curl-776b7bcdcd-7hpnk" deleted
NAME                     READY     STATUS        RESTARTS   AGE
curl-776b7bcdcd-7hpnk    1/1       Terminating   0          1m
curl-776b7bcdcd-bhn9m    2/2       Running       0          7s

查看注入 Pod 的详细状态。您应该看到注入的 istio-proxy 容器和相应的卷。

$ kubectl describe pod -l app=curl
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  ...
  Normal  Created    11s   kubelet            Created container istio-init
  Normal  Started    11s   kubelet            Started container istio-init
  ...
  Normal  Created    10s   kubelet            Created container curl
  Normal  Started    10s   kubelet            Started container curl
  ...
  Normal  Created    9s    kubelet            Created container istio-proxy
  Normal  Started    8s    kubelet            Started container istio-proxy

禁用 default 命名空间的注入并验证是否在没有 Sidecar 的情况下创建了新的 Pod。

$ kubectl label namespace default istio-injection-
$ kubectl delete pod -l app=curl
$ kubectl get pod
namespace/default labeled
pod "curl-776b7bcdcd-bhn9m" deleted
NAME                     READY     STATUS        RESTARTS   AGE
curl-776b7bcdcd-bhn9m    2/2       Terminating   0          2m
curl-776b7bcdcd-gmvnr    1/1       Running       0          2s

控制注入策略

在以上示例中,您在命名空间级别启用和禁用了注入。注入也可以在每个 Pod 的基础上进行控制,方法是在 Pod 上配置 sidecar.istio.io/inject 标签。

资源标签启用值禁用值
命名空间istio-injectionenableddisabled
Podsidecar.istio.io/inject"true""false"

如果您使用的是 控制平面版本,则匹配的 istio.io/rev 标签将改为使用特定于版本的标签。例如,对于名为 canary 的版本

资源启用标签禁用标签
命名空间istio.io/rev=canaryistio-injection=disabled
Podistio.io/rev=canarysidecar.istio.io/inject="false"

如果 istio-injection 标签和 istio.io/rev 标签都存在于同一个命名空间中,则 istio-injection 标签将优先。

注入器配置了以下逻辑

  1. 如果任何一个标签(istio-injectionsidecar.istio.io/inject)被禁用,则不会注入 Pod。
  2. 如果任何一个标签(istio-injectionsidecar.istio.io/injectistio.io/rev)被启用,则会注入 Pod。
  3. 如果这两个标签都没有设置,则如果启用了 .values.sidecarInjectorWebhook.enableNamespacesByDefault,则会注入 Pod。默认情况下不会启用此选项,因此通常这意味着不会注入 Pod。

手动 Sidecar 注入

要手动注入部署,请使用 istioctl kube-inject

压缩
$ istioctl kube-inject -f @samples/curl/curl.yaml@ | kubectl apply -f -
serviceaccount/curl created
service/curl created
deployment.apps/curl created

默认情况下,这将使用集群内配置。或者,可以使用配置的本地副本进行注入。

$ kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}' > inject-config.yaml
$ kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.values}' > inject-values.yaml
$ kubectl -n istio-system get configmap istio -o=jsonpath='{.data.mesh}' > mesh-config.yaml

在输入文件上运行 kube-inject 并部署。

压缩
$ istioctl kube-inject \
    --injectConfigFile inject-config.yaml \
    --meshConfigFile mesh-config.yaml \
    --valuesFile inject-values.yaml \
    --filename @samples/curl/curl.yaml@ \
    | kubectl apply -f -
serviceaccount/curl created
service/curl created
deployment.apps/curl created

验证 Sidecar 是否已注入 curl Pod,READY 列下显示 2/2

$ kubectl get pod  -l app=curl
NAME                     READY   STATUS    RESTARTS   AGE
curl-64c6f57bc8-f5n4x    2/2     Running   0          24s

自定义注入

通常,Pod 是根据 sidecar 注入模板注入的,该模板在 istio-sidecar-injector ConfigMap 中配置。可以使用每个 Pod 配置来覆盖单个 Pod 上的这些选项。这可以通过向 Pod 添加 istio-proxy 容器来完成。Sidecar 注入将把此处定义的任何配置视为对默认注入模板的覆盖。

自定义这些设置时应谨慎,因为这允许完全自定义生成的 Pod,包括进行导致 Sidecar 容器无法正常运行的更改。

例如,以下配置自定义了各种设置,包括降低 CPU 请求、添加卷挂载和添加 preStop 钩子。

apiVersion: v1
kind: Pod
metadata:
  name: example
spec:
  containers:
  - name: hello
    image: alpine
  - name: istio-proxy
    image: auto
    resources:
      requests:
        cpu: "100m"
    volumeMounts:
    - mountPath: /etc/certs
      name: certs
    lifecycle:
      preStop:
        exec:
          command: ["curl", "10"]
  volumes:
  - name: certs
    secret:
      secretName: istio-certs

一般来说,可以设置 Pod 中的任何字段。但是,某些字段需要谨慎。

  • Kubernetes 要求在注入运行之前设置 image 字段。虽然您可以设置特定镜像以覆盖默认镜像,但建议将 image 设置为 auto,这将导致 Sidecar 注入器自动选择要使用的镜像。
  • Pod 中的某些字段依赖于相关设置。例如,CPU 请求必须小于 CPU 限制。如果这两个字段没有一起配置,则 Pod 可能会启动失败。
  • 在某些情况下,字段 securityContext.RunAsUsersecurityContext.RunAsGroup 可能不会生效,例如,当使用 TPROXY 模式时,因为它需要 Sidecar 以用户 0 身份运行。错误地覆盖这些字段会导致流量丢失,因此应谨慎操作。

此外,某些字段可以通过 Pod 上的 注释 进行配置,尽管建议使用上述方法自定义设置。对于某些注释,必须格外小心。

  • 如果设置了 sidecar.istio.io/proxyCPU,请确保显式设置 sidecar.istio.io/proxyCPULimit。否则,Sidecar 的 cpu 限制将设置为无限制。
  • 如果设置了 sidecar.istio.io/proxyMemory,请确保显式设置 sidecar.istio.io/proxyMemoryLimit。否则,Sidecar 的 memory 限制将设置为无限制。

例如,请参阅以下不完整的资源注释配置和相应的注入资源设置。

spec:
  template:
    metadata:
      annotations:
        sidecar.istio.io/proxyCPU: "200m"
        sidecar.istio.io/proxyMemoryLimit: "5Gi"
spec:
  containers:
  - name: istio-proxy
    resources:
      limits:
        memory: 5Gi
      requests:
        cpu: 200m
        memory: 5Gi
      securityContext:
        allowPrivilegeEscalation: false

自定义模板(实验性)

还可以在安装时定义完全自定义的模板。例如,要定义一个自定义模板,该模板将 GREETING 环境变量注入 istio-proxy 容器

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio
spec:
  values:
    sidecarInjectorWebhook:
      templates:
        custom: |
          spec:
            containers:
            - name: istio-proxy
              env:
              - name: GREETING
                value: hello-world

默认情况下,Pod 将使用 sidecar 注入模板,该模板是自动创建的。这可以通过 inject.istio.io/templates 注释覆盖。例如,要应用默认模板和我们的自定义项,您可以设置 inject.istio.io/templates=sidecar,custom

除了 sidecar 之外,默认情况下还提供了一个 gateway 模板来支持将代理注入网关部署。

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

感谢您的反馈!