博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Istio技术与实践03:最佳实践之sidecar自动注入
阅读量:5141 次
发布时间:2019-06-13

本文共 4312 字,大约阅读时间需要 14 分钟。

webhook自动注入:

准备条件:

  • 自动注入功能需要kubernetes 1.9或更高版本;

  • kubernetes环境需支持MutatingAdmissionWebhook;

$ kubectl api-versions | grep admissionregistration

admissionregistration.k8s.io/v1beta1

  • 需要在kube-apiserver的启动参数中加入;

——admission-control=MutatingAdmissionWebhook,ValidatingAdmissionWebhook
  • 确保master到node容器网络通信正常。

自动注入控制:

  • 可通过在sidecar-injector的configmap中设置policy=disabled字段来设置是否启用自动注入(此处为全局控制是否启用自动注入功能);

$ kubectl get cm istio-sidecar-injector -nistio-systemapiVersion: v1kind: ConfigMapmetadata:name: istio-sidecar-injectornamespace: istio-systemdata:config: |-    policy: enabled     //enabeld为开启,disabeld为关闭
  • 为需要自动注入的namespace打上标签istio-injection: enabled(此处为ns级别的自动注入控制)。

$ kubectl get namespace -L istio-injectionNAME           STATUS    AGE       ISTIO-INJECTIONdefault        Active    1histio-system   Active    1hkube-public    Active    1hkube-system    Active    1h$ kubectl label namespace default istio-injection=enablednamespace "default" labeled$ kubectl get namespace -L istio-injectionNAME           STATUS    AGE       ISTIO-INJECTIONdefault        Active    1h        enabledistio-system   Active    1hkube-public    Active    1hkube-system    Active    1h
  • 同时也可以在deployment中通过设置annotation,sidecar.istio.io/inject=true来控制pod级别的自动注入。

apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: testspec:replicas: 1template:metadata:annotations:sidecar.istio.io/inject: “true”// true为启用自动注入,false为关闭自动注入
  • 定义webhook参数文件MutatingWebhookConfiguration,格式如下(在helm包的sidecarInject中)。

这里的语义就是,监听具有istio-injection: enabled的label的namespace下的pod资源,当发生rules(CREATE POD)的动作时,则调用services(istio-sidecar-injector.istio-system的/inject接口)。

apiVersion: admissionregistration.k8s.io/v1beta1kind: MutatingWebhookConfigurationmetadata: name: istio-sidecar-injectornamespace: {
{ .Release.Namespace }}labels:app: istio-sidecar-injectorwebhooks:- name: sidecar-injector.istio.io clientConfig:service: name: istio-sidecar-injectornamespace: {
{ .Release.Namespace }} path: "/inject"caBundle: ""rules:- operations: [ "CREATE" ]apiGroups: [""]apiVersions: ["v1"]resources: ["pods"]failurePolicy: FailnamespaceSelector:matchLabels:istio-injection: enabled
  • webhook工作流程图

介绍了自动注入的注意事项与原理,终于可以测试下自动注入的结果了

  • 首先安装Istio控制面,确保sidecar-inject安装完成;

$ kubectl get po -nistio-system | grep sidecar-injectoristio-sidecar-injector-5fb5999bf8-59k79          1/1       Running   01d
  • 部署一个简单的测试deploy,此处我们以nginx为例;

$ kubectl get po | grep nginxnginx-v1-74c674fbd5-fl9bh         1/1       Running   0          22s
  • 我们用步骤b).II中的方式为default的namespace打上自动注入标签,删除pod,观察pod状态,可以看到pod的容器数由1变为2;

$ kubectl get po | grep nginxnginx-v1-54fbccf6fd-ff4k2         2/2       Running       0          4snginx-v1-74c674fbd5-fl9bh         1/1       Terminating   0          5m
  • 可以看到sidecar容器已经注入成功,我们看下pod的描述信息,观察下自动注入做了什么。可以看到,自动注入向pod中插入了一个初始化容器istio-init和一个sidecar容器istio-proxy(详细参数可以参考configmap:istio-sidecar-injector);

$ kubectl describe po nginx-v1-54fbccf6fd-ff4k2Name:           nginx-v1-54fbccf6fd-ff4k2Namespace:      defaultStatus:         Running...Init Containers:istio-init:Container ID:  docker://96951306e214594d0c1e550f732a81781287f79f0e5a3262455f38535d42d61fImage:         istio/proxy_init:0.8.0...Containers:container-0:Container ID:   docker://237781c7ce1e8c1f49f68047142ce1738822bafbe504f836f51873cbb1ac1f5dImage:          nginx:1.12-alpine-perlPort:           80/TCPState:          Running...istio-proxy:Container ID:  docker://7208d32552918a5853fd56171bdbab3de3ae734242d23b140f6e5c2a1a4bce64Image:         istio/proxyv2:0.8.0Args:proxysidecar    --configPath/etc/istio/proxy--binaryPath/usr/local/bin/envoy--serviceClusternginx...

istioctl手动注入:

  • 下载istioctl工具并拷贝至环境,链接https://github.com/istio/istio/releases/ 

  • 将istioctl二进制拷贝至/usr/local/bin目录下

mv -f istioctl /usr/local/bin$ kubectl get cm -n istio-system | grep istio-sidecar-injectoristio-sidecar-injector                  1         15h
  • 准备需要注入的文件test.yaml

  • 执行istioctl会在原始内容的基础上加入sidecar的配置内容,并输出到控制台。

$ kubectl apply -f <(istioctl kube-inject -f test.yaml)
  • 将istioctl处理之后的内容部署到kubernetes上

$ kubectl apply -f <(istioctl kube-inject -f test.yaml)
  • 可以通过k8s命令查看pod详细内容

$ kubectl describe pod test-c9f4b55c7-np4cf

总结:

这里更推荐自动注入的方式来实现sidecar的注入,可以通过在deployment的annotation中加入对应的key来实现自动注入的控制。自动注入实现的逻辑并不复杂,主要是对k8s中webhook的使用,以及通过模板,向deployment中注入相应的container资源等。

转载于:https://www.cnblogs.com/CCE-SWR/p/9990065.html

你可能感兴趣的文章
11.3
查看>>
C#---#define条件编译
查看>>
最小费用最大流模板
查看>>
计算机网络体系结构作业题整理-第二章答案
查看>>
脚本,网络配置,指令
查看>>
Ubuntu中MySQL中文乱码解决
查看>>
关于jQuery的ajax的源码的dataType解读
查看>>
类方法和对象方法的区别
查看>>
Lintcode376-Binary Tree Path Sum-Easy
查看>>
MonoTouch
查看>>
Spring MVC 知识总结
查看>>
【7】Django网页视图模板处理
查看>>
D3DXLoadMeshFromXof 0xC0000005: 读取位置 0x00000000 时发生访问冲突
查看>>
Python爬虫学习1
查看>>
Application之图书馆
查看>>
绿色djvu阅读软件
查看>>
最长子串 FZU2118
查看>>
vue中input限制最多两位小数
查看>>
spring mvc ModelAndView 404的原因
查看>>
confusing c++ 重写 与 重定义 记录1
查看>>