通常我们部署了istio,都会配置下集群的哪些命名空间下的服务需要被istio管理,其实就是哪些pod需要注入envoy这个sidecar,如果希望命名空间A的pod都注入sidecar,我们可以将命名空间配置成sidecar的自动注入,这样在A命名空间下的pod就默认都会注入sidecar了。TCM给命名空间注入sidecar的方式和原生还是要有点区别,今天这里讲解下如何在tke集群的命名空间自动注入TCM的sidecar容器。
原生的istio的给命名空间配置自动注入是直接给命名空间打label
代码语言:javascript复制kubectl label namespace default istio-injection=enabled
如果需要取消sidecar的自动注入,去掉命名空间下的label即可
代码语言:javascript复制kubectl label namespace default istio-injection-
但是在tcm上配置自动注入的方式有点不一样,由于tcm有自己的一些订制,所以给命名空间打的label是不一样的
1. 控制台配置sidecar自动注入
我们可以在TCM控制台进入服务网格实例,然后选择服务,点击sidecar自动注入,选择对应的命名空间即可。
2. 命令配置sidecar自动注入
采用命令配置sidecar的自动注入,需要根据你的istio版本来给命名空间打上label,现在tcm提供了1.6.9和1.8.1这2个版本的istio
如果你的istio版本是1.6.9,则需要给命名空间打上如下label完成自动注入
代码语言:javascript复制kubectl label ns xxxx istio.io/rev=1-6-9
如果你的istio版本是1.8.1,则需要给命名空间打上如下label完成自动注入
代码语言:javascript复制kubectl label ns xxxx istio.io/rev=1-8-1
但是这里会有一个问题,就是有时候给命名空间打上label了,但是还是发下无法注入,这里是因为我们一开始会潜意识的给命名空间注入istio-injection=enabled
这个label,然后有打上了istio.io/rev=1-x-x
这个label,这里有个问题就是这2个label同时存在的时候自动注入会不生效,需要删除掉istio-injection=enabled才行,这里大家需要注意下。
3. 自动注入sidecar的原理
为什么tcm需要给命名空间打的label和原生的isito不一样呢,这里的原因是什么呢?其实这里需要从istio中自动注入的原理来解释分析下,其实自动注入这里是调用了一个istio的webhook,当admissionregistration
配置被应用。默认配置将 sidecar 注入到所有拥有istio.io/rev=1-x-x
标签的 namespace 下的 pod 中。istio-sidecar-injector
配置字典指定了注入 sidecar 的配置。如需更改指定哪些 namespace 被注入,你可以使用以下命令编辑MutatingWebhookConfiguration
[root@VM-0-13-centos kube]# kubectl get mutatingwebhookconfiguration istio-sidecar-injector-1-8-1 | grep istio
istio-sidecar-injector-1-8-1 1 31d
[root@VM-0-13-centos kube]# kubectl get mutatingwebhookconfiguration istio-sidecar-injector-1-8-1 -o yaml
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
creationTimestamp: "2021-03-19T05:48:20Z"
generation: 4
labels:
app: sidecar-injector
install.operator.istio.io/owning-resource: tcm
istio.io/rev: 1-8-1
operator.istio.io/component: Pilot
release: istio
manager: mesh-manager
operation: Update
time: "2021-03-19T05:48:20Z"
manager: pilot-discovery
operation: Update
time: "2021-03-19T05:49:10Z"
name: istio-sidecar-injector-1-8-1
resourceVersion: "7458502343"
selfLink: /apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurations/istio-sidecar-injector-1-8-1
uid: f4d6f61a-e0c8-4376-9000-bb5862c2675f
webhooks:
- admissionReviewVersions:
- v1beta1
- v1
clientConfig:
caBundle: LS0tLS1CRVNPVmhKT05EZnhmb2xNWExYUGd3RFFZSktvWklodmNOQVdBMVVURZeQpORFV3V2hjTk16QXhNakkxTVRZeU5EVXdXakFpTVE0d0RBWURWUVFLRXdWSmMzUnBiekVRTUE0R0ExVUVBeE1IClVtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTFlscTJrVjJYdE4KMXIwb0VaZkdrRzloYmdlaFhFSzI0MWNDSDhwTkFxZndBdkZBZWFMYVNZTkNZblRsd3lLTXRPSENqQW81NEQvcApmNytRU21TSFUra3JBOHNRczA4ZWFhR2JaWU5GNFZJeEl1UVlnS1ltM3R4NWx6N1JzcjBuU3FPRzBLTVUzYlhwClBQZDhSOWMxVXRFZWM0dHVmdFQwRXNSUWtDNnJETVd3RE1NbEFjMGhFTlRtZmtlN1U5c1kwcEdTYllGSTRGejMKa0ZNdFBnM1djUVVnOE5WTFQzdm93YWtpUGFnaHgzVVQvdTZFT0xrcStQekJMcWt2ZFdMdEJLZFlYelJQd3NhagpuK010ZTV2YStOUHRQd2xBMGw1c1VtWHluUldHOC9idUt5bDVObTdaZkpZQkI1VURkamE1U0lxZEcyYzEwQ3JaClU5NWpqTUVNaE4rdDNMZlVOOHBKQVU1THlPRk10a1JmanhWcktscEcxeWRtNUVIWmJmbUF2dG9DS05DQkxhdWkKL3RnUmJTSnRDUGlQZHB2amZyUTFnemo0SWdiQ2lkZ1FOalMrcVduai9MRTVBQ0dGK3cxcVdIbXM5bzV4SUV6Tgo5aXBaQ1g4ZTMrODBUSy9vUDlRSjhGc2Uwc0RwR2ljcHdYTW1iYTlhM21KSFpwSjg3NGlEbHN6bVM5bytsMlV1CnNUM0hMT0FGVmJSKzh6bkJOdkxPaTIwZkZhUm1MeFF0WTQ4eFdBdjJ3V0NtVDhFU1daV2R1MDQxODhDekNJWnoKR0l6SG9PcGN2VlVFT293RHBDWWsxOHk3LzUyb2swMkFHdWxPTkZ1WUlGUWRmaS95Z1lVbjdScndkNFhWTU94bwo3UmhKanNZWkpjaFpieWxNR2VFVlZ6TjJVT3dIV3B4TkFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lDCjVEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUWV1QzZHL1djaUt4RXFnZktPMjkwcG85KzEKTWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUZwU1NpMHZlbzUzQ0lpVEFBcTJRY2JUdk1qN29FMFNvaXRscwpieFE3ZjRpbGdvQnVRUjJGQzBReEZMOVJjc3FsV0Z2bitnYnZWM2ZlOEZkNWtrdTJSZ3lTYk5wcllLTmpmZVRsCjdxSTJ4Y2ZWNUtWMXdvSnhERDQ1UVdTMVU3VjczajVhcmdvOHBLNFJUekxIMkxIREVXN2M1YzJJN2d6amlHMUMKenp0ZnJseTh3ZjdhTGZMZjNFOGM0YTBrVXZHMkxJOE5mOElPSkpiTDE1L0N4ZDk5Ynh6V0JQd01peVNyc2RuYQppSnQyc2E2ck56VUpJRWVVWEgxT0tvSm81dHVBTHBzbFRNT1Y5QXZvWnliSFFXY0hqRXVGUWdnSXcrRUw0VTIxCjVlQ3JzU2l5Kzc3YitFK2xzTEdCaW5VUlUyMUJRckVRcDdMeGtVSEtOWnk5dml4Tk0ydDVHb05uR1ZtUWFWcEgKcHgxNlhrUHg4MTRoQlRPb0VHVThvNERKc0xZTHpxcGUxUWFZSi9jQ2ZDckgrOU5rQ1ZFdS81OXQ1a01RNDBHOApWaUJMSTd3VXVFU1phbEhxUHEreGFTanVReVNReUN3OTZ3NjE3WEI3TlRxdTM4Vml6SnNCb1RBZ2xvU0xESVYzCm13V2V2RjMzZ1l0bGRSZXZQSEpRTlNxeVlWcklWbmRsUnpMVURtZkF2dmpNdERuUi9UTmdHWUtZc0o1TjRSRUcKZU5TT1JOWERhWDNoZzZXWlpyQlYySmsxenE0eUgreVdTd3RrMUNOK0JMYzBMdGRCcGdic2xibWhJaDdPakpyRApxL0R1Z09IRWJwSnNJRXoyenFKempTOUV2MXJGbmxPcFFyL1NCdTlmTTZzeDZJb3M1cUwyc1RZTVY0V3lQTW1OClRPTFoxRGM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
service:
name: istiod-1-8-1
namespace: istio-system
path: /inject
port: 443
failurePolicy: Fail
matchPolicy: Exact
name: sidecar-injector.istio.io
namespaceSelector:
matchExpressions:
- key: istio-injection
operator: DoesNotExist
- key: istio.io/rev
operator: In
values:
- 1-8-1
objectSelector: {}
reinvocationPolicy: Never
rules:
- apiGroups:
- ""
apiVersions:
- v1
operations:
- CREATE
resources:
- pods
scope: '*'
sideEffects: None
timeoutSeconds: 30
从上面的webhook配置yaml可以看出为什么tcm上自动注入的标签和原生的不一样,其实就是namespaceSelector这个字段配置导致的,tcm的webhook里面需要匹配命名空间的label必须是istio.io/rev: 1-8-1
才能被webhook拦截。
通过指定 namespaceSelector
,Webhook 可以根据具有名字空间的资源所处的 名字空间的标签来选择拦截哪些资源的操作。
namespaceSelector
根据名字空间的标签是否匹配选择器,决定是否针对具名字空间的资源 (或 Namespace 对象)的请求运行 webhook。 如果对象是除 Namespace 以外的集群范围的资源,则 namespaceSelector
标签无效。
所以这里需要给命名空间打上istio.io/rev: 1-8-1才能实现自动注入。
4. 单独给pod注入sidecar
如果我们给命名空间打上了label,那么在这个命名空间下的所有pod都会自动注入sidecar,但是有的时候我们希望命名空间下某些pod不被istio管理,那么我们可以单独在workload配置下即可,在spec.template.metadata.annotations
这个字段加上这个配置sidecar.istio.io/inject:"false"
如果想注入sidecar的话,可以将false改为ture
这里我们有一个test pod默认是注入sidecar的,现在我们取消这个sidecar注入
我们修改下yaml文件,加上这个字段,设置成false,然后apply下这个yaml文件,pod启动成功后,我们再查看日志可以发现,只有一个容器的日志了,sidecar已经去掉了。
参考文档
https://istio.io/latest/zh/docs/setup/additional-setup/sidecar-injection/