sidecar-inject代码分析

栏目: 服务器 · 发布时间: 6年前

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工作流程图

sidecar-inject代码分析

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资源等。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法与数据结构

算法与数据结构

张乃孝 / 高等教育出版社 / 2006-1 / 31.00元

《算法与数据结构:C语言描述(第2版)》以数据结构为主线,算法为辅线组织教学内容。全书共分10章:绪论、线性表、字符串、栈与队列、二叉树与树、集合与字典、高级字典结构、排序、图和算法分析与设计。《算法与数据结构:C语言描述(第2版)》体系完整,概念清楚,内容充实,取材适当。第一版被列入“面向21世纪课程教材”,2004年被评为“北京市高等教育精品教材”,第二版被列入普通高等教育“十一五”国家级规划......一起来看看 《算法与数据结构》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具