Kubernetes - 如何将请求发送给所有的爪牙?

问题描述:

我有一个pod,其目的是获取传入的数据并将其写入主机卷。我在所有的爪牙中运行这个吊舱。Kubernetes - 如何将请求发送给所有的爪牙?

现在,当我设置NodePort服务到这个豆荚时,流量将一次转到1个豆荚。

但是,我如何向所有这些豆荚在不同的爪牙中发送请求?如何绕过此处的负载平衡?我希望这些数据可以在所有的奴才主机中使用。

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

请参阅最佳实践指南Services section中的注意事项。

服务使用选择器来标识要代理的Pod的列表(如果它们处于就绪状态)。你可以简单地问了豆荚用GET请求相同的列表:

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

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

使用hostPort并转发到节点可以实现类似的效果,但hostPort的使用是不鼓励的(请参阅best practices)。

下面是一个方法,只要你可以发送来自k8s网络内的容器的请求(这可能不符合OP的愿望,但我猜这可能适用于有人使用Google)。

你必须以某种方式查看豆荚。在这里,我发现在staging命名空间中的所有吊舱与标签app=hot-app

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

此示例使用真棒JQ工具来分析所产生的JSON和抢荚IPS,但你可以分析在其他方面的JSON ,包括与kubectl本身。

这将返回是这样的:

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 

然后你进去一在你的k8s集群中使用curl容器,结合上一个命令的ips和port,然后像这样打开这个pod:

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