Admission controller
1. PodPreset
修改pod神器。
Inject Information into Pods Using a PodPreset: https://kubernetes.io/docs/tasks/inject-data-application/podpreset/
2. MutatingAdmissionWebhook
Diving into Kubernetes MutatingAdmissionWebhook: https://medium.com/ibm-cloud/diving-into-kubernetes-mutatingadmissionwebhook-6ef3c5695f74
可以根据需要自主地(要自己写webhook)修改pod。
3. PodNodeSelector
我们可以使用它给pod自动加上NodeSelector
,这样可以为不同namesapce的pod分配指定的机器,达到各namespace业务机器隔离的作用。这样的效果通过MutatingAdmissionWebhook
也可以达到,但我们需要写一个AdmissionWebhook,有时间的话可以自己写一个。
具体配置如下所示:
为所有namespace分配机器,并用
kubectl label node NODE_NAME_XXX dedicatedNode=NAMESAPCE_XXX
命令给机器加上相应的标签,其中dedicatedNode
为任一有意义的命名字,和下文一致就行。比如:kubectl label node test-node dedicatedNode=demo
的意义是:将test-node
节点分配给demo
namespace下的pod使用。给apiserver增加参数:
--admission-control=...,PodNodeSelector
和--admission-control-config-file=/etc/kubernetes/admission-control.yaml
,其中admission-control.yaml内容如下:所有没有指定默认nodeSelector的namespace下的pod都会加上nodeSelector
dedicatedNode=ItDoesNotExist
,显然这些pod将不会被调度到任何机器上(标签为dedicatedNode=ItDoesNotExist
的机器应该不存在吧:))新建namespace时,使用以下命令为namespace下的pod指定默认的nodeSelector(否则将为使用上文默认的
dedicatedNode=ItDoesNotExist
):kubectl patch namespace NAMESPACE_XXX -p '{"metadata":{"annotations":{"scheduler.alpha.kubernetes.io/node-selector":"dedicatedNode=NAMESPACE_XXX"}}}'
,例:kubectl patch namespace demo -p '{"metadata":{"annotations":{"scheduler.alpha.kubernetes.io/node-selector":"dedicatedNode=demo"}}}'
,namespace demo下的pod将会被自动加上nodeSelectordedicatedNode=demo
4. Admission controller编写示例与框架
通过框架kubewebhook可以很方便地写一个webhook
如果要同时支持mutate和validate webhook,写起来还比较麻烦,单独只支持其中一种时很方便。另外,它暂时不支持glog。
admission-controller-webhook-demo: https://github.com/stackrox/admission-controller-webhook-demo
这个示例不错。
example-webhook-admission-controller: https://github.com/caesarxuchao/example-webhook-admission-controller
generic-admission-server: https://github.com/openshift/generic-admission-server
admission-webhook-example: https://github.com/banzaicloud/admission-webhook-example
通过以上框架的学习,发现自己写一个更方便。
5. 参考资料
Using Admission Controllers: https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
Understanding and using the Kubernetes PodNodeSelector Admission Controller: https://www.mgasch.com/post/podnodesel/
Last updated