nginx 入口 : Too many redirects when force-ssl is enabled

标签 nginx kubernetes kops kubernetes-ingress

我正在使用 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

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

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

附言这适用于 ingress.kubernetes.io/force-ssl-redirect: "false"而且似乎没有任何无关的重定向。

最佳答案

Too many redirects error 添加另一个原因.
在使用 ingress-nginx 作为一些 k8s 服务前面的入口 Controller 时。
其中一项服务 (在我的情况下为 ArgoCD)自行处理 TLS 终止并始终将 HTTP 请求重定向到 HTTPS .
问题是 nginx 入口 Controller 还处理了 TLS 终止 并使用 HTTP 与后端服务通信,结果是 ArgoCD 的服务器总是响应重定向到 HTTPS,这是多次重定向的原因。
任何将相关值传递给入口的尝试以下注释无济于事 :

annotations:
  nginx.ingress.kubernetes.io/ssl-redirect: false/true
  nginx.ingress.kubernetes.io/backend-protocol: "HTTP"/"HTTPS"
解决方案是通过传递 --insecure 来确保服务不处理 TLS。标记到 argocd 服务器部署 :
规范:
  template:
    spec:
      containers:
      - name: argocd-server
        command:
        - argocd-server
        - --repo-server
        - argocd-repo-server:8081
        - --insecure # <-- Here

关于nginx 入口 : Too many redirects when force-ssl is enabled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49856754/

相关文章:

ssl - 路径在 Kubernetes NGINX 入口 Controller 中不起作用

ruby-on-rails - 无法访问 Assets - dockerized Rails 应用程序,nginx 作为反向代理

amazon-web-services - 如何在 AWS 上使用自动缩放器扩展 GPU 节点

amazon-web-services - AWS上的Disaster Recovery Kops Kubernetes主节点

linux - 防止直接访问 PDF 文件 - Nginx

node.js - Nginx HTTPS 失败,但 node.js https 有效

docker - 是否有 `docker run --net=container:thingie --pid=container:thingie -it --rm busybox sh`的kubectl版本

jenkins - 将环境变量设置为 Jenkins pipeline 以部署 kubernetes pod

kubernetes - 如何更改系统命名空间?

amazon-web-services - 有没有办法在 aws 上的 kubernetes 集群中使用 NAT 实例而不是 NAT 网关作为私有(private)子网的导出?