如何配置入口以使用https

时间:2019-01-31 10:56:33

标签: kubernetes kubernetes-ingress nginx-ingress

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

我决定使用入口做这个URL /路径,以便移动业务到不同后端基于逻辑(相同后端,只是复制到不同NodePorts)

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

谢谢

编辑: 我添加了yaml文件:

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

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

2 个答案:

答案 0 :(得分:1)

如果要在k8s中使用负载平衡机制,则应改用services,并在该服务后面启动多个实例,这样k8s将执行负载平衡。如果您想使用不同版本的后端(例如prod和test),则可以使用分离它们的方式

如果您的服务只能通过https访问,则需要在入口Yaml中添加以下注释:(documentation

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

要确保自身的安全,请看以下内容:https://kubernetes.io/docs/concepts/services-networking/ingress/#tls

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

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

编辑:

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

apiVersion: extensions/v1beta1
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通过TLS到达后端,则Ingress YAML应该如下所示:

apiVersion: extensions/v1beta1
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解密的TLS到达后端,则Ingress YAML应该如下所示:

apiVersion: extensions/v1beta1
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该版本的文章。

答案 1 :(得分:0)

如果您使用的是 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