【问题标题】:Kubernetes - Using services in nodesKubernetes - 在节点中使用服务
【发布时间】:2018-12-17 17:39:35
【问题描述】:

我正在使用集群(带有 master,以及带有 pod 的节点),但是我如何也可以在节点中使用这些服务呢?将互联网暴露给节点环境(使用服务)而不是主环境。

我的场景(还在测试中)是:

  • 拥有一个主节点和另一个节点(两个环境)。我的 pod 正在我的节点环境中运行,您可以在下面看到(kubectl get pod -o wide):

我需要公开节点所在的服务,而不是主节点。因为,如果我暴露了master,master宕机了,所有的服务都会停止。

【问题讨论】:

  • 您的问题不清楚,能否详细说明?你想把你的节点暴露在外面吗?
  • 是的,就是这样。我需要暴露节点所在的环境,而不是主节点。因为,如果我暴露了master,master宕机了,所有的服务都停止了,对吧?我正在遵循在生产中使用它的更好方法。
  • 因此,您希望将 Pod 调度到除主节点 (stackoverflow.com/questions/41169562/…) 之外的节点上,并提供对在节点上运行的 Pod 的访问权限。大概这是您正在设置的本地集群?
  • 我更新了问题。不知道是不是很清楚。
  • 您可能会发现 weave.works/blog/…alesnosek.com/blog/2017/02/14/… 很有帮助

标签: kubernetes


【解决方案1】:

您似乎倾向于使用 NodePort 服务,所以我猜您没有使用云提供商(就像云提供商一样,您可以使用 LoadBalancer)。

由于您有多个节点,因此您需要选择将哪些节点公开以及如何公开。你可以输入an external Load Balancer in front of the cluster so that load is balanced between nodes。这不会是集群的一部分,因此必须单独配置才能知道要路由到哪些 IP/节点。

或者您可以考虑使用单个节点进行路由。该节点只会使用 kube-proxy 发送流量,而不会进入应用程序内容(L4 而不是 L7),因此它可以在不进行大量处理的情况下进行路由,这有助于降低它变得不可用的风险。但它仍然只是一个节点,并且根据其硬件,它可能会因其他原因而停机。因此,在决定哪种设置向外部公开最适合您的集群时,需要进行权衡 - 您需要选择是否要在集群之外维护负载均衡器,以及它是否比使用节点更可靠。

【讨论】:

    【解决方案2】:

    如果您希望从调度 pod 中删除 master,并且如果您使用的是 Kubernetes 1.7 或更高版本,则可以使用以下命令。

    kubectl taint node yourMasterNode node-role.kubernetes.io/master:NoSchedule-

    您不能公开节点,它是已经具有 IP 地址并已公开的 VM 或裸机。您要做的是使用服务将 pod 暴露给集群外部。您可以为此使用 Kubernetes Services。对于这个测试场景,您可以使用 NodePort 将您的 pod 暴露给外部。如果您使用 NodePort,那么您可以使用{your-any-node-ip}:{nodePort} 从集群外部访问它。如果你想从互联网访问它,你可能需要一个静态的公共 ip。

    但是,如果您担心 pod 的可用性,您可以使用多节点集群,然后使用 pod 的副本,以便可以在多个节点上调度它们。然后,只要其他节点中的 pod 可以继续服务,而新的 pod 被安排在其他地方。这就是在 Kubernetes 中实现 100% 可用性的方式。

    当你担心主人倒下的时候。如果主服务器关闭,应用程序将继续提供服务,并且节点将是临时节点而不是集群。除非节点重新启动或应用程序失败,否则它将正常运行。但是集群将无法响应节点故障、创建新资源、将 pod 移动到新节点等。直到 master 重新上线。因此,如果 master 失败的可能性很高,您可以简单地在集群中使用 multiple masters

    【讨论】:

    • 是的,就是这样!但是我怎样才能在节点中复制服务呢?我的问题是关于互联网如何访问节点所在的环境,而不是主节点所在的环境。抱歉解释不好。
    • 服务不像 pod,没有特定于节点的资源,它们不能被复制为 pod。因为服务只是 pod 的抽象,以及一些从外部访问 pod 的策略。 kube-proxy 负责为服务实现一种虚拟 IP 形式,因为 kube-proxy 是一个守护程序集,它运行在每个节点上。这样服务抽象在每个节点中都是可用的。所以除非节点发生故障,否则服务是可以访问的。
    • 我明白了。但是有什么更好的方法来做到这一点?因为如果我的应用程序需要对主服务进行 POST(仅在环境中运行)并且我的主服务出现故障,那么我的所有解决方案都无法使用,对吗?谢谢你的帮助。
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 2017-03-29
    • 2018-12-19
    • 2020-04-10
    • 2020-09-25
    • 2017-05-08
    • 2018-02-27
    • 2020-09-02
    相关资源
    最近更新 更多