Kubernetes nginx ingress: как перенаправить foo.example.org на example.org?

Мой вход сейчас выглядит так:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - example.org
        - app.example.org
      secretName: prod-tls
  rules:
    - host: example.org
      http:
        paths:
          - path: /
            backend:
              serviceName: app-service
              servicePort: 80
    - host: app.example.org
        http:
          paths:
              - path: /
                backend:
                  serviceName: app-service
                  servicePort: 80

Но теперь я хочу перенаправить app.example.org к example.orgвместо. Как я могу это сделать?

Я нашел этот пример, используя ingress.kubernetes.io/configuration-snippet но я не знаю, к каким доменам это относится?

Я использую Helm nginx-ingress-1.37.0; версия приложения 0.32.0.

3 ответа

Для Kubernetes 1.19 и более поздних версий этот вход перенаправит весь трафик с app.example.org на example.org:

      apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      return 301 $scheme://example.org$request_uri;
  name: ingress-redirect
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app.example.org
    secretName: prod-tls
  rules:
  - host: app.example.org

Входящий контроллер версии 0.22.0 или выше используетnginx.ingress.kubernetes.io/rewrite-targetвместоingress.kubernetes.io/configuration-snippet. Итак, это будет новый ответ @mdaniel:


      apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - example.org
      secretName: prod-tls
  rules:
    - host: example.org
      http:
        paths:
          - path: /
            backend:
              serviceName: app-service
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-redirect
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: "https://example.org/$1"
spec:
  tls:
    - hosts:
        - app.example.org
      secretName: prod-tls
  rules:
    - host: app.example.org
      http:
          paths:
              - path: /
                backend:
                  serviceName: app-service
                  servicePort: 80

Я нашел этот пример, используя ingress.kubernetes.io/configuration-snippet: но я не знаю, к каким доменам это относится?

Об этой конфигурации легче рассуждать, когда у вас есть два Ingress, один только для "размещения" configuration-snippet: а другой для выполнения настоящей работы:

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - example.org
      secretName: prod-tls
  rules:
    - host: example.org
      http:
        paths:
          - path: /
            backend:
              serviceName: app-service
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-redirect
  annotations:
    kubernetes.io/ingress.class: nginx
    # this should be covered by the annotation on the other ingress
    # since it will renew the same certificate
    # cert-manager.io/cluster-issuer: letsencrypt-prod
    ingress.kubernetes.io/configuration-snippet: |
        rewrite ^/(.*)$ https://example.org/$1 permanent;
spec:
  tls:
    - hosts:
        - app.example.org
      secretName: prod-tls
  rules:
    - host: app.example.org
      http:
          paths:
              - path: /
                backend:
                  serviceName: app-service
                  servicePort: 80
Другие вопросы по тегам