Istio通过对serviceMesh中的每个pod注入sidecar,来实现无侵入式的服务治理能力。其中,sidecar的注入是其能力实现的重要一环(本文主要介绍在kubernetes集群中的注入方式)。sidecar注入有两种方式,一是通过创建webhook资源,利用k8s的webhook能力实现pod的自动注入,二是通过istioctl工具,对yaml文件进行手动注入。在这里对这两种方式进行简单介绍。

一、webhook自动注入:

a)         准备条件:

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

ii.              kubernetes环境需支持MutatingAdmissionWebhook;

$ kubectl api-versions | grep admissionregistration

admissionregistration.k8s.io/v1beta1

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

--admission-control=MutatingAdmissionWebhookValidatingAdmissionWebhook

iv.              确保master到node容器网络通信正常。

b)         自动注入控制:

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

$ kubectl get cm istio-sidecar-injector -nistio-system

apiVersion: v1
kind: ConfigMap
metadata:
  name:
istio-sidecar-injector
  namespace: istio-system
data:
  config:
|-
    policy: enabled     //enabeld为开启,disabeld为关闭

ii.              为需要自动注入的namespace打上标签istio-injection: enabled(此处为ns级别的自动注入控制)。

$ kubectl get namespace -L istio-injection
NAME           STATUS    AGE       ISTIO-INJECTION
default        Active    1h
istio-system   Active    1h
kube-public    Active    1h
kube-system    Active    1h
$ kubectl label namespace default istio-injection=enabled
namespace "default" labeled
$ kubectl get namespace -L istio-injection
NAME           STATUS    AGE       ISTIO-INJECTION
default        Active    1h        enabled
istio-system   Active    1h
kube-public    Active    1h
kube-system    Active    1h

iii.              同时也可以在deployment中通过设置annotation,sidecar.istio.io/inject=true来控制pod级别的自动注入。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test
spec:
  replicas: 1
template:
metadata:
      annotations:
        sidecar.istio.io/inject:
“true”
    // true为启用自动注入,false为关闭自动注入

c)         定义webhook参数文件MutatingWebhookConfiguration,格式如下(在helm包的sidecarInject中)。

这里的语义就是,监听具有istio-injection: enabled的label的namespace下的pod资源,当发生rules(CREATE POD)的动作时,则调用services(istio-sidecar-injector.istio-system的/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

d)        
webhook工作流程图

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

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

$ kubectl get po -nistio-system | grep sidecar-injector
istio-sidecar-injector-5fb5999bf8-59k79          1/1       Running   0          1d

ii.              部署一个简单的测试deploy,此处我们以nginx为例;

$ kubectl get po | grep nginx
nginx-v1-74c674fbd5-fl9bh         1/1       Running   0          22s

iii.              我们用步骤b).II中的方式为default的namespace打上自动注入标签,删除pod,观察pod状态,可以看到pod的容器数由1变为2;

$ kubectl get po | grep nginx
nginx-v1-54fbccf6fd-ff4k2         2/2       Running       0          4s
nginx-v1-74c674fbd5-fl9bh         1/1       Terminating   0          5m

iv.              可以看到sidecar容器已经注入成功,我们看下pod的描述信息,观察下自动注入做了什么。可以看到,自动注入向pod中插入了一个初始化容器istio-init和一个sidecar容器istio-proxy(详细参数可以参考configmap:istio-sidecar-injector);


 

$ kubectl describe po nginx-v1-54fbccf6fd-ff4k2
Name:           nginx-v1-54fbccf6fd-ff4k2
Namespace:      default
Status:         Running ... Init Containers:
  istio-init:
    Container
ID:  docker://96951306e214594d0c1e550f732a81781287f79f0e5a3262455f38535d42d61f
    Image:         istio/proxy_init:0.8.0 ... Containers:
  container-0:
    Container
ID:   docker://237781c7ce1e8c1f49f68047142ce1738822bafbe504f836f51873cbb1ac1f5d
    Image:          nginx:1.12-alpine-perl
    Port:           80/TCP
    State:          Running ...   istio-proxy:
    Container
ID:  docker://7208d32552918a5853fd56171bdbab3de3ae734242d23b140f6e5c2a1a4bce64
    Image:         istio/proxyv2:0.8.0
    Args:
      proxy
      sidecar
      --configPath
      /etc/istio/proxy
      --binaryPath
      /usr/local/bin/envoy
      --serviceCluster
      nginx
 
...

二、istioctl手动注入:

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

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

mv -f istioctl /usr/local/bin

c)         安装Istio控制面,确认注入相关configmap已创建成功

$ kubectl get cm -n istio-system | grep istio-sidecar-injector
istio-sidecar-injector                  1         15h

d)         准备需要注入的文件test.yaml

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

$ istioctl kube-inject -f test.yaml

f)          将istioctl处理之后的内容部署到kubernetes上

$kubectl apply -f <(istioctl kube-inject -f test.yaml)

g)         可以通过k8s命令查看pod详细内容

$kubectl describe pod test-c9f4b55c7-np4cf

三、总结:

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

https://console.huaweicloud.com/cce2.0/?region=cn-north-1#/app/istio/istioPublicBeta

Istio技术与实践03:最佳实践之sidecar自动注入的更多相关文章

  1. istio sidecar自动注入过程分析

    目录 istio sidecar自动注入过程分析 sidecar自动注入检查 检查kube-apiserver 检查sidecar-injector的configmap 检查namespace标签 s ...

  2. 1.深入Istio:Sidecar自动注入如何实现的?

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 这篇文章打算讲一下sidecar, ...

  3. jQuery插件的编写相关技术 设计总结和最佳实践

    原文:http://www.itzhai.com/jquery-plug-in-the-preparation-of-related-technical-design-summary-and-best ...

  4. istio实现自动sidecar自动注入(k8s1.13.3+istio1.1.1)

    一.自动注入的前提条件 自动注入功能需要kubernetes 1.9或更高版本: kubernetes环境需支持MutatingAdmissionWebhook: 二.在namespace中设置自动注 ...

  5. [转]15年双11手淘前端技术巡演 - H5性能最佳实践

    [原文地址]:https://github.com/amfe/article/issues/21 前言 2015年是全面『无线化』的一年,在BAT(财报)几家公司都已经超过50%的流量来自移动端,这次 ...

  6. Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制

    服务模型 首先,Istio作为一个(微)服务治理的平台,和其他的微服务模型一样也提供了Service,ServiceInstance这样抽象服务模型.如Service的定义中所表达的,一个服务有一个全 ...

  7. 精彩分享 | 欢乐游戏 Istio 云原生服务网格三年实践思考

    作者 吴连火,腾讯游戏专家开发工程师,负责欢乐游戏大规模分布式服务器架构.有十余年微服务架构经验,擅长分布式系统领域,有丰富的高性能高可用实践经验,目前正带领团队完成云原生技术栈的全面转型. 导语 欢 ...

  8. (转)iOS 最佳实践

    本文转自http://www.jianshu.com/p/b0bf2368fb95 感谢作者和译者 iOS最佳实践 iOS最佳实践 译者注 本文翻译自 futurice 公司的 iOS Good Pr ...

  9. Knative 应用在阿里云容器服务上的最佳实践

    作者|元毅 阿里云智能事业群高级开发工程师 相信通过前面几个章节的内容,大家对 Knative 有了初步的体感,那么在云原生时代如何在云上玩转 Knative?本篇内容就给你带来了 Knative 应 ...

随机推荐

  1. 调整 全局jvm 大小 tomcat 调整jvm大小

    z最近公司换了一个线上的windows服务器,原来的内存48g,现在2g.项目启动报内存不足.又重新安装jre 安装jre 教程链接:(谢谢各位博友) https://www.genban.org/t ...

  2. P5663 加工零件

    P5663 加工零件 题解 暴力搜索 搜索显然会TLE #include<iostream> #include<cstdio> #include<cstdlib> ...

  3. 在 Java 应用程序中加一些 Groovy 进来

    如果您一直在阅读这个系列,那么您应该已经看到有各种各样使用 Groovy 的有趣方式,Groovy 的主要优势之一就是它的生产力.Groovy 代码通常要比 Java 代码更容易编写,而且编写起来也更 ...

  4. world: 对比两个文档

    1. 2. 3. 4.

  5. Greenwich.SR2版本的Spring Cloud Config+BUS实例

    Spring Cloud Config统一的配置中心同注册中心Eureka一样,也分服务端和客户端.服务端用来保存配置信息,客户端用来读取.它的优势是基于Git仓库,支持多环境.多分支配置.动态刷新. ...

  6. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_16-网关-过虑器

    4.5 过虑器 Zuul的核心就是过虑器,通过过虑器实现请求过虑,身份校验等. 4.5.1 ZuulFilter 自定义过虑器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖 ...

  7. 一百四十七:CMS系统之celery实现邮件和短信异步发送

    celery工作原理 celery官方文档:https://docs.celeryproject.org/en/latest/ 安装:pip install celery windows下还需安装ev ...

  8. [Paper翻译]Scalable Lock-Free Dynamic Memory Allocation

    原文: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.87.3870&rep=rep1&type=pdf Abstr ...

  9. 建立django项目的完整流程

    简单的django登录项目 1.首先建立工程,建立工程请参照:https://www.cnblogs.com/effortsing/p/10394511.html 2.在Firstdjango工程项目 ...

  10. LODOP设置同一个任务发送到不同打印机

    前面的博文Lodop打印语句最基本结构介绍(什么是一个任务),一个任务只能有一个打印语句(最后PRINT,PRINTA,PREVIEW等),如果执行多个,LODOP会弹出多次,C-LODOP会提示窗口 ...