Skip to content

Commit 7d96947

Browse files
committed
feat(controller): use ingressClass support
1 parent a4c04cc commit 7d96947

4 files changed

Lines changed: 48 additions & 30 deletions

File tree

charts/controller/templates/controller-clusterrole.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ rules:
6464
- apiGroups: ["networking.k8s.io"]
6565
resources: ["ingresses"]
6666
verbs: ["get", "list", "create", "delete", "deletecollection", "patch", "update"]
67+
- apiGroups: ["networking.k8s.io"]
68+
resources: ["ingressclasses"]
69+
verbs: ["get"]
6770
- apiGroups: ["apps"]
6871
resources: ["replicasets"]
6972
verbs: ["get", "list", "watch"]
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
from .base import IngressFactory, WildcardPathIngress
1+
from .base import IngressClass, WildcardPathIngress
22
from .nginx import NginxIngress
33
from .traefik import TraefikIngress
44

55

6-
IngressFactory.register("gce", WildcardPathIngress)
7-
IngressFactory.register("alb", WildcardPathIngress)
8-
IngressFactory.register("traefik", TraefikIngress)
9-
IngressFactory.register("nginx", NginxIngress)
6+
# registry ingress class by controller
7+
IngressClass.register("k8s.io/ingress-gce", WildcardPathIngress)
8+
IngressClass.register("ingress.k8s.aws/alb", WildcardPathIngress)
9+
IngressClass.register("traefik.io/ingress-controller", TraefikIngress)
10+
IngressClass.register("k8s.io/ingress-nginx", NginxIngress)

rootfs/scheduler/resources/ingress/base.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,27 @@ def delete(self, namespace, ingress, ignore_exception=True):
106106
return response
107107

108108

109-
class IngressFactory(Resource):
109+
class IngressClass(Resource):
110110

111111
short_name = 'ingress'
112112
ingress_class_map = {
113113
"default": BaseIngress
114114
}
115115

116-
def __call__(self, ingress_name):
117-
ingress_cls = self.ingress_class_map.get(ingress_name, self.ingress_class_map["default"])
118-
ingress_cls.ingress_class = ingress_name
116+
def get(self, ingress_class, ignore_exception=True):
117+
response = self.http_get(f"/apis/networking.k8s.io/v1/ingressclasses/{ingress_class}")
118+
if not ignore_exception and self.unhealthy(response.status_code):
119+
raise KubeHTTPException(response, 'get IngressClasses "{}"', ingress_class)
120+
121+
return response
122+
123+
def __call__(self, ingress_class):
124+
response = self.get(ingress_class)
125+
controller = "default"
126+
if response.status_code == 200:
127+
controller = response.json()["spec"]["controller"]
128+
ingress_cls = self.ingress_class_map.get(controller, self.ingress_class_map["default"])
129+
ingress_cls.ingress_class = ingress_class
119130
return ingress_cls(self.url, self.k8s_api_verify_tls)
120131

121132
@classmethod

rootfs/scheduler/resources/ingress/traefik.py

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,12 @@ def manifest(self, name, resource_version=None):
9292
class IPWhiteListMiddleware(BaseMiddleware):
9393
name_suffix = "-ip-white-list"
9494

95-
def manifest(self, name, allowlist, resource_version=None):
95+
def manifest(self, name, allowlist=None, resource_version=None):
9696
data = super().manifest(name, resource_version)
9797
data.update({
9898
"spec": {
9999
"ipWhiteList": {
100-
"sourceRange": allowlist
100+
"sourceRange": allowlist if allowlist is not None else []
101101
}
102102
}
103103
})
@@ -124,42 +124,45 @@ class TraefikIngress(BaseIngress):
124124

125125
def __init__(self, url, k8s_api_verify_tls=True):
126126
super().__init__(url, k8s_api_verify_tls)
127-
self.buffering = BufferingMiddleware(url, k8s_api_verify_tls)
128-
self.ip_white_list = IPWhiteListMiddleware(url, k8s_api_verify_tls)
129-
self.redirect_scheme = RedirectSchemeMiddleware(url, k8s_api_verify_tls)
127+
self.middlewares = {
128+
"buffering": BufferingMiddleware(url, k8s_api_verify_tls),
129+
"allowlist": IPWhiteListMiddleware(url, k8s_api_verify_tls),
130+
"ssl_redirect": RedirectSchemeMiddleware(url, k8s_api_verify_tls),
131+
}
130132

131133
def manifest(self, namespace, ingress, **kwargs):
132134
data = BaseIngress.manifest(self, namespace, ingress, **kwargs)
133-
middlewares = [f"{namespace}-{self.buffering.fullname(ingress)}@kubernetescrd", ]
134-
if "allowlist" in kwargs and kwargs["allowlist"]:
135-
middlewares.append(
136-
f"{namespace}-{self.ip_white_list.fullname(ingress)}@kubernetescrd")
137-
if "ssl_redirect" in kwargs and kwargs["ssl_redirect"]:
138-
middlewares.append(
139-
f"{namespace}-{self.redirect_scheme.fullname(ingress)}@kubernetescrd")
135+
middlewares = []
136+
for middleware in self.middlewares.keys():
137+
if middleware == "buffering" or (middleware in kwargs and kwargs[middleware]):
138+
name = self.middlewares[middleware].fullname(ingress)
139+
middlewares.append(f"{namespace}-{name}@kubernetescrd")
140140
data["metadata"]["annotations"].update({
141141
"traefik.ingress.kubernetes.io/router.middlewares": ",".join(middlewares)
142142
})
143143
return data
144144

145145
def create(self, namespace, ingress, **kwargs):
146146
response = super().create(ingress, namespace, **kwargs)
147-
self.buffering.create(namespace, name=self.buffering.fullname(ingress))
148-
self.ip_white_list.create(
149-
namespace, name=self.ip_white_list.fullname(ingress), allowlist=[])
150-
self.redirect_scheme.create(namespace, name=self.redirect_scheme.fullname(ingress))
147+
for middleware in self.middlewares.keys():
148+
name = self.middlewares[middleware].fullname(ingress)
149+
self.middlewares[middleware].create(namespace, name=name)
151150
return response
152151

153152
def put(self, namespace, ingress, version, **kwargs):
154153
response = super().put(ingress, namespace, version, **kwargs)
155154
if "allowlist" in kwargs:
156-
self.ip_white_list.put(
157-
namespace, self.ip_white_list.fullname(ingress), allowlist=kwargs["allowlist"])
155+
name = self.middlewares["allowlist"].fullname(ingress)
156+
self.middlewares["allowlist"].put(
157+
namespace,
158+
name,
159+
allowlist=kwargs["allowlist"],
160+
)
158161
return response
159162

160163
def delete(self, namespace, ingress):
161164
response = super().delete(namespace, ingress)
162-
self.buffering.delete(namespace, self.buffering.fullname(ingress))
163-
self.ip_white_list.delete(namespace, self.ip_white_list.fullname(ingress))
164-
self.redirect_scheme.delete(namespace, self.redirect_scheme.fullname(ingress))
165+
for middleware in self.middlewares.keys():
166+
name = self.middlewares[middleware].fullname(ingress)
167+
self.middlewares[middleware].delete(namespace, name)
165168
return response

0 commit comments

Comments
 (0)