如何配置入口以使用 https 将流量定向到 https 后端

问题描述 投票:0回答:3

我有一个使用 https 的后端。 我想根据 URL/路径分离后端的负载。

我决定使用 ingress 来执行此基于 url/路径的逻辑,以便将流量移动到不同的后端(相同的后端,只是复制到不同的 NodePort)

我的问题是如何配置入口以接收 https 请求并将这些 https 请求转发到 https 后端?

谢谢

编辑: 我添加了 yaml 文件:

spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

出于某种原因,我无法将规则形式 http 更改为 https

kubernetes kubernetes-ingress nginx-ingress
3个回答
69
投票

注意:本答案适用于github上kubernetes组织提供的ingress-nginx解决方案(https://github.com/kubernetes/ingress-nginx


如果你想在 k8s 中使用负载均衡机制,你应该使用 services 并在该服务后面启动多个实例,这样 k8s 就会进行负载均衡。如果您想使用不同版本的后端(例如生产和测试),那么分离它们的方法就很好

如果您的服务只能通过 https 访问,您需要将以下注释添加到您的入口 yaml 中:(文档

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

为了确保入口本身的安全,请看一下:https://kubernetes.io/docs/concepts/services-networking/ingress/#tls

但是如果您希望后端服务解密 TLS 通信,请改用以下注释:(文档

nginx.ingress.kubernetes.io/ssl-passthrough: "true"

编辑:

如果您想通过 TLS 到达后端,Ingress YAML 应该如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

如果您想通过 TLS 到达后端并在入口控制器中进行 TLS 解密,则 Ingress YAML 应该如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - app.myorg.com
    secretName: tls-secret 
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

需要注意的是,tls-secret 是 SecretConfig 的名称,具有为主机 (app.myorg.com) 颁发的有效证书


如果您想通过 TLS 到达后端并在后端进行 TLS 解密,则 Ingress YAML 应该如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

我自己从未测试过最后一个版本,所以我不知道这是否真的有效,但我强烈建议阅读该变体的this段落。


3
投票

如果您使用 NGINX Ingress 控制器 (https://docs.nginx.com/nginx-ingress-controller/),

the nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
不起作用。但是,
nginx.org/ssl-services
可以让您选择在后端需要 TLS 的服务。这个名字很混乱,所以我花了一段时间才意识到它的真正目的。

不适用于在底层使用 NGINX 的标准 Kubernetes Ingress 控制器;它仅适用于 NGINX 来源的控制器。

高级注释文档:

https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/

在此示例中,NGINX 将使用 TLS 连接到

ssl-svc

;它忽略任何自签名证书。示例(
https://github.com/nginxinc/kubernetes-ingress/tree/v1.12.0/examples/ssl-services):

apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: cafe-ingress annotations: nginx.org/ssl-services: "ssl-svc" spec: rules: - host: cafe.example.com http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80 - path: /coffee backend: serviceName: coffee-svc servicePort: 80 - path: /ssl backend: serviceName: ssl-svc servicePort: 443
    

0
投票
使用 Ingress-nginx 即使使用

nginx.ingress.kubernetes.io/upstream-vhost: example.com

,我也会遇到证书错误;由于某种原因,它没有发送 
Host
 标头。为了让它工作,我必须使用:

nginx.ingress.kubernetes.io/server-snippet: | proxy_ssl_name example.com; //your upstream hostname here proxy_ssl_server_name on; nginx.ingress.kubernetes.io/ssl-passthrough: "true" nginx.ingress.kubernetes.io/backend-protocol: “HTTPS"
    
© www.soinside.com 2019 - 2024. All rights reserved.