作者: 钟华,腾讯云容器团队高级工程师,热衷于容器、微服务、service mesh、istio、devops 等领域技术。
今天我们分析下 istio-sidecar-injector 组件:
用户空间的Pod要想加入mesh, 首先需要注入sidecar 容器, istio 提供了2种方式实现注入:
自动注入: 利用 Kubernetes Dynamic Admission Webhooks 对 新建的pod 进行注入: initContainer + sidecar
手动注入: 使用命令
istioctl kube-inject
「注入」本质上就是修改Pod的资源定义, 添加相应的sidecar容器定义, 内容包括2个新容器:
名为
istio-init
的initContainer: 通过配置iptables来劫持Pod中的流量名为
istio-proxy
的sidecar容器: 两个进程pilot-agent和envoy, pilot-agent 进行初始化并启动envoy
1. Dynamic Admission Control
kubernetes 的准入控制(Admission Control)有2种:
Built in Admission Control: 这些Admission模块可以选择性地编译进api server, 因此需要修改和重启kube-apiserver
Dynamic Admission Control: 可以部署在kube-apiserver之外, 同时无需修改或重启kube-apiserver.
其中, Dynamic Admission Control 包含2种形式:
Admission Webhooks: 该controller 提供http server, 被动接受kube-apiserver分发的准入请求.
Initializers: 该controller主动list and watch 关注的资源对象, 对watch到的未初始化对象进行相应的改造.
其中, Admission Webhooks 又包含2种准入控制:
ValidatingAdmissionWebhook
MutatingAdmissionWebhook
istio 使用了MutatingAdmissionWebhook来实现对用户Pod的注入, 首先需要保证以下条件满足:
确保 kube-apiserver 启动参数 开启了 MutatingAdmissionWebhook
给namespace 增加 label:
kubectl labelnamespacedefaultistio-injection=enabled
同时还要保证 kube-apiserver 的 aggregator layer 开启:
--enable-aggregator-routing=true
且证书和api server连通性正确设置.
另外还需要一个配置对象, 来告诉kube-apiserver istio关心的资源对象类型, 以及webhook的服务地址. 如果使用helm安装istio, 配置对象已经添加好了, 查阅MutatingWebhookConfiguration:
% kubectl get mutatingWebhookConfiguration -oyaml
- apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingWebhookConfiguration
metadata:
name: istio-sidecar-injector
webhooks:
- clientConfig:
service:
name: istio-sidecar-injector
namespace: istio-system
path: /inject
name: sidecar-injector.istio.io
namespaceSelector:
matchLabels:
istio-injection: enabled
rules:
- apiGroups:
- ""
apiVersions:
- v1
operations:
- CREATE
resources: