ITPub博客

首页 > 云计算 > Docker/K8 > Istio技术与实践03:最佳实践之sidecar自动注入

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

原创 Docker/K8 作者:PaaS小魔仙 时间:2018-08-30 16:02:39 0 删除 编辑

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=MutatingAdmissionWebhook , ValidatingAdmissionWebhook

                      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


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

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

注册时间:2018-06-25

  • 博文量
    33
  • 访问量
    37166