【问题标题】:Exposing a DaemonSet service for consumption by pods on the same node公开 DaemonSet 服务以供同一节点上的 pod 使用
【发布时间】:2018-05-07 14:39:06
【问题描述】:

我正在尝试在我的 Kubernetes 集群中安装服务网格,为此我想完成以下任务:

  • 服务网格 pod 作为守护程序集运行,每个节点上都有一个副本。
  • 无法从集群外部直接访问服务网格。
  • 应用程序 pod 使用同一节点上的服务网格 pod 作为所有请求的 http 代理。

为此,我在应用部署的容器规范中添加了以下配置:

# deployment.spec.template.spec.containers[0]
  env:
  - name: NODE_NAME
    valueFrom:
      fieldRef:
        fieldPath: spec.nodeName
  - name: HTTP_PROXY
    value: http://$(NODE_NAME):4140

但是,我未能正确公开服务网格;我已经尝试过type: ClusterIPtype: LoadBalancer 这两种服务,但前者我无法连接,后者我公开暴露服务网格,我不想这样做。我也尝试过使用NodePort,但我什至还没有找到有效的配置(似乎有人认为NodePort should be avoided if possible...)。

我应该如何公开服务网格,最好是在端口 4140-4142 和 9990 上,以在特定节点(当前节点)上可从其他 pod 访问的方式?

【问题讨论】:

  • 你试过调试ClusterIP解决方案吗?
  • @MaciekSawicki:我无法弄清楚如何使用 ClusterIP 来处理特定节点的服务副本;连接问题只是节点上没有打开预期的端口。

标签: kubernetes


【解决方案1】:

您可以将您的 pod 放在主机网络空间中。这样您就不需要任何服务,并且您的 Pod 将可以通过您在每个节点上的 PodSpec 中声明的端口访问。

您可以通过将服务绑定到 127.0.0.1 而不是 0.0.0.0 来避免外部可达性

如果你想试一试,你可以在你的 DaemonSet 的 PodSpec 中添加以下内容,在主机网络空间运行一个端口:

hostNetwork: true

请注意,使用此解决方案,您需要使用主机的 IP 地址才能连接到您的 pod。

为了在您的 hostNetworked pod 中获得内部 DNS 名称解析,您还需要像这样设置 DNS 策略:

dnsPolicy: ClusterFirstWithHostNet

这将确保您的 pod 使用内部 DNS 服务器进行名称解析。

【讨论】:

  • 这需要我将 所有 pod 放在主机网络空间中,还是只放在 daemonset 中?这是针对服务网格的,所以我的想法是,我的应用程序 pod 将处理 同一节点上的 daemonset pod,而不是直接相互通信,daemonset pod 将找出流量的位置应该将其发送到 该节点上的 daemonset pod,然后该 pod 将转发到那里的应用程序 pod。换句话说,我需要应用程序和 daemonset pod 之间的双向连接,并且我需要 daemonset pod 可以被节点寻址。
  • hostNetwork 设置是在 daemonset 上完成的,因此它只对 daemonset 中的 Pod 有效。因此,只要您能够确定其他 pod 中当前节点的地址,这应该可以工作。
  • 啊,很好。我试过了,我能够正确连接到 daemonset pod,但它们无法引用集群内的服务。 daemonset pod 需要能够使用服务名称调用回集群。我猜这在主机网络中不起作用?
  • 嗯,我看不出它不应该工作的原因。您是否使用服务 DNS 名称来引用集群 pod?能稍微解决一下吗? Che if name 解析,例如
  • 名称无法解析;例如,我正在尝试访问命名空间test 中的服务namerdnetcat -zv namerd 4100netcat -zv namerd.test.svc.cluster.local 4100 在主机查找时均失败。
猜你喜欢
  • 2019-10-27
  • 1970-01-01
  • 2022-01-25
  • 2020-04-10
  • 1970-01-01
  • 2021-02-13
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多