我正在开发一个应用程序,允许用户在有限的生命周期内在自己的沙箱中玩耍。从概念上讲,可以认为用户正在玩Pong游戏。用户可以与托管在main/的Web界面进行交互,以开始Pong游戏。每个乒乓球游戏都将存在于自己的豆荚中。由于每个游戏的生存期都是有限的,因此 Pod 是按需动态创建的(通过 Kubernetes API(,作为具有单个 Pod 的 Kubernetes 作业。因此,乒乓球游戏和豆荚之间存在着一对一的关系。到目前为止,我已经弄清楚了。
我的问题是,如何设置入口以将动态创建的 URL(例如 main/game1(映射到相应的 pod?也就是说,如果用户通过主界面启动游戏,我希望他被重定向到托管其游戏的相应 pod 的 URL。
我可以预先分配一组 url,检查它们是否有活动作业,如果没有,则重定向,但不能很好地扩展。我认为动态分配 URL 是 Kubernetes 中的常见模式,因此必须有一种标准方法来做到这一点。我已经考虑过使用 nginx-ingress,但这不是必需的。
此外,评论,我为您创建了一个关于minikube
提供工作入口类控制器(通过minikube addons enable ingress
启用(的小演示。
复制模拟游戏的多个部署。
kubectl create deployment deployment-1 --image=nginxdemos/hello
kubectl create deployment deployment-2 --image=nginxdemos/hello
kubectl create deployment deployment-3 --image=nginxdemos/hello
kubectl create deployment deployment-4 --image=nginxdemos/hello
kubectl create deployment deployment-5 --image=nginxdemos/hello
与服务资源相同:
kubectl create service clusterip deployment-1 --tcp=80:80
kubectl create service clusterip deployment-2 --tcp=80:80
kubectl create service clusterip deployment-3 --tcp=80:80
kubectl create service clusterip deployment-4 --tcp=80:80
kubectl create service clusterip deployment-5 --tcp=80:80
最后,是时候使用Ingress了,但我们必须非常笨拙,因为我们没有可用的子命令create
。
for number in `seq 5`; do echo "
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: deployment-$number
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /game$number
backend:
serviceName: deployment-$number
servicePort: 80
" | kubectl create -f -; done
现在你有Pod、Service和Ingress:显然,你必须使用 Kubernetes API 复制相同的结果,但正如我在评论中建议的那样,你应该创建一个入口资源,并以动态方式相应地更新Path子项。
但是,如果您尝试模拟伪造Host
标头的 cURL 调用,则可以看到工作结果:
# curl `minikube ip`/game2 -sH 'Host: hello-world.info'|grep -i server
<p><span>Server address:</span> <span>172.17.0.5:80</span></p>
<p><span>Server name:</span> <span>deployment-2-5b98b954f6-8g5fl</span></p>
# curl `minikube ip`/game4 -sH 'Host: hello-world.info'|grep -i server
<p><span>Server address:</span> <span>172.17.0.7:80</span></p>
<p><span>Server name:</span> <span>deployment-4-767ff76774-d2fgj</span></p>
您还可以看到PodIP 和名称。
我同意Efrat Levitan的观点。这不是入口/kubernetes本身的任务。
您需要另一个应用程序(不同的抽象层(来区分流量应该路由到哪里,例如 istio 和基于 cookie 的 HTTP 流量路由规则。