【问题标题】:Kubernetes, Ingress Nginx and too many redirectsKubernetes、Ingress Nginx 和太多的重定向
【发布时间】:2021-11-28 12:51:01
【问题描述】:

我正在使用堆栈 Nginx + Kubernetes 和 Ingress Nginx 来安装 Ghost 博客。我的 K8s 部署和 Nginx 配置如下。

问题是在访问已部署的博客时,我从浏览器收到了太多重定向错误。我猜根本原因是在 Nginx 入口中没有正确配置 HTTPS URL,但我没有正确的方法来解决它。有人可以指出我这里出了什么问题?

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-blog
spec:
  rules:
  - host: my-blog.com
    http:
      paths:
      - backend:
          service:
            name: my-blog
            port:
              number: 2368
        path: /
        pathType: Prefix
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-blog
  name: my-blog
spec:
  ports:
  - port: 2368
    protocol: TCP
  selector:
    app: my-blog
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-blog
  name: my-blog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-blog
  template:
    metadata:
      labels:
        app: my-blog
    spec:
      containers:
      - env:
        - name: url
          value: https://my-blog.com
        image: ghost:latest
        name: my-blog
        ports:
        - containerPort: 2368
      terminationGracePeriodSeconds: 30
server {
    server_name my-blog.com;

    location / {
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto https;
        proxy_set_header        Host $http_host;
        proxy_intercept_errors  on;
        proxy_pass http://k8s_cluster;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/my-blog.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my-blog.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

}
server {
    if ($host = my-blog.com) {
        return 301 https://$host$request_uri;
    }

    server_name my-blog.com;

    listen 80;
    return 404;
}

【问题讨论】:

  • 你在哪里设置了你的 nginx 文件?您的流量如何移动? ngin pod 的入口或有多少个 pod 正在运行?
  • @HarshManvar Nginx 配置文件是为负载均衡器设置的,在该负载均衡器中获取来自用户的所有流量,然后再将它们转发到 K8S 的内部节点。流程是 users -> Internet -> Load Balancer (Nginx) -> Ingress Nginx -> Service 现在只运行一个 pod 进行测试
  • 理想情况下,您不应该使用它,只需创建 Nginx 的负载均衡器类型服务并将该 IP 用于 DN 即可。你必须安装 Nginx 控制器,它不需要文件配置

标签: nginx kubernetes nginx-ingress ghost-blog


【解决方案1】:

如果您使用的是 Nginx 入口,不确定为什么要使用 Nginx 配置。

这是由于 Nginx 入口端的 HTTPS 重定向造成的问题

您应该必须在 Nginx 入口级别实现 SSL 终止

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: blog
  labels:
    app: blog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: blog
  template:
    metadata:
      labels:
        app: blog
    spec:
      containers:
      - name: blog
        image: ghost:2.6-alpine
        imagePullPolicy: Always
        ports:
        - containerPort: 2368
        env:
        - name: url
          value: http://my-blog.com 

使用纯 HTTP 运行您的站点并在入口 nginx 处终止 SSL,以便您的站点将在 HTTP 上运行,并且从入口到集群内部的流量将在 HTTP 上运行。您的流程将类似于

Internet HTTPs > ingress HTTP > kubernets svc HTTP > deployment > pods > container 

您必须将您的证书设置为入口级别,以便您可以将证书存储在 Kubernetes 机密中并将该机密附加到入口,以便您的网站将在 HTTPS 上运行

入口示例

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: service-ingress
  annotations:  
    kubernetes.io/ingress.class: nginx
    #certmanager.k8s.io/cluster-issuer: letsencrypt-staging
spec:
  tls:
  - hosts:
    - service1.example.com
    secretName: letsencrypt-staging
  rules:
  - host: service1.example.com
    http:
      paths:
      - backend:
          serviceName: service1
          servicePort: 80

这样您的网站将在 HTTPS 上运行,但 SSL 在 Nginx 级别终止。

您的 SSL 证书将存储在上述示例中的 K8s 密码中,您可以看到密码名称 letsencrypt-staging

参考:https://medium.com/@harsh.manvar111/kubernetes-nginx-ingress-and-cert-manager-ssl-setup-c82313703d0d

【讨论】:

  • 第一个 Nginx 被用作整个系统的负载均衡器,这就是我保留它和 Nginx Ingress 的原因。将 URL 变量从 HTTPS 更改为非 HTTPS 将使部署工作,但这不是我正在寻找的,因为如果在用户通过浏览器访问时,将 URL 定义为非 HTTPS,Ghost 的某些功能将无法正常运行HTTPS 网址
  • 检查 Nginx 入口控制器和入口,您可以创建 LB 并将该 IP 用作 dns
猜你喜欢
  • 2022-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多