之前走读 Spark Opeartor Webhook 部分的代码的时候发现,因为业务种类很多,我们需要在 webhook 层加很多参数和配置来控制用户的一些行为但是发现原生的 Spark Operator 只接受 NamespaceSelector 也就是这种行为的控制职能针对一个命名空间的对象。这个范围对我们来说有点太大了,我们喜欢更精细一点去控制 Webhook 的效果,所以这里可以通过修改 Webhook,引入 ObjectSelector 来控制。修改 spark-operator webhook 源码,添加了 ObjectSelector,保证只有 Spark 的 Pod 会被发送到 /webhook。
代码语言:go复制 mutatingWebhook := v1beta1.MutatingWebhook{
Name: webhookName,
Rules: mutatingRules,
ObjectSelector: &metav1.LabelSelector{
MatchLabels: map[string]string{"sparkoperator.k8s.io/launched-by-spark-operator": "true"},
},
ClientConfig: v1beta1.WebhookClientConfig{
Service: wh.serviceRef,
CABundle: caCert,
},
FailurePolicy: &wh.failurePolicy,
NamespaceSelector: wh.selector,
}
上述方案只能在 k8s 1.16 才能使用了,目前来说,对于大部分 1.14 的集群,只能通过 Namespace 来区分了,Namespace 加上特定的 Label,也就是只有符合 nameSpaceSelector 这个 Namespace 下的资源对象才会被 webhook 拦截,所以 ObjectSelector 是否生效还要取决于 Webhook 所在的 k8s 集群。 2020年最后一天了,水一篇…