istio部署-sidecar注入
参考
1. Sidecar注入
1.1 对工作负载的一些要求
- 支持的工作负载类型:
Job,DaemonSet,ReplicaSet,Pod,Deployment等, 对这些工作负载的要求如下:- 要正确命名服务端口:
Service对象中的Port部分必须以 "协议名" 为前缀,目前支持的协议名包括http,http2,mongo,redis与grpc;- istio 会命名来确定为端口提供什么样的服务,不符合命名规范的端口会被当做 TCP 服务器,其功能支持范围会大幅缩小。
- 工作负载的 Pod 必须有关联的 Service:
- 为满足服务发现的需要,所有 Pod 都必须有关联的服务;
- 官方建议为 Pod 模板加入两个标签:
app与version,分别标注应用名称与版本,虽仅是个建议,但 istio 很多默认策略会引用这两个标签,如果没有会引发很多不必要的麻烦。
- 要正确命名服务端口:
1.2 手工注入
# 准备测试用 yaml 文件
cd ~
git clone https://github.com/fleeto/flaskapp.git
cd ~/flaskapp
# istioctl kube-inject 会将 istio 相关容器注入应用,"-o" 参数将注入结果生成 yaml 文件 ,方便观察使用此命令与 "kubectl apply -f" 的区别;
# 新的 yaml 文件中多出了 "Sidecar" 容器, 并且出现了1个初始化容器 (initContainers) "istio-init" ,初始化容器即用来劫持应用通信到 "Sidecar" 容器的工具;
# 可直接 "kubectl apply -f" 生成的 yaml 文件
istioctl kube-inject -f flask.istio.yaml -o flask.istio.injected.yaml
1.3 自动注入
1.3.1 配置自动注入
- istio 的自动注入属性可通过
values.yaml文件调整。
# istio-1.1.7/install/kubernetes/helm/istio/values.yaml
sidecarInjectorWebhook:
# 开启 "Sidecar" 自动注入特性
enabled: true
replicaCount: 1
image: sidecar_injector
# "true":为所有命名空间开启自动注入功能
# "false":只有标签为 "istio-injection: enabled" 的命名空间开启自动注入功能
# 默认值:"false"
enableNamespacesBydefault: false
...
global:
proxy:
# 启动自动注入功能后,对于指定命名空间内新建 Pod 是否进行自动注入;
# "enabled":命名空间内的 Pod 只要没有被注解为 'sidecar.istio.io/inject: "false"',就会自动完成注入;
# "disabled":需要为 Pod 注解 'sidecar.istio.io/inject: "true"',才会进行注入;
# "sidecar.istio.io/inject" 没有所谓的默认值,未注解时,取决于 "autoInject" 的设置,"enabled" 则注入,"disabled" 则不注入
autoInject: enabled
1.3.2 测试
kubectl create ns auto
kubectl create ns manually
# 为命名空间 auto 注入标签
kubectl label namespaces auto istio-injection=enabled
# 在两个命名空间创建工作负载
cd ~
git clone https://github.com/fleeto/sleep.git
cd ~/sleep
kubectl apply -f sleep.yaml -n auto
kubectl apply -f sleep.yaml -n manually
# 查看命名空间 auto 是否有自动注入
kubectl get pod -n auto
kubectl get pod -n manually
1.3.3 ConfigMap istio-sidecar-injector
1.3.3.1 ConfigMap istio-sidecar-injector
- 不管是手工注入或自动注入,都可以通过编辑
istio-system命名空间中名为istio-sidecar-injector的ConfigMap资源,来影响注入效果;涉及两个标签(与policy同级): - neverInjectSelector:不管命名空间及策略如何,对符合标签选择器要求的 Pod 都不进行注入;
# 以下两个元素之间是 "或" 关系
neverInjectSelector:
- matchExpressions:
- {key: openshift.io/build.name, operator: Exists}
- matchExpressions:
- {key: openshift.io/deployer-pod--for.name, operator: Exists}
- alwaysInjectSelector:对符合标签选择器要求的 Pod ,不管全局策略如何,都会被注入 Sidecar。
1.3.3.2 修改 istio-sidecar-injector
- istioctl 根据
ConfigMap获取注入内容,即执行istioctl的用户必须能够访问安装了 istio 的 Kubernetes 集群中的这个ConfigMap;# 如果因某些原因不能访问,可以在 "istioctl" 中使用本地的配置文件;
# 采用具备 "ConfigMap" 获取权限的用户身份执行以下命令
kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}' > inject-config.yaml # 可对文件进行修改,并在 "istioctl" 中使用
istioctl kube-inject --injectConfigFile inject-config.yaml
1.3.4 自动注入的优先级
- 自动注入的评估顺序:
Pod 注解(优先级最高,如 Pod 中含注解sidecar.istio.io/inject: "true/false",则会被优先处理) --> neverInjectSelector --> alwaysInjectSelector --> 命名空间策略。 - autoInject,命名空间,Pod 注解的关联关系如下表:
| 命名空间,istio-injection=enabled | autoInject | Pod,sidecar.istio.io/inject | 是否注入 |
|---|---|---|---|
| 是 | enabled | true | 是 |
| 是 | enabled | false | 否 |
| 是 | enabled | 未注解 | 是 |
| 是 | disabled | true | 是 |
| 是 | disabled | false | 否 |
| 是 | disabled | 未注解 | 否 |
| 否 | enabled | true | 否 |
| 否 | enabled | false | 否 |
| 否 | enabled | 未注解 | 否 |
| 否 | disabled | true | 否 |
| 否 | disabled | false | 否 |
| 否 | disabled | 未注解 | 否 |
1.3.5 Sidecar 注入故障排查
- 查看
sidecar-injectorPod 资源日志;kubectl logs -f $(kubectl get pods -n istio-system -l istio=sidecar-injector -o jsonpath='{.items[0].metadata.name}') -n istio-system
- 创建业务 Pod ,查看日志输出;
- 更详细的日志,可以编辑
sidecar-injectorDeployment对象,为其添加args参数--log_output_level=default:debug; - 如果在
sidecar-injectorPod 资源日志还是未找到发生问题的原因,则代表sidecar-injector没有收到 Pod 创建的通知,也就不会触发自动注入操作,这可能是因为命名空间没有正确设置标签导致的,需要检查命名空间的标签及MutatingWebhookConfiguration中的配置:# 命名空间默认设置 "istio-injection=anabled" 标签;
# 可以检查其中的 "namespaceSelector" 字段与内容
kubectl edit MutatingWebhookConfiguration istio-sidecar-injector -n istio-system
istio部署-sidecar注入的更多相关文章
- istio的sidecar原理学习
目的 从内嵌到应用的SDK模式转成istio servicemesh,再到最新提出来的proxyless可谓是发展太快了.刚开始我只是围绕着服务注册和发现是怎么转变来展开研究,但是发现这个话题有点大, ...
- Istio Sidecar注入原理
概念 简单来说,Sidecar 注入会将额外容器的配置添加到 Pod 模板中.这里特指将Envoy容器注应用所在Pod中. Istio 服务网格目前所需的容器有: istio-init 用于设置 ip ...
- 1.深入Istio:Sidecar自动注入如何实现的?
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 这篇文章打算讲一下sidecar, ...
- istio部署-helm
参考 istio/istio istio/Kubernetes Customizable Install with Helm Istio安装参数介绍 1. Istio Chart 目录结构 PATH: ...
- istio部署
Istio的部署介绍 目录 Istio的部署介绍 部署模型 集群模式 单集群 多集群 网络模型 单网络 多网络 控制面模型 身份和信任模型 网格中的信任 网格之间的信任 网格模型 单网格 多网格 租户 ...
- istio部署-快速入门
参考 istio/istio Quick Start Evaluation Install fleeto/sleep fleeto/flaskapp 本文为 istio 快速入门部署,一般用于演示环境 ...
- [Istioc]Istio部署sock-shop时rabbitmq出现CrashLoopBackOff
因Istio官网自带的bookinfo服务依赖关系较少,因此想部署sock-shop进行进一步的实验. kubectl apply -f <(istioctl kube-inject -f so ...
- istio部署-istio jaeger & kiali
参考 fleeto/sleep fleeto/flaskapp jaegertracing/jaeger kiali kiali/kiali kiali/kiali-ui kiali/kiali/ta ...
- istio部署问题Q&A
端口绑定无权限 创建Gateway,提示绑定端口无权限. 2020-12-27T12:25:30.974288Z warning envoy config gRPC config for type.g ...
随机推荐
- 201871010110-李华《面向对象程序设计(java)》第十七周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- 剑指Offer-8.跳台阶(C++/Java)
题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 分析: 实际上就是斐波那契数列的一个应用,青蛙跳上n级台阶的跳法数等于跳 ...
- arduino (2) 浊度传感器
z https://detail.tmall.com/item.htm?id=601391726801&spm=a1z09.2.0.0.60082e8dMiX0LM&_u=e1qf7b ...
- Vue indent eslint缩进webstorm冲突解决
参考教程 官方回复 ESlint设置 rules: { 'no-multiple-empty-lines': [1, {max: 3}], // 控制允许的最多的空行数量 'vue/script-in ...
- PyCharm工具配置和快捷键使用
PyCharm是一款高效开发Python程序的IDE,包含有自动联想.语法高亮.代码调试.管理多个版本Python解释器等功能.本文主要描述Python界面个性化定制方法(字体.颜色配置).常用配置和 ...
- 深入理解Linux内核 学习笔记(8)
第八章 系统调用 API定义了一个给定的服务:系统调用是通过软中断向内核发出一个明确的请求. API可能不调用系统调用,也可能调用多个系统调用. Linux系统调用必须通过执行int 0x80,系统调 ...
- perf性能调优
工具准备 ubuntu:sudo apt-get install perf 嵌入式平台:下载源码编译 注意:编译过程中会有Auto-detectiing system feature的依赖库打印,注意 ...
- Vue.js 源码分析(二十二) 指令篇 v-model指令详解
Vue.js提供了v-model指令用于双向数据绑定,比如在输入框上使用时,输入的内容会事实映射到绑定的数据上,绑定的数据又可以显示在页面里,数据显示的过程是自动完成的. v-model本质上不过是语 ...
- Mysql 常用数据类型 占用字节数 [转]
数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则.Mysql的常用数据类型主要有: 串数据类型:最常用的数据类型,有两种基本的串类型:分别为定长串和不定长串.定长串结束长度固定的字符 ...
- 关于 Paket
参考地址:https://fsprojects.github.io/Paket/editor-support.html 1. 安装 Paket for Visual Studio,一个类似于 Nuge ...