注入 Istio sidecar
注入 Istio sidecar
网格中的每个 Pod 都必须伴随一个 Istio 兼容的 Sidecar 一同运行。
下文中将会介绍两种把 Sidecar 注入到 Pod 中的方法:使用
istioctl客户端工具进行注入,或者使用 Istio sidecar injector 自动完成注入过程。
手工注入过程会修改控制器(例如 Deployment)的配置。这种注入方法会修改 Pod template,把 Sidecar 注入到目标控制器生成的所有 Pod 之中。要加入、更新或者移除 Sidecar,就需要修改整个控制器。
自动注入过程会在 Pod 的生成过程中进行注入,这种方法不会更改控制器的配置。手工删除 Pod 或者使用滚动更新都可以选择性的对 Sidecar 进行更新。
手工或自动注入都会从
istio-system命名空间的
istio-sidecar-injector以及
istioConfigMap 中获取配置信息。手工注入方式还可以选择从本地文件中读取配置。
Sidecar 的自动注入
使用 Kubernetes 的 mutating webhook admission controller,可以进行 Sidecar 的自动注入。Kubernetes 1.9 以后的版本才具备这一能力。使用这一功能之前首先要检查
kube-apiserver的进程,是否具备
admission-control参数,并且这个参数的值中需要包含
MutatingAdmissionWebhook以及
ValidatingAdmissionWebhook两项,并且按照正确的顺序加载,这样才能启用
admissionregistrationAPI:
[root@cn-hongkong ~]# kubectl api-versions | grep admissionregistration admissionregistration.k8s.io/v1beta1
注意,跟手工注入不同的是,自动注入过程是发生在 Pod 级别的。因此是不会看到 Deployment 本身发生什么变化的。但是可以使用
kubectl describe来观察单独的 Pod,在其中能看到注入 Sidecar 的相关信息。
应用部署
部署
sleep应用,检查一下是不是只产生了一个容器。
kubectl apply -f samples/sleep/sleep.yaml kubectl get deployment -o wide
给
default命名空间设置标签:
istio-injection=enabled: 注意是只要运行在这个namespace下都pod都会自动注入Sidecar.
kubectl label namespace default istio-injection=enabled kubectl get namespace -L istio-injection
这样就会在 Pod 创建时触发 Sidecar 的注入过程了。删掉运行的 Pod,会产生一个新的 Pod,新 Pod 会被注入 Sidecar。原有的 Pod 只有一个容器,而被注入 Sidecar 的 Pod 会有两个容器:
禁用
default命名空间的自动注入功能,然后检查新建 Pod 是不是就不带有 Sidecar 容器了:
kubectl label namespace default istio-injection- kubectl delete pod sleep-776b7bcdcd-bhn9m kubectl get pod
排除pod注入
同时也可以在deployment中通过设置annotation,sidecar.istio.io/inject=true来控制pod级别的自动注入。
[root@cn-hongkong k8s_yaml]# cat httpd.yaml apiVersion: apps/v1beta1 kind: Deployment metadata: name: httpd spec: replicas: 2 template: metadata: annotations: sidecar.istio.io/inject: "false" labels: run: httpd spec: containers: - name: httpd image: httpd ports: - containerPort: 80
Sidecar 手动注入
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处理之后的内容部署到kubernetes上
$kubectl apply -f <(istioctl kube-inject -f test.yaml) 或者 $istioctl kube-inject -f test.yaml | kubectl apply -f -
f) 可以通过k8s命令查看pod详细内容
$kubectl describe pod test-c9f4b55c7-np4cf
故障排查
现象:当启动了基于namespace或者手动出入sidecar时,发现pod无法起来。
排查方法:
1.kubectl describe rs httpd
发现日志显示istio-sidecar-injector连接超时。
解决方法:
kubectl delete pod istio-sidecar-injector-6fd47fb7c8-mr9kp -n istio-system
- spring cloud sidecar
- istio sidecar自动注入过程分析
- SSI注入(server side includes injection 服务器端包含注入)
- spring cloud sidecar
- spring cloud sidecar
- Service Mesh vs SideCar
- Istio技术与实践03:最佳实践之sidecar自动注入
- spring cloud sidecar
- 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]
- Spring IOC(依赖注入、控制反转)概念理解
- SQL注入另类技巧
- 无模块注入示例
- Spring依赖注入 加包扫描的方式Spring注解注入(学习笔记)
- 横向卷轴(side-scrolling)地图的canvas实现
- spring注入失败,报thread,null
- MSSQL db_owner角色注入直接获得系统权限- -
- dll远程注入
- 4000 IoC(Inversion of Control)的主要组件和注入方式
- spring泛型依赖注入
- 全面理解控制反转和依赖注入