sidecar-inject代码分析
Istio通过对serviceMesh中的每个pod注入sidecar,来实现无侵入式的服务治理能力。其中,sidecar的注入是其能力实现的重要一环(本文主要介绍在kubernetes集群中的注入方式)。sidecar注入有两种方式,一是通过创建webhook资源,利用k8s的webhook能力实现pod的自动注入,二是通过istioctl工具,对yaml文件进行手动注入。在这里对这两种方式进行简单介绍。
一、webhook自动注入:
a) 准备条件:
i. 自动注入功能需要kubernetes 1.9或更高版本;
ii. 需要在kube-apiserver的启动参数中加入--admission-control=MutatingAdmissionWebhook,ValidatingAdmissionWebhook
iii. k8s中webhook需要签名密钥对,用于自动注入时的认证鉴权。(此处可通过install/kubernetes/webhook-create-signed-cert.sh脚本生成,这个脚本会调用kubernetes的CSR API生成一个具有K8S签名的密钥对,用于Webhook。然后建立一个secret存放证书信息。)
iv. 可通过在sidecar-injector的configmap中设置policy=disabled字段来设置是否启用自动注入,同时也可以在deployment中通过设置annotation,sidecar.istio.io/inject=true来控制pod级别的自动注入。
v. 为需要自动注入的namespace打上标签istio-injection: enabled。
vi. 确保master到node容器网络通信正常。
b) 定义webhook文件,格式如下(在helm包的sidecarInject中)。这里的语义就是,监听具有istio-injection: enabled的label的namespace下的pod资源,当发生rules(CREATE POD)的动作时,则调用services(istio-sidecar-injector.namespace的/inject接口)。
apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingWebhookConfiguration
metadata:
name: istio-sidecar-injector
namespace: {{ .Release.Namespace }}
labels:
app: istio-sidecar-injector
webhooks:
- name: sidecar-injector.istio.io
clientConfig:
service:
name: istio-sidecar-injector
namespace: {{ .Release.Namespace }}
path: "/inject"
caBundle: ""
rules:
- operations: [ "CREATE" ]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
failurePolicy: Fail
namespaceSelector:
matchLabels:
istio-injection: enabled
c)
webhook工作流程图
d)
inject代码分析(代码位置pilot/pkg/kube/inject/webhook.go):
i.
sidecar-inject接收kube-master发出的自动注入请求,并校验、解析请求结构体(请求体中包含触发条件中,creating的pod的结构体。)
ii.
判断是否需要注入,筛选满足条件的pod,筛选条件包括:是否开启了hostNewWork、是否为需要注入的ns、annotation中是否指定为需要注入等条件;
iii.
若满足条件则进行注入,注入的sidecar的镜像信息、启动参数、挂载信息等内容,存储在sidecar-inject的configmap中,注入时会从configmap中提取对应的值,填到模板中,再将填好值的模板注入到pod中;
iv.
将注入好的pod信息返还给kube-master,完成自动注入。
二、istioctl手动注入(代码位置istioctl/cmd/istioctl/inject;
pilot/pkg/kube/inject/inject.go):
a)
手动注入操作步骤:
i.
下载istioctl工具并拷贝至环境,链接https://github.com/istio/istio/releases/
;
ii.
将istioctl二进制拷贝至/usr/local/bin目录下
mv -f istioctl /usr/local/bin
iii. 安装Istio控制面,确认注入相关configmap已创建成功
$ kubectl get cm -n istio-system | grep istio-sidecar-injector
istio-sidecar-injector 1 15h
iv. 准备需要注入的文件test.yaml
v. 执行istioctl会在原始内容的基础上加入sidecar的配置内容,并输出到控制台。
$ istioctl kube-inject -f test.yaml
vi. 将istioctl处理之后的内容部署到kubernetes上
$kubectl apply -f <(istioctl kube-inject -f test.yaml)
vii. 可以通过k8s命令查看pod详细内容
$kubectl describe pod test-c9f4b55c7-np4cf
b) 代码分析:
i. 首先打开原始deploy.yaml文件或读取控制台输入,读取为文件流;
ii. 从config文件或k8s的configmap中读取sidecar模板所需的值(同上述c中第三步)。
iii. 将上步得到的值填入sidecar模板中,生成模板实例;
iv. 将模板实例注入到源deployment中,生成注入好的文件。
三、总结:
这里更推荐自动注入的方式来实现sidecar的注入,可以通过在deployment的annotation中加入对应的key来实现自动注入的控制。而源码部分,注入的逻辑并不复杂,主要是对k8s中webhook的使用,以及通过模板,向deployment中注入相应的container资源等。
sidecar-inject代码分析的更多相关文章
- hello1和hello2代码分析
1.hello1代码分析 hello.java package javaeetutorial.hello1; import javax.enterprise.context.RequestScoped ...
- hello1 hello2 代码分析
1.hello1代码分析 hello.java package javaeetutorial.hello1; import javax.enterprise.context.RequestScoped ...
- hello1与hello2的代码分析
1.hello1代码分析 hello.java package javaeetutorial.hello1; import javax.enterprise.context.RequestScoped ...
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- pmd静态代码分析
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...
- [Asp.net 5] DependencyInjection项目代码分析-目录
微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- STM32启动代码分析 IAR 比较好
stm32启动代码分析 (2012-06-12 09:43:31) 转载▼ 最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...
随机推荐
- 10分钟彻底理解Redis持久化和主从复制
在这篇文章,我们一起了解 Redis 使用中非常重要的两个机制:Reids 持久化和主从复制. 什么是 Redis 持久化? Redis 作为一个键值对内存数据库(NoSQL),数据都存储在内存当中, ...
- Flink实时处理并将结果写入ElasticSearch实战
参考原博客: https://blog.csdn.net/weixin_44516305/article/details/90258883 1 需求分析 使用Flink对实时数据流进行实时处理,并将处 ...
- Vuejs函数式组件,你值得拥有(1)
函数式组件在React社区很流行使用,那么在vue里面我们要怎么用呢 下面会涉及到的知识点: 高阶函数.状态.实例.vue组件 什么是函数式组件 我们可以把函数式组件想像成组件里的一个函数,入参是渲染 ...
- 清除input的历史记录
原始代码: <input class="" type="text"></input> 加上“autocomplete”属性,禁止历史的显 ...
- Ajax serialize()提交form表单不能上传file类型
前台form表单的提交方式有很多种,例如: 1. form表单submit直接提交的方法 2. Ajax提交的方法 3. jquery提交的方法 4. 原生js提交的方法 每一种方法都有它的优势和不足 ...
- 九、postman的自带的鉴权demo
basic authentication https://postman-echo.com/basic-auth username:postman password:password
- ActiveMQ之三--JMS-Spring和ActiveMQ整合的完整实
这篇博文,我们基于Spring+JMS+ActiveMQ+Tomcat,做一个Spring4.1.0和ActiveMQ5.11.1整合实例,实现了Point-To-Point的异步队列消息和PUB/S ...
- windows nginx 快捷启动关闭批处理脚本
:: 关闭回显,即执行本脚本时不显示执行路径和命令,直接显示结果 @echo off rem @author luwuer color f8 set NGINX_DIR=D:\nginx-1.12.2 ...
- WPF分析工具
分析WPF程序是理解其行为很重要的一步,市场上有大量现成的WPF程序分析工具,如Snoop,WPFPerf,Perforator和Visual Profiler,其中Perforator和Visual ...
- 算法习题---5.8Unix ls命令(Uva400)
一:题目 输入正整数n以及n个文件名,将这n个文件名按照ASCII优先升序排列,按列优先方式左对齐输出. 注意:文件名最长的为M,那么最右列字符串长度为M,其他列的长度为M+2 注意:一列最多允许出现 ...