... views
Kubernets 1.9 版本引入了 Admission Webhook(web 回调)扩展机制,通过 Webhook,开发者可以非常灵活地对 Kubernets API Server 的功能进行扩展,在 API Server 创建资源时对资源进行验证或者修改。
使用 webhook 的优势是不需要对 API Server 的源码进行修改和重新编译就可以扩展其功能。插入的逻辑实现为一个独立的 web 进程,通过参数方式传入到 kubernets 中,由 kubernets 在进行自身逻辑处理时对扩展逻辑进行回调。
Istio 0.7 版本就利用了 Kubernets webhook 实现了 sidecar 的自动注入。
Admission 是 Kubernets 中的一个术语,指的是 Kubernets API Server 资源请求过程中的一个阶段。如下图所示,在 API Server 接收到资源创建请求时,首先会对请求进行认证和鉴权,然后经过 Admission 处理,最后再保存到 etcd。
从图中看到,Admission 中有两个重要的阶段,Mutation 和 Validation,这两个阶段中执行的逻辑如下:
Mutation
Mutation 是英文“突变”的意思,从字面上可以知道在 Mutation 阶段可以对请求内容进行修改。
Validation
在 Validation 阶段不允许修改请求内容,但可以根据请求的内容判断是继续执行该请求还是拒绝该请求。
通过 Admission webhook,可以加入 Mutation 和 Validation 两种类型的 webhook 插件,这些插件和 Kubernets 提供的预编译的 Admission 插件具有相同的能力。可以想到的用途包括:
webhook 支持需要 Kubernets1.9 或者更高的版本,使用下面的命令确认 kube-apiserver 的 Admin webhook 功能已启用。
kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1
Webhook 使用数字证书向 kube-apiserver 进行身份认证,因此需要先使用工具生成密钥对,并向 Istio CA 申请数字证书。
./install/kubernetes/webhook-create-signed-cert.sh /
--service istio-sidecar-injector /
--namespace istio-system /
--secret sidecar-injector-certs
cat install/kubernetes/istio-sidecar-injector.yaml | /
./install/kubernetes/webhook-patch-ca-bundle.sh > /
install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml
kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
通过命令查看部署好的 webhook injector
kubectl -n istio-system get deployment -listio=sidecar-injector
Copy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
istio-sidecar-injector 1 1 1 1 1d
kubectl label namespace default istio-injection=enabled
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