Kubernetes - 如何将请求发送给所有的爪牙?
问题描述:
我有一个pod,其目的是获取传入的数据并将其写入主机卷。我在所有的爪牙中运行这个吊舱。Kubernetes - 如何将请求发送给所有的爪牙?
现在,当我设置NodePort服务到这个豆荚时,流量将一次转到1个豆荚。
但是,我如何向所有这些豆荚在不同的爪牙中发送请求?如何绕过此处的负载平衡?我希望这些数据可以在所有的奴才主机中使用。
答
服务使用选择器来标识要代理的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