【问题标题】:Trouble at configuring http(s) for an nginx-ingress为 nginx-ingress 配置 http(s) 时遇到问题
【发布时间】:2018-07-19 06:26:32
【问题描述】:

我目前正在尝试创建一个入口,遵循 ssl-termination 方法,它允许我通过 http 和 https 连接到服务。 我设法为http创建了一个工作入口,部分为https,但不是同时使用..

这是我的配置

入口控制器:部署和服务

apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: nginx-ingress-controller
spec: 
  replicas: 1
  revisionHistoryLimit: 3
  template: 
  metadata: 
    labels: 
      k8s-app: nginx-ingress-lb
  spec: 
    containers: 
      - args: 
          - /nginx-ingress-controller
          - "--default-backend-service=$(POD_NAMESPACE)/default-http-backend"
        env: 
           <!-- default-config ommitted -->
        image: "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0-beta.17"
        imagePullPolicy: Always
        livenessProbe: 
            <!-- omitted -->
        name: nginx-ingress-controller
        ports: 
          - containerPort: 80
            name: http
            protocol: TCP
          - containerPort: 443
            name: https
            protocol: TCP
        volumeMounts: 
          - mountPath: /etc/nginx-ssl/tls
            name: tls-vol
    terminationGracePeriodSeconds: 60
    volumes: 
      - name: tls-vol
        secret: 
          secretName: tls-test-project-secret
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress
spec:
type: NodePort
ports:
- name: http
  port: 80
  targetPort: http
  nodePort: 31115
- name: https
  port: 443
  targetPort: https
  nodePort: 31116
selector:
  k8s-app: nginx-ingress-lb

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/secure-backends: "false"

    # modified this to false for http & https-scenario
    ingress.kubernetes.io/ssl-redirect: "true"

    # modified this to false for http & https-scenario
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    ingress.kubernetes.io/add-base-url: "true"  
spec:
  tls:
   - hosts:
     - author.k8s-test
     secretName: tls-test-project-secret
  rules:
  - host: author.k8s-test
    http:  
      paths:
      - path: / 
        backend:
          serviceName: cms-author
          servicePort: 8080

后端 - 服务

apiVersion: v1
kind: Service
metadata:
  name: cms-author
spec:
  selector:
    run: cms-author
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080

后端部署:

 apiVersion: apps/v1
 kind: Deployment
 metadata:
    name: cms-author
 spec:
   selector:
     matchLabels:
       run: cms-author
   replicas: 1
   template:
     metadata:
       labels:
         run: cms-author
     spec:       
       containers:
       - name: cms-author
         image: <someDockerRegistryUrl>/magnolia:kube-dev
       imagePullPolicy: Always       
      ports:
       - containerPort: 8080      

我有几个问题,当遵循 https 唯一方案时,我可以通过入口 https nodePort 访问应用程序,但无法登录,因为后续请求通过 http 而不是 https .. 如果我在 url 之前手动放置 https在浏览器中,它再次工作,任何进一步的请求都通过 https。,但我不知道为什么:(

最后的设置(支持http和https)完全不行,好像我尝试通过Ingress的http-nodePort访问应用,总是重定向到ssl,但是在这种情况下,我配置为ssl-redirect到错误,但仍然无法正常工作。

  • 我在 github 上阅读了很多帖子,正在处理这个问题,但没有一个对我有用
  • 我已将 nginx 控制器映像从 gce_containers 更改为 quay.io,但也无法正常工作
  • 我尝试了一些旧版本,但也无法正常工作。

【问题讨论】:

    标签: ssl nginx https kubernetes


    【解决方案1】:

    通过设置 helm 参数 controller.service.targetPorts.httpscontroller.service.nodePorts.https,从官方 kubernetes 图表存储库 https://github.com/kubernetes/charts/tree/master/stable/nginx-ingress 部署 nginx 入口控制器。设置好后,helm 会配置相应的NodePort (443)。

    Helm 使用 https://github.com/kubernetes/charts/tree/master/stable/nginx-ingress/templates 中的 YAML 文件。

    除了 nginx 入口控制器,您还需要一个入口资源。示例请参考https://github.com/nginxinc/kubernetes-ingress/tree/master/examples/complete-example

    【讨论】:

    • 我不熟悉舵图,但我一定会尝试您的建议并回复。谢谢!
    • Helm 是 Kubernetes 的包管理器。我经常使用它。它类似于 Ubuntu 中的 apt-get、CentOS 中的 yum 和 Mac OS 中的 brewdocs.helm.sh 有更多关于 Helm 的信息。
    • @lunatikz 很高兴为您提供帮助,如果您认为我的回答有用,请点赞!
    • 我自己发现了错误,它与入口控制器本身无关。生成的 nginx.conf 已将 proxy_redirect 设置为关闭。我的应用程序不尊重 x-forwarded-dor 标头,因为它不知道最初使用的是 https。所以添加proxy_redirect http:// $https_scheme://; 解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2015-09-05
    • 2020-04-09
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多