【问题标题】:How to expose kubernetes service on prem using 443/80如何使用 443/80 在 prem 上公开 kubernetes 服务
【发布时间】:2019-09-18 07:47:27
【问题描述】:

是否可以在本地使用端口 443/80 公开 Kubernetes 服务?

我知道一些在 Kubernetes 中公开服务的方法:

1. NodePort - 默认端口范围是 30000 - 32767,所以我们无法使用 443/80 访问服务。由于端口冲突,更改端口范围是有风险的,所以这不是一个好主意。

2. 主机网络 - 强制 pod 使用主机的网络,而不是专用的网络命名空间。这不是一个好主意,因为我们丢失了 kube-dns 等。

3. Ingress - AFAIK 它使用 NodePort(所以我们再次面临第一个问题)或云提供商 LoadBalancer。由于我们在本地使用 Kubernetes,因此无法使用此选项。 MetalLB 允许您在不在云提供商上运行的集群中创建 LoadBalancer 类型的 Kubernetes 服务,但还不够稳定。

您知道在 Kubernetes 中使用本地端口 443/80 公开服务的任何其他方式吗? 我正在寻找“Kubernetes 解决方案”;未使用外部集群反向代理。

谢谢。

【问题讨论】:

    标签: kubernetes kubernetes-ingress


    【解决方案1】:

    hostNetwork 代理的想法其实还不错,例如 Openshift Router 就使用了这个。您定义两个或三个节点来运行代理并在它们前面使用 DNS 负载平衡。

    您仍然可以将 kube-dns 与 hostNetwork 一起使用,请参阅 https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy

    【讨论】:

      【解决方案2】:

      恕我直言,入口是在本地执行此操作的最佳方式。

      我们将 nginx-ingress-controller 作为守护程序集运行,每个控制器都绑定到主机网络上的端口 80 和 443。流向我们集群的几乎 100% 的流量来自 80 或 443,并通过入口规则路由到正确的服务。

      对于每个应用,您只需要一个将您的主机名映射到集群节点的 DNS 记录,以及对应的 ingress

      这是一个守护进程清单的示例:

      kind: DaemonSet
      apiVersion: apps/v1
      metadata:
        name: nginx-ingress-controller
      spec:
        selector:
          matchLabels:
            component: ingress-controller
        template:
          metadata:
            labels:
              component: ingress-controller
          spec:
            restartPolicy: Always
            hostNetwork: true
            containers:
              - name: nginx-ingress-lb
                image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0
                ports:
                  - name: http
                    hostPort: 80
                    containerPort: 80
                    protocol: TCP
                  - name: https
                    hostPort: 443
                    containerPort: 443
                    protocol: TCP
                env:
                  - name: POD_NAMESPACE
                    valueFrom:
                      fieldRef:
                        apiVersion: v1
                        fieldPath: metadata.namespace
                args:
                  - /nginx-ingress-controller
                  - '--default-backend-service=$(POD_NAMESPACE)/default-http-backend'
      

      【讨论】:

        【解决方案3】:

        使用入口控制器作为 Kubernetes 集群中服务的入口点。在端口 80 或 443 上运行入口控制器。 您需要为要从外部访问的每个后端服务定义入口规则。入口控制器应该能够允许客户端根据入口规则中定义的路径访问服务。

        如果您需要允许通过 https 进行访问,那么您需要获取 dns 证书,将它们加载到机密中并将它们绑定到入口规则中

        最受欢迎的一种是 nginx 入口控制器。 Traefik 和 ha 代理入口控制器也是其他替代解决方案

        【讨论】:

          【解决方案4】:

          您可能在 unix/linux 主机上使用 nginx 入口控制器运行 kubeadm 本地 Kubernetes 设置,并且无法安全地公开受限系统端口范围 (0-1023) 中的端口。

          您需要设置自己的专用负载平衡器对(例如,运行 HA-Proxy 的 Linux 机器),或者如果您有幸处于已经提供负载平衡的企业环境中(例如F5 磅)。

          然后,您将能够设置负载平衡器,将您的 443/80 请求转发到集群节点的 30443/30080 端口,这些端口由集群的入口控制器处理。

          【讨论】:

            猜你喜欢
            • 2018-09-11
            • 2018-09-17
            • 2018-07-29
            • 2018-08-19
            • 1970-01-01
            • 2020-03-19
            • 2019-05-08
            • 2020-04-07
            • 2020-09-30
            相关资源
            最近更新 更多