CHI-HONG CHEN
CHI-HONG CHEN

Reputation: 1

How to override Service and Ingress rule in Quarkus kubernetes extension

I was set kubernetes resource in application.properties

# Ingress
quarkus.kubernetes.expose=true
# service will be exposed
quarkus.kubernetes.ingress.expose=true
quarkus.kubernetes.ingress.host=k8s.cch.dev
quarkus.kubernetes.ingress.annotations."nginx.ingress.kubernetes.io/rewrite-target"=/$2
# quarkus.kubernetes.ingress.tls.${SECRET_NAME}.enabled=true
# quarkus.kubernetes.ingress.tls.${SECRET_NAME}.hosts=k8s.cch.dev
quarkus.kubernetes.ingress.rules.0.host=k8s.cch.dev
quarkus.kubernetes.ingress.rules.0.path=/api/v1(/|$)(.*)
quarkus.kubernetes.ingress.rules.0.path-type=Prefix
quarkus.kubernetes.ingress.rules.0.service-name=${quarkus.container-image.name}
quarkus.kubernetes.ingress.rules.0.service-port-name=http
quarkus.kubernetes.ingress.rules.0.service-port-number=${quarkus.kubernetes.ports.http.container-port:quarkus.http.port}

quarkus.kubernetes.ports.http.container-port=8080
quarkus.kubernetes.ports.http.path=/
quarkus.kubernetes.ports.http.protocol=tcp

But ingress can't override default path: /.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    app.quarkus.io/commit-id: dbe06014c4986c544ed25fba97f96ac2cecc4091
    app.quarkus.io/build-timestamp: 2022-12-12 - 02:20:45 +0000
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  labels:
    app.kubernetes.io/name: kubernetes-with-quarkus
    app.kubernetes.io/part-of: kubernetes-with-quarkus
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
  name: kubernetes-with-quarkus
  namespace: prod
spec:
  rules:
    - host: k8s.cch.dev
      http:
        paths:
          - backend:
              service:
                name: kubernetes-with-quarkus
                port:
                  name: http
            path: /
            pathType: Prefix
          - backend:
              service:
                name: kubernetes-with-quarkus
                port:
                  name: http
            path: /api/v1(/|$)(.*)
            pathType: Prefix

How to change spec.ports.port to 8080 ? I could't find the configuration on kubernetes extension.

apiVersion: v1
kind: Service
metadata:
  annotations:
    app.quarkus.io/commit-id: dbe06014c4986c544ed25fba97f96ac2cecc4091
    app.quarkus.io/build-timestamp: 2022-12-12 - 02:20:45 +0000
    prometheus.io/scrape: "true"
    prometheus.io/path: /q/metrics
    prometheus.io/port: "8080"
    prometheus.io/scheme: http
  labels:
    app.kubernetes.io/name: kubernetes-with-quarkus
    app.kubernetes.io/part-of: kubernetes-with-quarkus
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
  name: kubernetes-with-quarkus
  namespace: prod
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app.kubernetes.io/name: kubernetes-with-quarkus
    app.kubernetes.io/part-of: kubernetes-with-quarkus
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
  type: ClusterIP

Upvotes: 0

Views: 414

Answers (1)

Jose Carvajal
Jose Carvajal

Reputation: 151

Your configuration is adding to Ingress rules, because you're specifying two paths:

# ...
quarkus.kubernetes.ingress.rules.0.path=/api/v1(/|$)(.*)
# ...
quarkus.kubernetes.ports.http.path=/

Quarkus will try to find a matching ingress rule with path "/api/v1(/|$)(.*)" and if it can't find any, it will add a new one.

Instead, if what you want is to override the default path and service port, you simply need to add these two properties:

quarkus.kubernetes.ports.http.host-port=<any other port>
quarkus.kubernetes.ports.http.path=/api/v1(/|$)(.*)

Then, if you want to change the generated ingress rule, use:

quarkus.kubernetes.ingress.rules.0.path=/api/v1(/|$)(.*)
quarkus.kubernetes.ingress.rules.0.host or path-type or other ingress rule configuration

Because the properties quarkus.kubernetes.ports... are not very intuitive in regards to how are related to the generated Ingress resource, there are already plans to improve it: https://github.com/quarkusio/quarkus/issues/29279

Upvotes: 1

Related Questions