仅为命名空间中的指定 pods 启用 Istio 自动注入
Enable Istio automatic injection only for specified pods within a namespace
我们在集群中设置了 Istio 并 运行,默认情况下启用自动注入,并在少数命名空间中启用。现在我们想对其他一些namespace中的一些pods做自动注入,但是遇到了一个问题,如果不为整个namespace开启指定的pod自动注入貌似是不可能的。我们使用 Argo 工作流自动创建 pods,因此我们在 Argo 工作流中指定 sidecar.istio.io/inject: "true"
,以便生成的 pods 在其元数据中显示此注释:
...
metadata:
annotations:
sidecar.istio.io/inject: "true"
...
不幸的是,除非命名空间将 istio-injection
标签显式设置为 enabled
,否则 Istio 仍然不会注入 sidecar,向那里的所有 pods 运行 添加 sidecar。
我们也不能使用手动注入,因为 pods 是由 Argo 服务自动创建的,我们希望根据工作流定义将边车仅注入到特定的 pods。
那么有什么方法可以解决这个问题吗?谢谢!
完整的 Argo 工作流程:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: presto-sql-pipeline-
annotations: {pipelines.kubeflow.org/kfp_sdk_version: 0.5.1, pipelines.kubeflow.org/pipeline_compilation_time: '2020-05-16T16:07:29.173967',
pipelines.kubeflow.org/pipeline_spec: '{"description": "Simple demo of Presto
SQL operator PrestoSQLOp", "name": "Presto SQL Pipeline"}'}
labels: {pipelines.kubeflow.org/kfp_sdk_version: 0.5.1}
spec:
entrypoint: presto-sql-pipeline
templates:
- name: presto-demo
container:
args:
- --source-name
- '{{workflow.namespace}}.{{workflow.name}}.presto-demo'
- --query-sql
- "SELECT 1;"
image: gcr.io/our-data-warehouse/presto-cli:latest
volumeMounts:
- {mountPath: /mnt/secrets, name: presto-local-vol}
metadata:
annotations:
sidecar.istio.io/inject: "true"
labels: {pipelines.kubeflow.org/pipeline-sdk-type: kfp}
volumes:
- name: presto-local-vol
secret: {secretName: presto-local}
- name: presto-sql-pipeline
dag:
tasks:
- {name: presto-demo, template: presto-demo}
arguments:
parameters: []
serviceAccountName: argo
我有类似的要求 - Istio 应该仅在 pod 指定时注入代理,而忽略所有其他 pods 的自动注入。
Istio 的官方文档中没有提到解决方案,但可以这样做。
如本 user defined custom matrix 中所述,当满足以下条件时,我们可以让 Istio 遵循此行为:
- 命名空间有标签
istio-injection=enabled
- Istio 全局代理自动注入策略已禁用(对于 helm 图表值:
global.proxy.autoInject
给定 here)。
- 需要代理的pod注解为
sidecar.istio.io/inject: "true"
.
所有其他 pods 将没有 Istio 代理。
我们在集群中设置了 Istio 并 运行,默认情况下启用自动注入,并在少数命名空间中启用。现在我们想对其他一些namespace中的一些pods做自动注入,但是遇到了一个问题,如果不为整个namespace开启指定的pod自动注入貌似是不可能的。我们使用 Argo 工作流自动创建 pods,因此我们在 Argo 工作流中指定 sidecar.istio.io/inject: "true"
,以便生成的 pods 在其元数据中显示此注释:
...
metadata:
annotations:
sidecar.istio.io/inject: "true"
...
不幸的是,除非命名空间将 istio-injection
标签显式设置为 enabled
,否则 Istio 仍然不会注入 sidecar,向那里的所有 pods 运行 添加 sidecar。
我们也不能使用手动注入,因为 pods 是由 Argo 服务自动创建的,我们希望根据工作流定义将边车仅注入到特定的 pods。
那么有什么方法可以解决这个问题吗?谢谢!
完整的 Argo 工作流程:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: presto-sql-pipeline-
annotations: {pipelines.kubeflow.org/kfp_sdk_version: 0.5.1, pipelines.kubeflow.org/pipeline_compilation_time: '2020-05-16T16:07:29.173967',
pipelines.kubeflow.org/pipeline_spec: '{"description": "Simple demo of Presto
SQL operator PrestoSQLOp", "name": "Presto SQL Pipeline"}'}
labels: {pipelines.kubeflow.org/kfp_sdk_version: 0.5.1}
spec:
entrypoint: presto-sql-pipeline
templates:
- name: presto-demo
container:
args:
- --source-name
- '{{workflow.namespace}}.{{workflow.name}}.presto-demo'
- --query-sql
- "SELECT 1;"
image: gcr.io/our-data-warehouse/presto-cli:latest
volumeMounts:
- {mountPath: /mnt/secrets, name: presto-local-vol}
metadata:
annotations:
sidecar.istio.io/inject: "true"
labels: {pipelines.kubeflow.org/pipeline-sdk-type: kfp}
volumes:
- name: presto-local-vol
secret: {secretName: presto-local}
- name: presto-sql-pipeline
dag:
tasks:
- {name: presto-demo, template: presto-demo}
arguments:
parameters: []
serviceAccountName: argo
我有类似的要求 - Istio 应该仅在 pod 指定时注入代理,而忽略所有其他 pods 的自动注入。 Istio 的官方文档中没有提到解决方案,但可以这样做。
如本 user defined custom matrix 中所述,当满足以下条件时,我们可以让 Istio 遵循此行为:
- 命名空间有标签
istio-injection=enabled
- Istio 全局代理自动注入策略已禁用(对于 helm 图表值:
global.proxy.autoInject
给定 here)。 - 需要代理的pod注解为
sidecar.istio.io/inject: "true"
.
所有其他 pods 将没有 Istio 代理。