ITPub博客

首页 > 云计算 > Docker/K8 > sidecar-inject代码分析

sidecar-inject代码分析

原创 Docker/K8 作者:PaaS小魔仙 时间:2018-09-07 10:39:52 0 删除 编辑

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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31543630/viewspace-2213730/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-06-25

  • 博文量
    33
  • 访问量
    8621