Istio技术与实践03:最佳实践之sidecar自动注入

Stella981
• 阅读 518

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

 Istio技术与实践03:最佳实践之sidecar自动注入

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
2年前
Istio Sidecar注入原理
概念简单来说,Sidecar注入会将额外容器的配置添加到Pod模板中。这里特指将Envoy容器注应用所在Pod中。Istio服务网格目前所需的容器有:istioinit用于设置iptables规则,以便将入站/出站流量通过Sidecar代理。初始化容器与应用程序容器在以下方面有所不同:
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这