Kubernetes - 如何向所有小兵发送请求?

Kubernetes - how to send request to all the minions?

我有 pod,它的目的是获取传入数据并将其写入主机卷。我是 运行 所有奴才中的这个 pod。

现在,当我为此 pods 设置 NodePort 服务时,流量将一次转到 1 个 pod。

但是我如何在不同的 minions 中向所有这些 pods 发送请求?我如何绕过这里的负载平衡?我希望该数据在所有 minions 主机卷中可用。

您需要定义一个 hostPort for the container 并通过主机 IP 分别寻址每个节点上的每个 pod。

请参阅最佳实践指南中的警告 Services section

一项服务使用选择器来识别要代理的 pods 列表(如果它们处于就绪状态)。您可以简单地使用 GET 请求请求相同的 pods 列表:

$ curl -G "$MASTER/api/v1/namespaces/$NAMESPACE/pods?labelSelector=$KEY=$VALUE"

然后手动将您的请求发送到每个 pod ip:port 端点。如果您需要能够从集群网络外部发送请求,您可以创建一个代理 pod(通过标准方式暴露给外部网络)。代理 pod 可以使用您的标签监视 pods(类似于上面),并将它收到的任何请求转发到就绪列表 pods.

使用 hostPort 并转发到节点也可以达到类似的效果,但不鼓励使用 hostPort(参见 best practices)。

这是一种方法,只要您可以从 k8s 网络内的容器发送请求(这可能不完全符合 OP 的要求,但我猜这可能适用于谷歌搜索的人)。

您必须以某种方式查找 pods。在这里,我在 staging 名称空间中找到所有 pods 标签 app=hot-app:

kubectl get pods -l app=hot-app -n staging -o json | jq -r '.items[].status.podIP'

此示例使用了不起的 jq 工具来解析生成的 json 并获取 pod ips,但您可以通过其他方式解析 json,包括使用 kubectl 本身。

这个 returns 像这样:

10.245.4.253
10.245.21.143

你可以这样找到内部端口(示例只有一个容器,所以一个唯一的端口):

kubectl get pods -l app=hot-app -n staging -o json | jq -r '.items[].spec.containers[].ports[].containerPort' | sort | uniq
8080

然后你使用 curl 进入你的 k8s 集群中的一个容器,结合前面命令的 ips 和端口,然后点击 pods 像这样:

curl 10.245.4.253:8080/hot-path
curl 10.245.21.143:8080/hot-path