Skip to content

Commit bc307fb

Browse files
authored
Migrate ingress class from annotation to spec (#10)
* Migrate ingress class from annotation to spec * go get k8s.io/utils/ptr
1 parent 2fe73bc commit bc307fb

File tree

6 files changed

+82
-36
lines changed

6 files changed

+82
-36
lines changed

Diff for: README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@ metadata:
4545
name: supersecret
4646
namespace: supersecret
4747
annotations:
48-
# must be use ingress-nginx.
49-
kubernetes.io/ingress.class: nginx
50-
5148
# https://auth.example.com/<PROVIDER>/<APP_NAME>/.....
5249
nginx.ingress.kubernetes.io/auth-signin: https://auth.example.com/github/supersecret/start?rd=https://$host$request_uri$is_args$args
5350
nginx.ingress.kubernetes.io/auth-url: https://auth.example.com/github/supersecret/auth
@@ -59,6 +56,8 @@ metadata:
5956
oauth2-proxy-manager.k8s.io/github-org: "example-corp"
6057
oauth2-proxy-manager.k8s.io/github-teams: "administrator"
6158
spec:
59+
# must be use ingress-nginx.
60+
ingressClassName: ingress-nginx
6261
rules:
6362
- host: "supersecret.example.com" # hosts must be provide
6463
http:

Diff for: go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
k8s.io/api v0.26.1
99
k8s.io/apimachinery v0.26.1
1010
k8s.io/client-go v0.26.1
11+
k8s.io/utils v0.0.0-20240310230437-4693a0247e57
1112
)
1213

1314
require (
@@ -49,7 +50,6 @@ require (
4950
gopkg.in/yaml.v3 v3.0.1 // indirect
5051
k8s.io/klog/v2 v2.80.1 // indirect
5152
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
52-
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect
5353
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
5454
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
5555
sigs.k8s.io/yaml v1.3.0 // indirect

Diff for: go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -510,8 +510,8 @@ k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
510510
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
511511
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E=
512512
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=
513-
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d h1:0Smp/HP1OH4Rvhe+4B8nWGERtlqAGSftbSbbmm45oFs=
514-
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
513+
k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0gQBEuevE/AaBsHY=
514+
k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
515515
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
516516
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
517517
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

Diff for: service/controller.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"k8s.io/apimachinery/pkg/util/intstr"
1515
"k8s.io/client-go/kubernetes"
1616
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
17+
"k8s.io/utils/ptr"
1718

1819
"github.com/sirupsen/logrus"
1920
"github.com/wantedly/oauth2-proxy-manager/models"
@@ -140,11 +141,9 @@ func (c *Controller) applyIngress(ctx context.Context, settings *models.ServiceS
140141
ObjectMeta: metav1.ObjectMeta{
141142
Name: "oauth2-proxy",
142143
Namespace: "oauth2-proxy",
143-
Annotations: map[string]string{
144-
"kubernetes.io/ingress.class": "nginx",
145-
},
146144
},
147145
Spec: networkingv1.IngressSpec{
146+
IngressClassName: ptr.To("nginx"),
148147
Rules: []networkingv1.IngressRule{
149148
networkingv1.IngressRule{
150149
Host: c.Env.Domain,
@@ -172,7 +171,7 @@ func (c *Controller) applyIngress(ctx context.Context, settings *models.ServiceS
172171
}
173172

174173
if len(c.Ingress.IngressClass) != 0 {
175-
ingress.Annotations["kubernetes.io/ingress.class"] = c.Ingress.IngressClass
174+
ingress.Spec.IngressClassName = &c.Ingress.IngressClass
176175
}
177176

178177
if len(c.Ingress.TLSHosts) != 0 && len(c.Ingress.TLSSecretName) != 0 {

Diff for: service/observer.go

+35-11
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@ func (ob *Observer) Run(ctx context.Context) {
4141
AddFunc: func(obj interface{}) {
4242
key, err := cache.MetaNamespaceKeyFunc(obj)
4343
if err == nil {
44-
meta := obj.(*networkingv1.Ingress).ObjectMeta
44+
ing := obj.(*networkingv1.Ingress)
45+
meta := ing.ObjectMeta
4546
logrus.Infof("[Informer] Added Ingress %s", key)
4647

48+
if !shouldPerform(ing) {
49+
return
50+
}
51+
4752
settings, err := parseAnnotations(meta)
4853
if err == nil {
4954
ob.Controller.Apply(ctx, settings)
@@ -55,9 +60,14 @@ func (ob *Observer) Run(ctx context.Context) {
5560
key, err := cache.MetaNamespaceKeyFunc(new)
5661

5762
if err == nil {
58-
meta := new.(*networkingv1.Ingress).ObjectMeta
63+
ing := new.(*networkingv1.Ingress)
64+
meta := ing.ObjectMeta
5965
logrus.Infof("[Informer] Update Ingress %s", key)
6066

67+
if !shouldPerform(ing) {
68+
return
69+
}
70+
6171
settings, err := parseAnnotations(meta)
6272
if err == nil {
6373
ob.Controller.Apply(ctx, settings)
@@ -68,9 +78,14 @@ func (ob *Observer) Run(ctx context.Context) {
6878
DeleteFunc: func(obj interface{}) {
6979
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
7080
if err == nil {
71-
meta := obj.(*networkingv1.Ingress).ObjectMeta
81+
ing := obj.(*networkingv1.Ingress)
82+
meta := ing.ObjectMeta
7283
logrus.Infof("[Informer] Delete Ingress: %s", key)
7384

85+
if !shouldPerform(ing) {
86+
return
87+
}
88+
7489
settings, err := parseAnnotations(meta)
7590
if err == nil {
7691
logrus.WithField("settings", settings).Info("Dummy: Delete Deployment / ConfigMap / Service / Secret / Ingress")
@@ -88,15 +103,25 @@ func (ob *Observer) Run(ctx context.Context) {
88103
select {}
89104
}
90105

91-
func parseAnnotations(meta metav1.ObjectMeta) (*models.ServiceSettings, error) {
92-
// Check Annotations ---
93-
if _, ok := meta.Annotations["kubernetes.io/ingress.class"]; !ok {
94-
return nil, errors.New("ingress.class not found. skip.")
95-
} else if meta.Annotations["kubernetes.io/ingress.class"] != "nginx" && meta.Annotations["kubernetes.io/ingress.class"] != "ingress-nginx" {
96-
// or ingress.class is "nginx" or "ingress-nginx" ?
97-
return nil, errors.New("ingress.class is not nginx or ingress-nginx. skip.")
106+
func shouldPerform(ing *networkingv1.Ingress) bool {
107+
if ing == nil {
108+
logrus.Info("ingress is nil. skip.")
109+
return false
110+
}
111+
if ing.Spec.IngressClassName == nil {
112+
logrus.Info("ingress class is not found. skip.")
113+
return false
114+
}
115+
name := *ing.Spec.IngressClassName
116+
if name != "nginx" && name != "ingress-nginx" {
117+
logrus.Infof("ingress class is not `nginx` or `ingress-nginx` but %q. skip.", name)
118+
return false
98119
}
120+
return true
121+
}
99122

123+
func parseAnnotations(meta metav1.ObjectMeta) (*models.ServiceSettings, error) {
124+
// Check Annotations ---
100125
if _, ok := meta.Annotations["nginx.ingress.kubernetes.io/auth-url"]; !ok {
101126
return nil, errors.New("auth-url not found. skip.")
102127
}
@@ -123,7 +148,6 @@ func parseAnnotations(meta metav1.ObjectMeta) (*models.ServiceSettings, error) {
123148
}
124149

125150
logrus.WithFields(logrus.Fields{
126-
"ingress.class": meta.Annotations["kubernetes.io/ingress.class"],
127151
"auth-url": meta.Annotations["nginx.ingress.kubernetes.io/auth-url"],
128152
"auth-signin": meta.Annotations["nginx.ingress.kubernetes.io/auth-signin"],
129153
"github-org": meta.Annotations["oauth2-proxy-manager.k8s.io/github-org"],

Diff for: showcase/ingress-observer/main.go

+39-15
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,14 @@ func main() {
6363
AddFunc: func(obj interface{}) {
6464
key, err := cache.MetaNamespaceKeyFunc(obj)
6565
if err == nil {
66-
meta := obj.(*networkingv1.Ingress).ObjectMeta
66+
ing := obj.(*networkingv1.Ingress)
67+
meta := ing.ObjectMeta
6768
logrus.Infof("[Informer] Added Ingress %s", key)
6869

70+
if !shouldPerform(ing) {
71+
return
72+
}
73+
6974
settings, err := parseAnnotations(meta)
7075
if err == nil {
7176
logrus.WithField("settings", settings).Info("Dummy: Update Deployment / ConfigMap / Service / Secret / Ingress")
@@ -76,9 +81,14 @@ func main() {
7681
key, err := cache.MetaNamespaceKeyFunc(new)
7782

7883
if err == nil {
79-
meta := new.(*networkingv1.Ingress).ObjectMeta
84+
ing := new.(*networkingv1.Ingress)
85+
meta := ing.ObjectMeta
8086
logrus.Infof("[Informer] Update Ingress %s", key)
8187

88+
if !shouldPerform(ing) {
89+
return
90+
}
91+
8292
settings, err := parseAnnotations(meta)
8393
if err == nil {
8494
logrus.WithField("settings", settings).Info("Dummy: Update Deployment / ConfigMap / Service / Secret / Ingress")
@@ -88,9 +98,14 @@ func main() {
8898
DeleteFunc: func(obj interface{}) {
8999
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
90100
if err == nil {
91-
meta := obj.(*networkingv1.Ingress).ObjectMeta
101+
ing := obj.(*networkingv1.Ingress)
102+
meta := ing.ObjectMeta
92103
logrus.Infof("[Informer] Delete Ingress: %s", key)
93104

105+
if !shouldPerform(ing) {
106+
return
107+
}
108+
94109
settings, err := parseAnnotations(meta)
95110
if err == nil {
96111
logrus.WithField("settings", settings).Info("Dummy: Update Deployment / ConfigMap / Service / Secret / Ingress")
@@ -108,15 +123,25 @@ func main() {
108123
select {}
109124
}
110125

111-
func parseAnnotations(meta metav1.ObjectMeta) (*models.ServiceSettings, error) {
112-
// Check Annotations ---
113-
if _, ok := meta.Annotations["kubernetes.io/ingress.class"]; !ok {
114-
return nil, errors.New("ingress.class not found. skip.")
115-
} else if meta.Annotations["kubernetes.io/ingress.class"] != "nginx" {
116-
// or ingress.class is "nginx" ?
117-
return nil, errors.New("ingress.class is not nginx. skip.")
126+
func shouldPerform(ing *networkingv1.Ingress) bool {
127+
if ing == nil {
128+
logrus.Info("ingress is nil. skip.")
129+
return false
130+
}
131+
if ing.Spec.IngressClassName == nil {
132+
logrus.Info("ingress class is not found. skip.")
133+
return false
134+
}
135+
name := *ing.Spec.IngressClassName
136+
if name != "nginx" && name != "ingress-nginx" {
137+
logrus.Infof("ingress class is not `nginx` or `ingress-nginx` but %q. skip.", name)
138+
return false
118139
}
140+
return true
141+
}
119142

143+
func parseAnnotations(meta metav1.ObjectMeta) (*models.ServiceSettings, error) {
144+
// Check Annotations ---
120145
if _, ok := meta.Annotations["nginx.ingress.kubernetes.io/auth-url"]; !ok {
121146
return nil, errors.New("auth-url not found. skip.")
122147
}
@@ -134,11 +159,10 @@ func parseAnnotations(meta metav1.ObjectMeta) (*models.ServiceSettings, error) {
134159
}
135160

136161
logrus.WithFields(logrus.Fields{
137-
"ingress.class": meta.Annotations["kubernetes.io/ingress.class"],
138-
"auth-url": meta.Annotations["nginx.ingress.kubernetes.io/auth-url"],
139-
"auth-signin": meta.Annotations["nginx.ingress.kubernetes.io/auth-signin"],
140-
"github-org": meta.Annotations["oauth2-proxy-manager.lunasys.dev/github-org"],
141-
"github-teams": meta.Annotations["oauth2-proxy-manager.lunasys.dev/github-teams"],
162+
"auth-url": meta.Annotations["nginx.ingress.kubernetes.io/auth-url"],
163+
"auth-signin": meta.Annotations["nginx.ingress.kubernetes.io/auth-signin"],
164+
"github-org": meta.Annotations["oauth2-proxy-manager.lunasys.dev/github-org"],
165+
"github-teams": meta.Annotations["oauth2-proxy-manager.lunasys.dev/github-teams"],
142166
}).Debug("[ParseAnnotations]")
143167

144168
settings := &models.ServiceSettings{

0 commit comments

Comments
 (0)