公开 DaemonSet 服务以供同一节点上的 pod 使用

Tom*_*han 5 kubernetes

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

  • 服务网格 Pod 作为 Daemon Set 运行,每个节点上有一个副本。
  • 服务网格不能从集群外部直接访问。
  • 应用程序 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
Run Code Online (Sandbox Code Playgroud)

但是,我未能正确公开服务网格;我试着用这两种服务type: ClusterIPtype: LoadBalancer,但与前我无法连接,并与后者我公开服务网公开,这是我不想做的事。我也尝试过使用NodePort,但我什至无法在那里找出有效的配置(并且似乎有些人认为应该尽可能避免使用 NodePort ......)。

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

whi*_*s11 6

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

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

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

hostNetwork: true
Run Code Online (Sandbox Code Playgroud)

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

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

dnsPolicy: ClusterFirstWithHostNet
Run Code Online (Sandbox Code Playgroud)

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