Kubernetes nginx 入口:如何将 foo.example.org 重定向到 example.org?

mpe*_*pen 13 nginx kubernetes

我的入口目前看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

但现在我想重定向app.example.orgexample.org。我怎样才能做到这一点?

我发现这个示例使用ingress.kubernetes.io/configuration-snippet但我不知道它将适用于哪些域?

我正在使用头盔nginx-ingress-1.37.0;应用程序版本 0.32.0。

gsf*_*gsf 14

对于 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
Run Code Online (Sandbox Code Playgroud)


小智 6

Ingress 控制器版本 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
Run Code Online (Sandbox Code Playgroud)

  • 使用 `nginx.ingress.kubernetes.io/permanent-redirect: https://example.org` 保留 301 永久重定向 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations /#永久重定向 (3认同)

mda*_*iel 5

我发现这个示例使用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
Run Code Online (Sandbox Code Playgroud)