Commit dd639a1f authored by Geoff Simmons's avatar Geoff Simmons

WIP: update to support k8s-1.22.

We now work with Ingress from the API group networking.k8s.io. Ingress
in the extensions API group is no longer supported. This entails:

- update RBAC grants
- update client-go code
- update the examples/tests, currently only using helm deployments
  - changes in the Ingress backend and service fields
  - for now we only test pathType:ImplementationSpecific, implemented
    as posix_type re2 matches, which had been the match implementation
    prior to this change.

viking will support the Match and Prefix pathTypes, but in this
iteration, it was not necessary to change the code to support the
ImplementationSpecific pathType.

Examples/tests with kubectl deployments and plain YAML manifests will
also be updated in an upcoming iteration.
parent 7778b708
...@@ -34,7 +34,7 @@ rules: ...@@ -34,7 +34,7 @@ rules:
- create - create
- patch - patch
- apiGroups: - apiGroups:
- extensions - networking.k8s.io
resources: resources:
- ingresses - ingresses
verbs: verbs:
...@@ -42,7 +42,7 @@ rules: ...@@ -42,7 +42,7 @@ rules:
- watch - watch
- get - get
- apiGroups: - apiGroups:
- "extensions" - networking.k8s.io
resources: resources:
- ingresses/status - ingresses/status
verbs: verbs:
......
...@@ -36,7 +36,7 @@ rules: ...@@ -36,7 +36,7 @@ rules:
- create - create
- patch - patch
- apiGroups: - apiGroups:
- extensions - networking.k8s.io
resources: resources:
- ingresses - ingresses
verbs: verbs:
...@@ -44,7 +44,7 @@ rules: ...@@ -44,7 +44,7 @@ rules:
- watch - watch
- get - get
- apiGroups: - apiGroups:
- "extensions" - networking.k8s.io
resources: resources:
- ingresses/status - ingresses/status
verbs: verbs:
......
apiVersion: extensions/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: {{ .Values.ingress.name }} name: {{ .Values.ingress.name }}
...@@ -22,9 +22,11 @@ spec: ...@@ -22,9 +22,11 @@ spec:
{{- end }} {{- end }}
{{- end }} {{- end }}
{{- if .Values.defaultApp }} {{- if .Values.defaultApp }}
backend: defaultBackend:
serviceName: {{ .Values.defaultApp.app }}-svc service:
servicePort: {{ default "80" .Values.defaultApp.servicePort }} name: {{ .Values.defaultApp.app }}-svc
port:
number: {{ default "80" .Values.defaultApp.servicePort }}
{{- end }} {{- end }}
{{- if .Values.ingress.rules }} {{- if .Values.ingress.rules }}
rules: rules:
...@@ -34,9 +36,12 @@ spec: ...@@ -34,9 +36,12 @@ spec:
paths: paths:
{{- range $path := $rule.paths }} {{- range $path := $rule.paths }}
- path: {{ $path.path }} - path: {{ $path.path }}
pathType: ImplementationSpecific
backend: backend:
serviceName: {{ $path.app }}-svc service:
servicePort: {{ default "80" $path.servicePort }} name: {{ $path.app }}-svc
port:
number: {{ default "80" $path.servicePort }}
{{- end }} {{- end }}
{{- end }} {{- end }}
{{- end }} {{- end }}
...@@ -15,7 +15,7 @@ kubectl port-forward svc/varnish-ingress ${LOCALPORT}:80 >/dev/null & ...@@ -15,7 +15,7 @@ kubectl port-forward svc/varnish-ingress ${LOCALPORT}:80 >/dev/null &
trap 'kill $(jobs -p)' EXIT trap 'kill $(jobs -p)' EXIT
wait_for_port ${LOCALPORT} wait_for_port ${LOCALPORT}
# XXX intermittent 503 responses immediately after the config is valid. # Give VMOD dynamic enough time to update the IP from DNS.
sleep 10 sleep 30
varnishtest ${TESTOPTS} -Dlocalport=${LOCALPORT} ../hello/cafe.vtc varnishtest ${TESTOPTS} -Dlocalport=${LOCALPORT} ../hello/cafe.vtc
...@@ -33,7 +33,7 @@ import ( ...@@ -33,7 +33,7 @@ import (
"code.uplex.de/uplex-varnish/k8s-ingress/pkg/update" "code.uplex.de/uplex-varnish/k8s-ingress/pkg/update"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
) )
...@@ -41,7 +41,7 @@ import ( ...@@ -41,7 +41,7 @@ import (
func (worker *NamespaceWorker) enqueueIngsForBackendSvcs(svcs []string, func (worker *NamespaceWorker) enqueueIngsForBackendSvcs(svcs []string,
namespace, name string) update.Status { namespace, name string) update.Status {
svc2ing := make(map[string]*extensions.Ingress) svc2ing := make(map[string]*net_v1.Ingress)
ings, err := worker.ing.List(labels.Everything()) ings, err := worker.ing.List(labels.Everything())
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
return update.MakeNoop( return update.MakeNoop(
...@@ -52,15 +52,15 @@ func (worker *NamespaceWorker) enqueueIngsForBackendSvcs(svcs []string, ...@@ -52,15 +52,15 @@ func (worker *NamespaceWorker) enqueueIngsForBackendSvcs(svcs []string,
return update.MakeRecoverable("%v", err) return update.MakeRecoverable("%v", err)
} }
for _, ing := range ings { for _, ing := range ings {
if ing.Spec.Backend != nil { if ing.Spec.DefaultBackend != nil {
svc2ing[ing.Spec.Backend.ServiceName] = ing svc2ing[ing.Spec.DefaultBackend.Service.Name] = ing
} }
for _, rule := range ing.Spec.Rules { for _, rule := range ing.Spec.Rules {
if rule.HTTP == nil { if rule.HTTP == nil {
continue continue
} }
for _, path := range rule.HTTP.Paths { for _, path := range rule.HTTP.Paths {
svc2ing[path.Backend.ServiceName] = ing svc2ing[path.Backend.Service.Name] = ing
} }
} }
} }
......
...@@ -50,12 +50,12 @@ import ( ...@@ -50,12 +50,12 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
core_v1 "k8s.io/client-go/kubernetes/typed/core/v1" core_v1 "k8s.io/client-go/kubernetes/typed/core/v1"
core_v1_listers "k8s.io/client-go/listers/core/v1" core_v1_listers "k8s.io/client-go/listers/core/v1"
ext_listers "k8s.io/client-go/listers/extensions/v1beta1" net_v1_listers "k8s.io/client-go/listers/networking/v1"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
api_v1 "k8s.io/api/core/v1" api_v1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
...@@ -109,7 +109,7 @@ type SyncObj struct { ...@@ -109,7 +109,7 @@ type SyncObj struct {
// IngressController, and handed off to NamespaceWorker workers to // IngressController, and handed off to NamespaceWorker workers to
// read data from the client-go cache. // read data from the client-go cache.
type Listers struct { type Listers struct {
ing ext_listers.IngressLister ing net_v1_listers.IngressLister
svc core_v1_listers.ServiceLister svc core_v1_listers.ServiceLister
endp core_v1_listers.EndpointsLister endp core_v1_listers.EndpointsLister
tsecr core_v1_listers.SecretLister tsecr core_v1_listers.SecretLister
...@@ -176,7 +176,7 @@ func NewIngressController( ...@@ -176,7 +176,7 @@ func NewIngressController(
if err := api_v1.AddToScheme(evtScheme); err != nil { if err := api_v1.AddToScheme(evtScheme); err != nil {
return nil, err return nil, err
} }
if err := extensions.AddToScheme(evtScheme); err != nil { if err := net_v1.AddToScheme(evtScheme); err != nil {
return nil, err return nil, err
} }
if err := vcr_v1alpha1.AddToScheme(evtScheme); err != nil { if err := vcr_v1alpha1.AddToScheme(evtScheme); err != nil {
...@@ -186,7 +186,7 @@ func NewIngressController( ...@@ -186,7 +186,7 @@ func NewIngressController(
api_v1.EventSource{Component: "varnish-ingress-controller"}) api_v1.EventSource{Component: "varnish-ingress-controller"})
ingc.informers = &infrmrs{ ingc.informers = &infrmrs{
ing: infFactory.Extensions().V1beta1().Ingresses().Informer(), ing: infFactory.Networking().V1().Ingresses().Informer(),
svc: infFactory.Core().V1().Services().Informer(), svc: infFactory.Core().V1().Services().Informer(),
endp: infFactory.Core().V1().Endpoints().Informer(), endp: infFactory.Core().V1().Endpoints().Informer(),
vsecr: vsecrInfFactory.Core().V1().Secrets().Informer(), vsecr: vsecrInfFactory.Core().V1().Secrets().Informer(),
...@@ -228,7 +228,7 @@ func NewIngressController( ...@@ -228,7 +228,7 @@ func NewIngressController(
} }
ingc.listers = &Listers{ ingc.listers = &Listers{
ing: infFactory.Extensions().V1beta1().Ingresses().Lister(), ing: infFactory.Networking().V1().Ingresses().Lister(),
svc: infFactory.Core().V1().Services().Lister(), svc: infFactory.Core().V1().Services().Lister(),
endp: infFactory.Core().V1().Endpoints().Lister(), endp: infFactory.Core().V1().Endpoints().Lister(),
vsecr: vsecrInfFactory.Core().V1().Secrets().Lister(), vsecr: vsecrInfFactory.Core().V1().Secrets().Lister(),
...@@ -284,7 +284,7 @@ func (ingc *IngressController) logObj(action string, obj interface{}) { ...@@ -284,7 +284,7 @@ func (ingc *IngressController) logObj(action string, obj interface{}) {
func incWatchCounter(obj interface{}, sync string) { func incWatchCounter(obj interface{}, sync string) {
switch obj.(type) { switch obj.(type) {
case *extensions.Ingress: case *net_v1.Ingress:
watchCounters.WithLabelValues("Ingress", sync).Inc() watchCounters.WithLabelValues("Ingress", sync).Inc()
case *api_v1.Service: case *api_v1.Service:
watchCounters.WithLabelValues("Service", sync).Inc() watchCounters.WithLabelValues("Service", sync).Inc()
...@@ -334,7 +334,7 @@ func (ingc *IngressController) updateObj(old, new interface{}) { ...@@ -334,7 +334,7 @@ func (ingc *IngressController) updateObj(old, new interface{}) {
} else { } else {
kind := "Unknown" kind := "Unknown"
switch old.(type) { switch old.(type) {
case *extensions.Ingress: case *net_v1.Ingress:
kind = "Ingress" kind = "Ingress"
case *api_v1.Service: case *api_v1.Service:
kind = "Service" kind = "Service"
......
...@@ -69,7 +69,7 @@ func (worker *NamespaceWorker) syncEndp(key string) update.Status { ...@@ -69,7 +69,7 @@ func (worker *NamespaceWorker) syncEndp(key string) update.Status {
worker.log.Tracef("Update ingresses for endpoints %s", key) worker.log.Tracef("Update ingresses for endpoints %s", key)
requeued := make([]string, 0, len(ings)) requeued := make([]string, 0, len(ings))
for _, ing := range ings { for _, ing := range ings {
if !worker.isVarnishIngress(ing) { if !worker.isVikingIngress(ing) {
worker.log.Tracef("Ingress %s/%s: not Varnish", worker.log.Tracef("Ingress %s/%s: not Varnish",
ing.Namespace, ing.Name) ing.Namespace, ing.Name)
continue continue
......
...@@ -46,10 +46,9 @@ import ( ...@@ -46,10 +46,9 @@ import (
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/intstr"
api_v1 "k8s.io/api/core/v1" api_v1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
...@@ -93,7 +92,7 @@ func (worker *NamespaceWorker) filterVarnishIngSvcs( ...@@ -93,7 +92,7 @@ func (worker *NamespaceWorker) filterVarnishIngSvcs(
} }
func (worker *NamespaceWorker) getVarnishSvcForIng( func (worker *NamespaceWorker) getVarnishSvcForIng(
ing *extensions.Ingress) (*api_v1.Service, error) { ing *net_v1.Ingress) (*api_v1.Service, error) {
svcs, err := worker.listers.svc.List(varnishIngressSelector) svcs, err := worker.listers.svc.List(varnishIngressSelector)
if err != nil { if err != nil {
...@@ -146,7 +145,7 @@ func (worker *NamespaceWorker) getVarnishSvcForIng( ...@@ -146,7 +145,7 @@ func (worker *NamespaceWorker) getVarnishSvcForIng(
} }
func (worker *NamespaceWorker) getIngsForVarnishSvc( func (worker *NamespaceWorker) getIngsForVarnishSvc(
svc *api_v1.Service) ([]*extensions.Ingress, error) { svc *api_v1.Service) ([]*net_v1.Ingress, error) {
ings, err := worker.listers.ing.List(labels.Everything()) ings, err := worker.listers.ing.List(labels.Everything())
if err != nil { if err != nil {
...@@ -163,9 +162,9 @@ func (worker *NamespaceWorker) getIngsForVarnishSvc( ...@@ -163,9 +162,9 @@ func (worker *NamespaceWorker) getIngsForVarnishSvc(
} }
nsVarnishSvcs = worker.filterVarnishIngSvcs(nsVarnishSvcs) nsVarnishSvcs = worker.filterVarnishIngSvcs(nsVarnishSvcs)
ings4Svc := make([]*extensions.Ingress, 0) ings4Svc := make([]*net_v1.Ingress, 0)
for _, ing := range ings { for _, ing := range ings {
if !worker.isVarnishIngress(ing) { if !worker.isVikingIngress(ing) {
continue continue
} }
namespace := ing.Namespace namespace := ing.Namespace
...@@ -195,11 +194,11 @@ func (worker *NamespaceWorker) getIngsForVarnishSvc( ...@@ -195,11 +194,11 @@ func (worker *NamespaceWorker) getIngsForVarnishSvc(
return ings4Svc, nil return ings4Svc, nil
} }
func ingMergeError(ings []*extensions.Ingress) error { func ingMergeError(ings []*net_v1.Ingress) error {
host2ing := make(map[string]*extensions.Ingress) host2ing := make(map[string]*net_v1.Ingress)
var ingWdefBackend *extensions.Ingress var ingWdefBackend *net_v1.Ingress
for _, ing := range ings { for _, ing := range ings {
if ing.Spec.Backend != nil { if ing.Spec.DefaultBackend != nil {
if ingWdefBackend != nil { if ingWdefBackend != nil {
return fmt.Errorf("Default backend configured "+ return fmt.Errorf("Default backend configured "+
"in more than one Ingress: %s/%s and "+ "in more than one Ingress: %s/%s and "+
...@@ -224,10 +223,10 @@ func ingMergeError(ings []*extensions.Ingress) error { ...@@ -224,10 +223,10 @@ func ingMergeError(ings []*extensions.Ingress) error {
func (worker *NamespaceWorker) ingBackend2Addrs( func (worker *NamespaceWorker) ingBackend2Addrs(
namespace string, namespace string,
backend extensions.IngressBackend, backend net_v1.IngressBackend,
) (addrs []vcl.Address, extName string, extPort string, status update.Status) { ) (addrs []vcl.Address, extName string, extPort string, status update.Status) {
nsLister := worker.listers.svc.Services(namespace) nsLister := worker.listers.svc.Services(namespace)
svc, err := nsLister.Get(backend.ServiceName) svc, err := nsLister.Get(backend.Service.Name)
if err != nil { if err != nil {
status = IncompleteIfNotFound(err, "%v", err) status = IncompleteIfNotFound(err, "%v", err)
return return
...@@ -252,7 +251,7 @@ func (worker *NamespaceWorker) ingBackend2Addrs( ...@@ -252,7 +251,7 @@ func (worker *NamespaceWorker) ingBackend2Addrs(
} }
extPort = svc.Spec.Ports[idx].TargetPort.String() extPort = svc.Spec.Ports[idx].TargetPort.String()
} else { } else {
extPort = backend.ServicePort.String() extPort = backend.Service.Port.String()
} }
return return
} }
...@@ -272,12 +271,11 @@ func (worker *NamespaceWorker) ingBackend2Addrs( ...@@ -272,12 +271,11 @@ func (worker *NamespaceWorker) ingBackend2Addrs(
} }
targetPort := int32(0) targetPort := int32(0)
ingSvcPort := backend.ServicePort ingSvcPort := backend.Service.Port
for _, port := range svc.Spec.Ports { for _, port := range svc.Spec.Ports {
if (ingSvcPort.Type == intstr.Int && if (ingSvcPort.Number != 0 && port.Port == ingSvcPort.Number) ||
port.Port == int32(ingSvcPort.IntValue())) || (ingSvcPort.Number == 0 &&
(ingSvcPort.Type == intstr.String && port.Name == ingSvcPort.Name) {
port.Name == ingSvcPort.String()) {
targetPort, err = worker. targetPort, err = worker.
getTargetPort(&port, svc) getTargetPort(&port, svc)
if err != nil { if err != nil {
...@@ -517,7 +515,7 @@ BCfgs: ...@@ -517,7 +515,7 @@ BCfgs:
return vclSvc, bcfg, onload, update.MakeSuccess("") return vclSvc, bcfg, onload, update.MakeSuccess("")
} }
func (worker *NamespaceWorker) ings2VCLSpec(ings []*extensions.Ingress) ( func (worker *NamespaceWorker) ings2VCLSpec(ings []*net_v1.Ingress) (
vcl.Spec, vcl.Spec,
map[string]*vcr_v1alpha1.BackendConfig, map[string]*vcr_v1alpha1.BackendConfig,
map[string]*haproxy.OnloadSpec, map[string]*haproxy.OnloadSpec,
...@@ -534,24 +532,24 @@ func (worker *NamespaceWorker) ings2VCLSpec(ings []*extensions.Ingress) ( ...@@ -534,24 +532,24 @@ func (worker *NamespaceWorker) ings2VCLSpec(ings []*extensions.Ingress) (
if namespace == "" { if namespace == "" {
namespace = "default" namespace = "default"
} }
if ing.Spec.Backend != nil { if ing.Spec.DefaultBackend != nil {
if vclSpec.DefaultService.Name != "" { if vclSpec.DefaultService.Name != "" {
panic("More than one Ingress default backend") panic("More than one Ingress default backend")
} }
backend := ing.Spec.Backend backend := ing.Spec.DefaultBackend
addrs, extName, extPort, status := worker. addrs, extName, extPort, status := worker.
ingBackend2Addrs(namespace, *backend) ingBackend2Addrs(namespace, *backend)
if status.IsError() { if status.IsError() {
return vclSpec, bcfgs, onlds, status return vclSpec, bcfgs, onlds, status
} }
vclSvc, bcfg, onload, status := worker. vclSvc, bcfg, onload, status := worker.
getVCLSvc(namespace, backend.ServiceName, addrs, getVCLSvc(namespace, backend.Service.Name,
extName, extPort) addrs, extName, extPort)
if status.IsError() { if status.IsError() {
return vclSpec, bcfgs, onlds, status return vclSpec, bcfgs, onlds, status
} }
vclSpec.DefaultService = vclSvc vclSpec.DefaultService = vclSvc
key := namespace + "/" + backend.ServiceName key := namespace + "/" + backend.Service.Name
if extName == "" { if extName == "" {
vclSpec.IntSvcs[key] = vclSvc vclSpec.IntSvcs[key] = vclSvc
if onload != nil { if onload != nil {
...@@ -592,14 +590,14 @@ func (worker *NamespaceWorker) ings2VCLSpec(ings []*extensions.Ingress) ( ...@@ -592,14 +590,14 @@ func (worker *NamespaceWorker) ings2VCLSpec(ings []*extensions.Ingress) (
} }
vclSvc, bcfg, onload, status := worker. vclSvc, bcfg, onload, status := worker.
getVCLSvc(namespace, getVCLSvc(namespace,
path.Backend.ServiceName, addrs, path.Backend.Service.Name, addrs,
extName, extPort) extName, extPort)
if status.IsError() { if status.IsError() {
return vclSpec, bcfgs, onlds, status return vclSpec, bcfgs, onlds, status
} }
vclRule.PathMap[path.Path] = vclSvc vclRule.PathMap[path.Path] = vclSvc
key := namespace + "/" + key := namespace + "/" +
path.Backend.ServiceName path.Backend.Service.Name
if extName == "" { if extName == "" {
vclSpec.IntSvcs[key] = vclSvc vclSpec.IntSvcs[key] = vclSvc
if onload != nil { if onload != nil {
...@@ -929,7 +927,7 @@ func (worker *NamespaceWorker) configReqDisps(spec *vcl.Spec, ...@@ -929,7 +927,7 @@ func (worker *NamespaceWorker) configReqDisps(spec *vcl.Spec,
func (worker *NamespaceWorker) ings2OffloaderSpec( func (worker *NamespaceWorker) ings2OffloaderSpec(
svc *api_v1.Service, svc *api_v1.Service,
ings []*extensions.Ingress, ings []*net_v1.Ingress,
) (haproxy.Spec, error) { ) (haproxy.Spec, error) {
offldrSpec := haproxy.Spec{ offldrSpec := haproxy.Spec{
Namespace: svc.Namespace, Namespace: svc.Namespace,
...@@ -964,7 +962,7 @@ func (worker *NamespaceWorker) ings2OffloaderSpec( ...@@ -964,7 +962,7 @@ func (worker *NamespaceWorker) ings2OffloaderSpec(
// Ingress, using network addresses of the Services that expose the // Ingress, using network addresses of the Services that expose the
// http and https ports. // http and https ports.
func (worker *NamespaceWorker) updateIngStatus( func (worker *NamespaceWorker) updateIngStatus(
admSvc *api_v1.Service, ings []*extensions.Ingress, admSvc *api_v1.Service, ings []*net_v1.Ingress,
) update.Status { ) update.Status {
svcs, err := worker.svc.List(vikingPubSvcSelector) svcs, err := worker.svc.List(vikingPubSvcSelector)
if err != nil { if err != nil {
...@@ -1058,7 +1056,7 @@ func (worker *NamespaceWorker) updateIngStatus( ...@@ -1058,7 +1056,7 @@ func (worker *NamespaceWorker) updateIngStatus(
ing.Status.LoadBalancer.Ingress = ing.Status.LoadBalancer.Ingress =
make([]api_v1.LoadBalancerIngress, len(ips)+len(hosts)) make([]api_v1.LoadBalancerIngress, len(ips)+len(hosts))
copy(ing.Status.LoadBalancer.Ingress, lb) copy(ing.Status.LoadBalancer.Ingress, lb)
ingClient := worker.client.ExtensionsV1beta1(). ingClient := worker.client.NetworkingV1().
Ingresses(ing.Namespace) Ingresses(ing.Namespace)
if _, err := ingClient.UpdateStatus(context.TODO(), ing, if _, err := ingClient.UpdateStatus(context.TODO(), ing,
metav1.UpdateOptions{}); err != nil { metav1.UpdateOptions{}); err != nil {
...@@ -1071,7 +1069,7 @@ func (worker *NamespaceWorker) updateIngStatus( ...@@ -1071,7 +1069,7 @@ func (worker *NamespaceWorker) updateIngStatus(
} }
func (worker *NamespaceWorker) addOrUpdateIng( func (worker *NamespaceWorker) addOrUpdateIng(
ing *extensions.Ingress, ing *net_v1.Ingress,
) update.Status { ) update.Status {
ingKey := ing.ObjectMeta.Namespace + "/" + ing.ObjectMeta.Name ingKey := ing.ObjectMeta.Namespace + "/" + ing.ObjectMeta.Name
worker.log.Infof("Adding or Updating Ingress: %s", ingKey) worker.log.Infof("Adding or Updating Ingress: %s", ingKey)
...@@ -1272,15 +1270,15 @@ func (worker *NamespaceWorker) addOrUpdateIng( ...@@ -1272,15 +1270,15 @@ func (worker *NamespaceWorker) addOrUpdateIng(
// We only handle Ingresses with the class annotation with the value // We only handle Ingresses with the class annotation with the value
// given as the "class" flag (default "varnish"). // given as the "class" flag (default "varnish").
func (worker *NamespaceWorker) isVarnishIngress(ing *extensions.Ingress) bool { func (worker *NamespaceWorker) isVikingIngress(ing *net_v1.Ingress) bool {
class, exists := ing.Annotations[ingressClassKey] class, exists := ing.Annotations[ingressClassKey]
return exists && class == worker.ingClass return exists && class == worker.ingClass
} }
func (worker *NamespaceWorker) chkAddOrUpdateIng( func (worker *NamespaceWorker) chkAddOrUpdateIng(
ing *extensions.Ingress) update.Status { ing *net_v1.Ingress) update.Status {
if !worker.isVarnishIngress(ing) { if !worker.isVikingIngress(ing) {
syncCounters.WithLabelValues(worker.namespace, "Ingress", syncCounters.WithLabelValues(worker.namespace, "Ingress",
"Ignore").Inc() "Ignore").Inc()
return update.MakeNoop("Ignoring Ingress %s/%s, "+ return update.MakeNoop("Ignoring Ingress %s/%s, "+
...@@ -1310,7 +1308,7 @@ func (worker *NamespaceWorker) updateIng(key string) update.Status { ...@@ -1310,7 +1308,7 @@ func (worker *NamespaceWorker) updateIng(key string) update.Status {
} }
func (worker *NamespaceWorker) deleteIng(obj interface{}) update.Status { func (worker *NamespaceWorker) deleteIng(obj interface{}) update.Status {
ing, ok := obj.(*extensions.Ingress) ing, ok := obj.(*net_v1.Ingress)
if !ok || ing == nil { if !ok || ing == nil {
return update.MakeNoop("Delete Ingress: not found: %v", obj) return update.MakeNoop("Delete Ingress: not found: %v", obj)
} }
......
...@@ -34,7 +34,7 @@ import ( ...@@ -34,7 +34,7 @@ import (
vcr_v1alpha1 "code.uplex.de/uplex-varnish/k8s-ingress/pkg/apis/varnishingress/v1alpha1" vcr_v1alpha1 "code.uplex.de/uplex-varnish/k8s-ingress/pkg/apis/varnishingress/v1alpha1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"code.uplex.de/uplex-varnish/k8s-ingress/pkg/varnish/vcl" "code.uplex.de/uplex-varnish/k8s-ingress/pkg/varnish/vcl"
...@@ -42,43 +42,47 @@ import ( ...@@ -42,43 +42,47 @@ import (
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
var ing1 = &extensions.Ingress{ var ing1 = &net_v1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: "default", Namespace: "default",
Name: "ing1", Name: "ing1",
}, },
Spec: extensions.IngressSpec{ Spec: net_v1.IngressSpec{
Backend: &extensions.IngressBackend{ DefaultBackend: &net_v1.IngressBackend{
ServiceName: "default-svc2", Service: &net_v1.IngressServiceBackend{
Name: "default-svc2",
},
}, },
Rules: []extensions.IngressRule{ Rules: []net_v1.IngressRule{
{Host: "host1"}, {Host: "host1"},
}, },
}, },
} }
var ing2 = &extensions.Ingress{ var ing2 = &net_v1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: "default", Namespace: "default",
Name: "ing2", Name: "ing2",
}, },
Spec: extensions.IngressSpec{ Spec: net_v1.IngressSpec{
Backend: &extensions.IngressBackend{ DefaultBackend: &net_v1.IngressBackend{
ServiceName: "default-svc2", Service: &net_v1.IngressServiceBackend{
Name: "default-svc2",
},
}, },
Rules: []extensions.IngressRule{ Rules: []net_v1.IngressRule{
{Host: "host2"}, {Host: "host2"},
}, },
}, },
} }
var ing3 = &extensions.Ingress{ var ing3 = &net_v1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: "default", Namespace: "default",
Name: "ing3", Name: "ing3",
}, },
Spec: extensions.IngressSpec{ Spec: net_v1.IngressSpec{
Rules: []extensions.IngressRule{ Rules: []net_v1.IngressRule{
{Host: "host1"}, {Host: "host1"},
{Host: "host2"}, {Host: "host2"},
}, },
...@@ -86,7 +90,7 @@ var ing3 = &extensions.Ingress{ ...@@ -86,7 +90,7 @@ var ing3 = &extensions.Ingress{
} }
func TestIngressMergeError(t *testing.T) { func TestIngressMergeError(t *testing.T) {
ings := []*extensions.Ingress{ing1, ing2} ings := []*net_v1.Ingress{ing1, ing2}
if err := ingMergeError(ings); err == nil { if err := ingMergeError(ings); err == nil {
t.Errorf("ingMergeError(): no error reported for more than " + t.Errorf("ingMergeError(): no error reported for more than " +
"one default backend") "one default backend")
...@@ -94,7 +98,7 @@ func TestIngressMergeError(t *testing.T) { ...@@ -94,7 +98,7 @@ func TestIngressMergeError(t *testing.T) {
t.Logf("ingMergeError() returned as expected: %v", err) t.Logf("ingMergeError() returned as expected: %v", err)
} }
ings = []*extensions.Ingress{ing2, ing3} ings = []*net_v1.Ingress{ing2, ing3}
if err := ingMergeError(ings); err == nil { if err := ingMergeError(ings); err == nil {
t.Errorf("ingMergeError(): no error reported for overlapping " + t.Errorf("ingMergeError(): no error reported for overlapping " +
"Hosts") "Hosts")
......
...@@ -33,7 +33,7 @@ import ( ...@@ -33,7 +33,7 @@ import (
vcr_v1alpha1 "code.uplex.de/uplex-varnish/k8s-ingress/pkg/apis/varnishingress/v1alpha1" vcr_v1alpha1 "code.uplex.de/uplex-varnish/k8s-ingress/pkg/apis/varnishingress/v1alpha1"
api_v1 "k8s.io/api/core/v1" api_v1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
...@@ -64,7 +64,7 @@ var ( ...@@ -64,7 +64,7 @@ var (
func (worker *NamespaceWorker) getIngsForTLSSecret( func (worker *NamespaceWorker) getIngsForTLSSecret(
secret *api_v1.Secret, secret *api_v1.Secret,
) (ings []*extensions.Ingress, status update.Status) { ) (ings []*net_v1.Ingress, status update.Status) {
nsIngs, err := worker.ing.List(labels.Everything()) nsIngs, err := worker.ing.List(labels.Everything())
if err != nil { if err != nil {
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
...@@ -77,7 +77,7 @@ func (worker *NamespaceWorker) getIngsForTLSSecret( ...@@ -77,7 +77,7 @@ func (worker *NamespaceWorker) getIngsForTLSSecret(
} }
for _, ing := range nsIngs { for _, ing := range nsIngs {
if !worker.isVarnishIngress(ing) { if !worker.isVikingIngress(ing) {
continue continue
} }
for _, tls := range ing.Spec.TLS { for _, tls := range ing.Spec.TLS {
......
...@@ -34,25 +34,26 @@ import ( ...@@ -34,25 +34,26 @@ import (
"testing" "testing"
api_v1 "k8s.io/api/core/v1" api_v1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
ext_listers "k8s.io/client-go/listers/extensions/v1beta1" net_v1_listers "k8s.io/client-go/listers/networking/v1"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
func setupIngLister( func setupIngLister(
client *fake.Clientset, ns string) ext_listers.IngressNamespaceLister { client *fake.Clientset,
ns string,
) net_v1_listers.IngressNamespaceLister {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
infFactory := informers.NewSharedInformerFactory(client, 0) infFactory := informers.NewSharedInformerFactory(client, 0)
ingInformer := infFactory.Extensions().V1beta1().Ingresses().Informer() ingInformer := infFactory.Networking().V1().Ingresses().Informer()
ingLister := infFactory.Extensions().V1beta1().Ingresses().Lister() ingLister := infFactory.Networking().V1().Ingresses().Lister()
ingNsLister := ingLister.Ingresses(ns) ingNsLister := ingLister.Ingresses(ns)
infFactory.Start(ctx.Done()) infFactory.Start(ctx.Done())
...@@ -69,7 +70,7 @@ func TestIngsForTLSSecret(t *testing.T) { ...@@ -69,7 +70,7 @@ func TestIngsForTLSSecret(t *testing.T) {
noIngClassSecret := "no-ing-class-secret" noIngClassSecret := "no-ing-class-secret"
client := fake.NewSimpleClientset( client := fake.NewSimpleClientset(
&extensions.Ingress{ &net_v1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: ns, Namespace: ns,
Name: ingName, Name: ingName,
...@@ -77,13 +78,13 @@ func TestIngsForTLSSecret(t *testing.T) { ...@@ -77,13 +78,13 @@ func TestIngsForTLSSecret(t *testing.T) {
ingressClassKey: ingClass, ingressClassKey: ingClass,
}, },
}, },
Spec: extensions.IngressSpec{ Spec: net_v1.IngressSpec{
TLS: []extensions.IngressTLS{{ TLS: []net_v1.IngressTLS{{
SecretName: secretName, SecretName: secretName,
}}, }},
}, },
}, },
&extensions.Ingress{ &net_v1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: ns, Namespace: ns,
Name: "wrong-ing-class", Name: "wrong-ing-class",
...@@ -91,24 +92,24 @@ func TestIngsForTLSSecret(t *testing.T) { ...@@ -91,24 +92,24 @@ func TestIngsForTLSSecret(t *testing.T) {
ingressClassKey: "wrong-ing-class", ingressClassKey: "wrong-ing-class",
}, },
}, },
Spec: extensions.IngressSpec{ Spec: net_v1.IngressSpec{
TLS: []extensions.IngressTLS{{ TLS: []net_v1.IngressTLS{{
SecretName: wrongIngClassSecret, SecretName: wrongIngClassSecret,
}}, }},
}, },
}, },
&extensions.Ingress{ &net_v1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: ns, Namespace: ns,
Name: "no-ing-class", Name: "no-ing-class",
}, },
Spec: extensions.IngressSpec{ Spec: net_v1.IngressSpec{
TLS: []extensions.IngressTLS{{ TLS: []net_v1.IngressTLS{{
SecretName: noIngClassSecret, SecretName: noIngClassSecret,
}}, }},
}, },
}, },
&extensions.Ingress{ &net_v1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: ns, Namespace: ns,
Name: "different-secret-name", Name: "different-secret-name",
...@@ -116,8 +117,8 @@ func TestIngsForTLSSecret(t *testing.T) { ...@@ -116,8 +117,8 @@ func TestIngsForTLSSecret(t *testing.T) {
ingressClassKey: ingClass, ingressClassKey: ingClass,
}, },
}, },
Spec: extensions.IngressSpec{ Spec: net_v1.IngressSpec{
TLS: []extensions.IngressTLS{{ TLS: []net_v1.IngressTLS{{
SecretName: "different-secret-name", SecretName: "different-secret-name",
}}, }},
}, },
......
...@@ -36,7 +36,7 @@ import ( ...@@ -36,7 +36,7 @@ import (
"code.uplex.de/uplex-varnish/k8s-ingress/pkg/varnish/vcl" "code.uplex.de/uplex-varnish/k8s-ingress/pkg/varnish/vcl"
api_v1 "k8s.io/api/core/v1" api_v1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
) )
...@@ -70,7 +70,7 @@ func (worker *NamespaceWorker) isVarnishIngSvc(svc *api_v1.Service) bool { ...@@ -70,7 +70,7 @@ func (worker *NamespaceWorker) isVarnishIngSvc(svc *api_v1.Service) bool {
func (worker *NamespaceWorker) getIngsForSvc( func (worker *NamespaceWorker) getIngsForSvc(
svc *api_v1.Service, svc *api_v1.Service,
) (ings []*extensions.Ingress, status update.Status) { ) (ings []*net_v1.Ingress, status update.Status) {
allIngs, err := worker.ing.List(labels.Everything()) allIngs, err := worker.ing.List(labels.Everything())
if err != nil { if err != nil {
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
...@@ -91,8 +91,8 @@ func (worker *NamespaceWorker) getIngsForSvc( ...@@ -91,8 +91,8 @@ func (worker *NamespaceWorker) getIngsForSvc(
continue continue
} }
cpy := ing.DeepCopy() cpy := ing.DeepCopy()
if cpy.Spec.Backend != nil { if cpy.Spec.DefaultBackend != nil {
if cpy.Spec.Backend.ServiceName == svc.Name { if cpy.Spec.DefaultBackend.Service.Name == svc.Name {
ings = append(ings, cpy) ings = append(ings, cpy)
} }
} }
...@@ -101,7 +101,7 @@ func (worker *NamespaceWorker) getIngsForSvc( ...@@ -101,7 +101,7 @@ func (worker *NamespaceWorker) getIngsForSvc(
continue continue
} }
for _, p := range rules.IngressRuleValue.HTTP.Paths { for _, p := range rules.IngressRuleValue.HTTP.Paths {
if p.Backend.ServiceName == svc.Name { if p.Backend.Service.Name == svc.Name {
ings = append(ings, cpy) ings = append(ings, cpy)
} }
} }
...@@ -129,7 +129,7 @@ func (worker *NamespaceWorker) enqueueIngressForService( ...@@ -129,7 +129,7 @@ func (worker *NamespaceWorker) enqueueIngressForService(
} }
requeued := make([]string, 0, len(ings)) requeued := make([]string, 0, len(ings))
for _, ing := range ings { for _, ing := range ings {
if !worker.isVarnishIngress(ing) { if !worker.isVikingIngress(ing) {
continue continue
} }
worker.queue.Add(&SyncObj{Type: Update, Obj: ing}) worker.queue.Add(&SyncObj{Type: Update, Obj: ing})
...@@ -147,7 +147,7 @@ func (worker *NamespaceWorker) enqueueIngressForService( ...@@ -147,7 +147,7 @@ func (worker *NamespaceWorker) enqueueIngressForService(
// Return true if changes in Varnish services may lead to changes in // Return true if changes in Varnish services may lead to changes in
// the VCL config generated for the Ingress. // the VCL config generated for the Ingress.
func (worker *NamespaceWorker) isVarnishInVCLSpec(ing *extensions.Ingress) bool { func (worker *NamespaceWorker) isVarnishInVCLSpec(ing *net_v1.Ingress) bool {
vcfgs, err := worker.vcfg.List(labels.Everything()) vcfgs, err := worker.vcfg.List(labels.Everything())
if err != nil { if err != nil {
worker.log.Warnf("Error retrieving VarnishConfigs in "+ worker.log.Warnf("Error retrieving VarnishConfigs in "+
......
...@@ -41,7 +41,7 @@ import ( ...@@ -41,7 +41,7 @@ import (
"code.uplex.de/uplex-varnish/k8s-ingress/pkg/varnish/vcl" "code.uplex.de/uplex-varnish/k8s-ingress/pkg/varnish/vcl"
api_v1 "k8s.io/api/core/v1" api_v1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
) )
// Don't return error (requeuing the vcfg) if either of Ingresses or // Don't return error (requeuing the vcfg) if either of Ingresses or
...@@ -50,7 +50,7 @@ import ( ...@@ -50,7 +50,7 @@ import (
func (worker *NamespaceWorker) enqueueIngsForVcfg( func (worker *NamespaceWorker) enqueueIngsForVcfg(
vcfg *vcr_v1alpha1.VarnishConfig) update.Status { vcfg *vcr_v1alpha1.VarnishConfig) update.Status {
svc2ing := make(map[*api_v1.Service]*extensions.Ingress) svc2ing := make(map[*api_v1.Service]*net_v1.Ingress)
ings, err := worker.ing.List(labels.Everything()) ings, err := worker.ing.List(labels.Everything())
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
return update.MakeNoop("VarnishConfig %s/%s: no Ingresses "+ return update.MakeNoop("VarnishConfig %s/%s: no Ingresses "+
...@@ -61,7 +61,7 @@ func (worker *NamespaceWorker) enqueueIngsForVcfg( ...@@ -61,7 +61,7 @@ func (worker *NamespaceWorker) enqueueIngsForVcfg(
return update.MakeRecoverable("%v", err) return update.MakeRecoverable("%v", err)
} }
for _, ing := range ings { for _, ing := range ings {
if !worker.isVarnishIngress(ing) { if !worker.isVikingIngress(ing) {
continue continue
} }
vSvc, err := worker.getVarnishSvcForIng(ing) vSvc, err := worker.getVarnishSvcForIng(ing)
......
...@@ -34,11 +34,11 @@ import ( ...@@ -34,11 +34,11 @@ import (
"time" "time"
api_v1 "k8s.io/api/core/v1" api_v1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" net_v1 "k8s.io/api/networking/v1"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
core_v1_listers "k8s.io/client-go/listers/core/v1" core_v1_listers "k8s.io/client-go/listers/core/v1"
ext_listers "k8s.io/client-go/listers/extensions/v1beta1" net_v1_listers "k8s.io/client-go/listers/networking/v1"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
"k8s.io/client-go/util/workqueue" "k8s.io/client-go/util/workqueue"
...@@ -68,7 +68,7 @@ type NamespaceWorker struct { ...@@ -68,7 +68,7 @@ type NamespaceWorker struct {
hController *haproxy.Controller hController *haproxy.Controller
queue workqueue.RateLimitingInterface queue workqueue.RateLimitingInterface
listers *Listers listers *Listers
ing ext_listers.IngressNamespaceLister ing net_v1_listers.IngressNamespaceLister
svc core_v1_listers.ServiceNamespaceLister svc core_v1_listers.ServiceNamespaceLister
endp core_v1_listers.EndpointsNamespaceLister endp core_v1_listers.EndpointsNamespaceLister
tsecr core_v1_listers.SecretNamespaceLister tsecr core_v1_listers.SecretNamespaceLister
...@@ -97,8 +97,8 @@ func (worker *NamespaceWorker) event(obj interface{}, evtType, reason, ...@@ -97,8 +97,8 @@ func (worker *NamespaceWorker) event(obj interface{}, evtType, reason,
} }
kind := "Unknown" kind := "Unknown"
switch eventObj.(type) { switch eventObj.(type) {
case *extensions.Ingress: case *net_v1.Ingress:
ing, _ := eventObj.(*extensions.Ingress) ing, _ := eventObj.(*net_v1.Ingress)
worker.recorder.Eventf(ing, evtType, reason, msgFmt, args...) worker.recorder.Eventf(ing, evtType, reason, msgFmt, args...)
kind = "Ingress" kind = "Ingress"
case *api_v1.Service: case *api_v1.Service:
...@@ -171,7 +171,7 @@ func (worker *NamespaceWorker) dispatch(obj interface{}) update.Status { ...@@ -171,7 +171,7 @@ func (worker *NamespaceWorker) dispatch(obj interface{}) update.Status {
switch syncObj.Type { switch syncObj.Type {
case Add: case Add:
switch syncObj.Obj.(type) { switch syncObj.Obj.(type) {
case *extensions.Ingress: case *net_v1.Ingress:
return worker.addIng(key) return worker.addIng(key)
case *api_v1.Service: case *api_v1.Service:
return worker.addSvc(key) return worker.addSvc(key)
...@@ -191,7 +191,7 @@ func (worker *NamespaceWorker) dispatch(obj interface{}) update.Status { ...@@ -191,7 +191,7 @@ func (worker *NamespaceWorker) dispatch(obj interface{}) update.Status {
} }
case Update: case Update:
switch syncObj.Obj.(type) { switch syncObj.Obj.(type) {
case *extensions.Ingress: case *net_v1.Ingress:
return worker.updateIng(key) return worker.updateIng(key)
case *api_v1.Service: case *api_v1.Service:
return worker.updateSvc(key) return worker.updateSvc(key)
...@@ -218,7 +218,7 @@ func (worker *NamespaceWorker) dispatch(obj interface{}) update.Status { ...@@ -218,7 +218,7 @@ func (worker *NamespaceWorker) dispatch(obj interface{}) update.Status {
deletedObj = deleted.Obj deletedObj = deleted.Obj
} }
switch deletedObj.(type) { switch deletedObj.(type) {
case *extensions.Ingress: case *net_v1.Ingress:
return worker.deleteIng(deletedObj) return worker.deleteIng(deletedObj)
case *api_v1.Service: case *api_v1.Service:
return worker.deleteSvc(deletedObj) return worker.deleteSvc(deletedObj)
......
apiVersion: extensions/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: other-ingress name: other-ingress
...@@ -12,10 +12,16 @@ spec: ...@@ -12,10 +12,16 @@ spec:
http: http:
paths: paths:
- path: /this - path: /this
pathType: ImplementationSpecific
backend: backend:
serviceName: this-svc service:
servicePort: 80 name: this-svc
port:
number: 80
- path: /that - path: /that
pathType: ImplementationSpecific
backend: backend:
serviceName: that-svc service:
servicePort: 80 name: that-svc
port:
number: 80
...@@ -40,7 +40,7 @@ rules: ...@@ -40,7 +40,7 @@ rules:
- create - create
- patch - patch
- apiGroups: - apiGroups:
- extensions - networking.k8s.io
resources: resources:
- ingresses - ingresses
verbs: verbs:
...@@ -48,7 +48,7 @@ rules: ...@@ -48,7 +48,7 @@ rules:
- watch - watch
- get - get
- apiGroups: - apiGroups:
- "extensions" - networking.k8s.io
resources: resources:
- ingresses/status - ingresses/status
verbs: verbs:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment