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
我有 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