创建服务账号 Secret
当 Citadel 实例注意到命名空间中创建了 ServiceAccount
时,它必须决定是否应该为该 ServiceAccount
生成 istio.io/key-and-cert
secret。 为了做出决定,Citadel 考虑三个输入(请注意:单个集群中可以部署多个 Citadel 实例,并且以下定位规则应用于每个实例):
ca.istio.io/env
命名空间标签:字符串值 包含所需 Citadel 实例的命名空间的标签ca.istio.io/override
命名空间标签:布尔值 覆盖所有其他配置,并强制所有 Citadel 实例定位或忽略命名空间的标签enableNamespacesByDefault 安全配置:如果在
ServiceAccount
的命名空间上找不到标签,则为默认行为
根据这三个值,其决策过程与 Sidecar Injection Webhook 的过程类似。具体行为是:
如果
ca.istio.io/override
存在并且为true
,则为工作负载生成密钥/证书 secret。否则,如果
ca.istio.io/override
存在并且为false
,则不为工作负载生成密钥/证书 secret。否则,如果服务账号所在命名空间上定义了
ca.istio.io/env: "ns-foo"
标签,则命名空间ns-foo
中的 Citadel 实例将被用于为ServiceAccount
的命名空间中的工作负载生成密钥/证书 secret。否则,就在安装时将
enableNamespacesByDefault
设置为true
。如果它是true
,默认的 Citadel 实例将被用于为ServiceAccount
的命名空间中的工作负载生成密钥/证书 secret。否则,将不会为
ServiceAccount
的命名空间创建 secret。
下面的真值表体现了该逻辑:
ca.istio.io/override 值 | ca.istio.io/env 匹配 | enableNamespacesByDefault 配置 | 是否为工作负载创建 secret |
---|---|---|---|
true | yes | true | yes |
true | yes | false | yes |
true | no | true | yes |
true | no | false | yes |
true | 未设置 | true | yes |
true | 未设置 | false | yes |
false | yes | true | no |
false | yes | false | no |
false | no | true | no |
false | no | false | no |
false | 未设置 | true | no |
false | 未设置 | false | no |
未设置 | yes | true | yes |
未设置 | yes | false | yes |
未设置 | no | true | no |
未设置 | no | false | no |
未设置 | 未设置 | true | yes |
未设置 | 未设置 | false | no |
当命名空间从 禁用 过渡到 启用 时,Citadel 将为该命名空间中的所有 ServiceAccounts
生成 secret。而从 启用 过渡到 禁用 时,Citadel 却不会删除命名空间中已经生成的 secret,直到更新了根证书为止。