安装 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=enabled
为 default
命名空间添加标签。
$ 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-injection | enabled | disabled |
Pod | sidecar.istio.io/inject | "true" | "false" |
如果您使用的是 控制平面版本,则匹配的 istio.io/rev
标签将改为使用特定于版本的标签。例如,对于名为 canary
的版本
资源 | 启用标签 | 禁用标签 |
---|---|---|
命名空间 | istio.io/rev=canary | istio-injection=disabled |
Pod | istio.io/rev=canary | sidecar.istio.io/inject="false" |
如果 istio-injection
标签和 istio.io/rev
标签都存在于同一个命名空间中,则 istio-injection
标签将优先。
注入器配置了以下逻辑
- 如果任何一个标签(
istio-injection
或sidecar.istio.io/inject
)被禁用,则不会注入 Pod。 - 如果任何一个标签(
istio-injection
或sidecar.istio.io/inject
或istio.io/rev
)被启用,则会注入 Pod。 - 如果这两个标签都没有设置,则如果启用了
.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.RunAsUser
和securityContext.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
模板来支持将代理注入网关部署。