8

我正在使用 nginx-ingress 在 kubernetes 中设置我的第一个入口。我像这样设置ingress-nginx负载均衡器服务:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "ingress-nginx",
    "namespace": "...",
    "labels": {
      "k8s-addon": "ingress-nginx.addons.k8s.io"
    },
    "annotations": {     
      "service.beta.kubernetes.io/aws-load-balancer-backend-protocol": "tcp",
      "service.beta.kubernetes.io/aws-load-balancer-proxy-protocol": "*",
      "service.beta.kubernetes.io/aws-load-balancer-ssl-cert": "arn....",
      "service.beta.kubernetes.io/aws-load-balancer-ssl-ports": "443"
    }
  },
  "spec": {
    "ports": [
      {
        "name": "http",
        "protocol": "TCP",
        "port": 80,
        "targetPort": "http",
        "nodePort": 30591
      },
      {
        "name": "https",
        "protocol": "TCP",
        "port": 443,
        "targetPort": "http",
        "nodePort": 32564
      }
    ],
    "selector": {
      "app": "ingress-nginx"
    },
    "clusterIP": "...",
    "type": "LoadBalancer",
    "sessionAffinity": "None",
    "externalTrafficPolicy": "Cluster"
  },
  "status": {
    "loadBalancer": {
      "ingress": [
        {
          "hostname": "blablala.elb.amazonaws.com"
        }
      ]
    }
  }
}

请注意https端口如何使其targetPort属性指向端口 80 (http),以便在负载均衡器处终止 ssl。

我的入口看起来像这样:

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: something
  namespace: ...
  annotations:
    ingress.kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  rules:
    - host: www.exapmle.com
      http:
        paths:
         - path: /
           backend:
            serviceName: some-service
            servicePort: 2100

现在,当我导航到 url 时,我得到一个Too many redirects error. 让我感到困惑的是,当我添加以下标题“X-Forwarded-Proto:https”时,我得到了预期的响应(curl https://www.example.com -v -H "X-Forwarded-Proto: https")。

有什么想法可以解决这个问题吗?

PS这很好用ingress.kubernetes.io/force-ssl-redirect: "false",似乎没有任何无关的重定向。

4

4 回答 4

11

这是annotationSSL 重定向结合代理协议和终止 ELB 上的 SSL 连接的一个已知问题。

关于它的问题已在GitHub上发布,这是该线程的修复

  1. 您应该为 Nginx-Ingress 创建自定义 ConfigMap,而不是使用force-ssl-redirect如下注释:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      labels:
        app: ingress-nginx
      name: nginx-ingress-configuration
      namespace: <ingress-namespace>
    data:
      ssl-redirect: "false"
      hsts: "true"
      server-tokens: "false"
      http-snippet: |
        server {
          listen 8080 proxy_protocol;
          server_tokens off;
          return 301 https://$host$request_uri;
        }
    

    该配置将创建一个额外的侦听器,并通过简单的重定向到 https。

  2. 然后,将该 ConfigMap 应用到您的入口控制器,将NodePort8080 添加到其容器定义和服务中。
  3. 现在,您可以将 ELB 的 80 端口指向 Service 的 8080 端口。

有了那个额外的监听器,它就可以工作了。

于 2018-04-16T12:32:40.840 回答
3

我必须添加这些注释以使其在不更改入口控制器的情况下工作:

    annotations:
      kubernetes.io/ingress.class: nginx-ingress-internal # <- AWS NLB
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/configuration-snippet: |
        if ($http_x_forwarded_proto = 'http') {
          return 301 https://$host$request_uri;
        }
于 2020-12-10T20:38:06.243 回答
2

另一种适用于我的环境的方法(k8s v1.16.15,rancher/nginx-ingress-controller:nginx-0.32.0-rancher1):

apiVersion: v1
data:
  compute-full-forwarded-for: "true"
  use-forwarded-headers: "true"
kind: ConfigMap
metadata:
  labels:
    app: ingress-nginx
  name: nginx-configuration
  namespace: ingress-nginx

这与应用程序入口的 force-ssl-redirect 一起工作。入口控制器似乎没有使用开箱即用的 ELB 中的 X-Forwarded-Proto 标头。

于 2020-10-06T11:20:04.673 回答
1

Too many redirects error.

在使用ingress-nginx作为一些 k8s 服务前面的入口控制器时。

其中一项服务(在我的例子中为 ArgoCD)自行处理 TLS 终止,并始终将 HTTP 请求重定向到 HTTPS

问题是 nginx 入口控制器还处理了 TLS 终止并使用 HTTP 与后端服务通信,结果是 ArgoCD 的服务器总是响应重定向到 HTTPS,这是多次重定向的原因。

任何将相关值传递给下面的入口注释的尝试都无济于事

annotations:
  nginx.ingress.kubernetes.io/ssl-redirect: false/true
  nginx.ingress.kubernetes.io/backend-protocol: "HTTP"/"HTTPS"

--insecure解决方案是通过将标志传递给 argocd-server 部署来确保服务不处理 TLS

规格:

  template:
    spec:
      containers:
      - name: argocd-server
        command:
        - argocd-server
        - --repo-server
        - argocd-repo-server:8081
        - --insecure # <-- Here
于 2021-11-01T08:55:38.843 回答