Istio注入sidecar

1、注入

为了充分利用 Istio 的所有特性,网格中的 pod 必须运行一个 Istio sidecar 代理。

向 pod 中注入 Istio sidecar 的两种方法:使用 istioctl 手动注入或启用 pod 所属命名空间的 Istio sidecar 注入器自动注入。

手动注入直接修改配置,如 deployment,并将代理配置注入其中。

当 pod 所属命名空间启用自动注入后,自动注入器会使用准入控制器在创建 Pod 时自动注入代理配置。

通过应用 istio-sidecar-injector ConfigMap 中定义的模版进行注入。

2、手动注入sidecar

上一节实现了istio的安装,所有的pod都是running状态,但不知其作用,现在先创建一个deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14-alpine
ports:
- containerPort: 80

为了方便视图,创建一个新的名称空间

1
2
3
kubectl  create  namespace test
kubectl apply -f nginx.yml -n test
kubectl get pod -n test

image-20200316111616355

执行如下语句:

1
2
istioctl  kube-inject -f nginx.yml | kubectl apply  -n test -f -
kubectl get pod -n test

image-20200316112939899

稍等会儿就能看到原来一个pod变成了两个,如果你有类似 rancher 这样的 web 控制台,可以看得更仔细些,如

下图所示。

image-20200316113231845

从上图可知。此时 nginx pod 内部一共有 3 个容器,一个初始化容器 istio-init 已经运行成功并结束了,一个就是

nginx 本尊,另外一个就是本文的主角 istio-proxy 了,它就是 sidecar,作用是负责跟外部打交到用的。

3、命名空间注入sidecar

当你在一个命名空间中设置了 istio-injection=enabled 标签,且 injection webhook 被启用后,任何新的 pod 都有将在创建时自动添加 sidecar。

现在删除掉刚才创建的 nginx:

1
kubectl delete deploy nginx -n test

执行如下命令在命名空间内实现自动注入 sidecar:

1
2
kubectl label namespaces test istio-injection=enabled
kubectl get ns test --show-labels #查看状态

再次创建nginx的deploy文件

1
kubectl apply -f nginx.yml -n test

稍等会儿就能看到已经自动注入了

image-20200316114453004