Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes Nginx入口部分ssl终止_Nginx_Kubernetes_Kubernetes Ingress - Fatal编程技术网

Kubernetes Nginx入口部分ssl终止

Kubernetes Nginx入口部分ssl终止,nginx,kubernetes,kubernetes-ingress,Nginx,Kubernetes,Kubernetes Ingress,我想通过以下方式分割Kubernetes Nginx中的传入流量: Client --> Nginx --> {Service A, Service B} 我面临的问题是服务A是一个内部服务,不支持HTTPS,因此应该终止服务A的SSL。另一方面,服务B是一个外部服务(托管在example.com上),并且只在HTTPS上工作 我无法通过Kubernetes Nginx轻松完成这项工作。以下是我带来的: apiVersion: extensions/v1beta1 kind: In

我想通过以下方式分割Kubernetes Nginx中的传入流量:

Client --> Nginx --> {Service A, Service B}
我面临的问题是服务A是一个内部服务,不支持HTTPS,因此应该终止服务A的SSL。另一方面,服务B是一个外部服务(托管在example.com上),并且只在HTTPS上工作

我无法通过Kubernetes Nginx轻松完成这项工作。以下是我带来的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-proxy
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/upstream-vhost: example.com
spec:
  tls:
  - hosts:
    - proxy.com
    secretName: secret
  rules:
    - host: proxy.com
      http:
        paths:
          - path: /api/v1/endpoint
            backend:
              serviceName: service-a
              servicePort: 8080
          - path: /
            backend:
              serviceName: service-b
              servicePort: 443
种类:服务 版本:v1 元数据: 姓名:服务-b 名称空间:默认值 规格: 类型:ExternalName 外部名称:服务-b 端口: -港口:443

我已经找到了一条指向example.com的
service-b.external:443的路线

此解决方案仅在service-b通过HTTPS时有效,但在我的情况下,由于其他一些内部依赖关系,我无法更改此服务的HTTPS

我的问题是
后端协议
注释适用于所有类型,并且我无法为每个路径定义它


附言:我正在使用AWS提供商

遵循建议的解决方案和评论中的问题

是的,如下文所述,可能有两个入口项目。就你而言 只有一个应该有后端协议

根据nginx入口文件:

基本用途-基于主机的路由 ingress nginx可用于各种云提供商内部的许多用例,并支持许多配置。在本节中,您可以找到一个常见的使用场景,其中由ingress nginx提供动力的单个负载平衡器将根据主机名将流量路由到2个不同的HTTP后端服务

首先,按照说明安装ingress nginx。然后假设您需要公开已经安装的两个HTTP服务:
myserviceca
myserviceceb
。假设您想在
myservicecea.foo.org
公开第一个,在
myserviceceb.foo.org
公开第二个。一种可能的解决方案是创建两个入口资源:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-myservicea
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myservicea.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservicea
          servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-myserviceb
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myserviceb.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myserviceb
          servicePort: 80
应用此yaml时,将创建2个入口资源,由入口nginx实例管理。Nginx配置为使用
kubernetes.io/ingres.class:“Nginx”
注释自动发现所有入口。请注意,入口资源应放置在后端资源的同一命名空间中

在许多云提供商上,ingress nginx还将创建相应的负载平衡器资源。您所要做的就是获取外部IP,并在DNS提供商内部添加一条DNS
记录,将myservicecea.foo.org和myserviceceb.foo.org指向nginx外部IP。通过运行以下命令获取外部IP:

kubectl获取服务-n入口nginx


也可以像前面提到的那样拥有单独的nginx类。

我非常确定,拥有两个
入口
资源是完全可能的,也是合理的,一个是用
后端协议注释的:
,另一个不是;入口控制器合并整个集群中的所有入口资源和大多数特定的wins(因此
/api/v1/endpoint
将路由到service-a,如果其入口资源未注释,则默认情况下将使用HTTP)@mdaniel它如何与单个主机一起工作:proxy.com?两者都将指向同一地址。ingress是否支持同一主机上的两个项目?谢谢您的回答,但我认为您误解了我的问题。事实上,在我的示例中,我需要service-a和service-b与proxy.com拥有相同的主机。问题是,只要我使用同一台主机,它就无法按预期工作。