-
Notifications
You must be signed in to change notification settings - Fork 883
Open
Labels
Milestone
Description
Describe the bug
I have created an external service to route my traffic. However, when trying to applying the ingress-rule, Yarp throws an error
To Reproduce
- Create an external service and ingress rule for that service - By lack of documentation, I copied this from one of your test-assets. I had to add "ingressClassName: yarp", otherwise, Yarp would not even see changes in the ingress rules
apiVersion: v1
kind: Service
metadata:
name: external-service
namespace: default
spec:
type: ExternalName
externalName: external-service.example.com
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: external-ingress
namespace: default
annotations:
yarp.ingress.kubernetes.io/backend-protocol: https
spec:
ingressClassName: yarp
rules:
- http:
paths:
- pathType: Prefix
path: /cb
backend:
service:
name: external-service
port:
number: 443
- Apply it
kubectl apply -f .\ingress-external.yaml
- what the exception being thrown
[06:48:46 DBG] Informer V1Service received Modified notification for Service/external-service.default at resource version 191835
[06:48:46 WRN] Uncaught exception occured while reconciling ingress default/external-ingress
System.ArgumentNullException: Value cannot be null. (Parameter 'source')
at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Linq.Enumerable.TryGetSingle[TSource](IEnumerable`1 source, Func`2 predicate, Boolean& found)
at Yarp.Kubernetes.Controller.Converters.YarpParser.HandleIngressRule(YarpIngressContext ingressContext, List`1 endpoints, IList`1 defaultSubsets, V1IngressRule rule, YarpConfigContext configContext) in /src/src/Kubernetes.Controller/Converters/YarpParser.cs:line 42
at Yarp.Kubernetes.Controller.Converters.YarpParser.ConvertFromKubernetesIngress(YarpIngressContext ingressContext, YarpConfigContext configContext) in /src/src/Kubernetes.Controller/Converters/YarpParser.cs:line 31
at Yarp.Kubernetes.Controller.Services.Reconciler.ProcessAsync(CancellationToken cancellationToken) in /src/src/Kubernetes.Controller/Services/Reconciler.cs:line 56
[06:48:46 INF] [{"RouteId":"minimal-ingress.default:/foo","Match":{"Methods":null,"Hosts":[],"Path":"/foo/{**catch-all}","QueryParameters":null,"Headers":null},"Order":null,"ClusterId":"foo-service.default:8080","AuthorizationPolicy":null,"CorsPolicy":null,"MaxRequestBodySize":null,"Metadata":null,"Transforms":[{"PathPattern":"/{**catch-all}"}]},{"RouteId":"minimal-ingress.default:/bar","Match":{"Methods":null,"Hosts":[],"Path":"/bar/{**catch-all}","QueryParameters":null,"Headers":null},"Order":null,"ClusterId":"bar-service.default:8080","AuthorizationPolicy":null,"CorsPolicy":null,"MaxRequestBodySize":null,"Metadata":null,"Transforms":[{"PathPattern":"/{**catch-all}"}]}]
[06:48:46 INF] [{"ClusterId":"foo-service.default:8080","LoadBalancingPolicy":null,"SessionAffinity":null,"HealthCheck":null,"HttpClient":null,"HttpRequest":null,"Destinations":{"http://10.244.1.2:8080":{"Address":"http://10.244.1.2:8080","Health":null,"Metadata":null}},"Metadata":null},{"ClusterId":"bar-service.default:8080","LoadBalancingPolicy":null,"SessionAffinity":null,"HealthCheck":null,"HttpClient":null,"HttpRequest":null,"Destinations":{"http://10.244.1.3:8080":{"Address":"http://10.244.1.3:8080","Health":null,"Metadata":null}},"Metadata":null}]
Further technical details
- I was using the latest version in the main branch, as /release/latest didn't work with the kubernetes controller
- another ingress rule does exist. It doesn't matter if I include the external service with this definition
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
yarp.ingress.kubernetes.io/transforms: |
- PathPattern: "/{**catch-all}"
spec:
ingressClassName: yarp
rules:
- http:
paths:
- pathType: Prefix
path: /foo
backend:
service:
name: foo-service
port:
number: 8080
- pathType: Prefix
path: /bar
backend:
service:
name: bar-service
port:
number: 8080
- The platform (Linux/macOS/Windows): running Kubernetes in Docker on Windows 11. "Normal" services do work (find the blogpost here that I wrote)