如何解决强制kubernetes入口cname格式
在Kubernetes中,由RBAC控制的多租户环境中,在创建新的Ingress cname时,我想强制使用cname格式,例如:
${service}.${namespace}.${cluster}.kube.infra
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ${servce}
spec:
tls:
- hosts:
- ${service}.${namespace}.${cluster}.kube.infra
secretName: conso-elasticsearch-ssl
rules:
- host: ${service}.${namespace}.${cluster}.kube.infra
http:
paths:
- path: /
backend:
serviceName: ${service}
servicePort: 9200
有可能吗?
解决方法
您可以通过编写validating admission webhook来完成此操作,该rego policy会验证入口Yaml,如果cname格式不符合您的要求,则拒绝它。更好的方法是使用开放策略代理(OPA)并编写Here。 {{3}}是有关如何使用OPA执行策略驱动的入口验证的指南。
package kubernetes.admission
import data.kubernetes.namespaces
operations = {"CREATE","UPDATE"}
deny[msg] {
input.request.kind.kind == "Ingress"
operations[input.request.operation]
host := input.request.object.spec.rules[_].host
not fqdn_matches_any(host,valid_ingress_hosts)
msg := sprintf("invalid ingress host %q",[host])
}
valid_ingress_hosts = {
// valid hosts
}
fqdn_matches_any(str,patterns) {
fqdn_matches(str,patterns[_])
}
fqdn_matches(str,pattern) {
// validation logic
}
fqdn_matches(str,pattern) {
not contains(pattern,"*")
str == pattern
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。