Kubernetes入口以获取动态URL

时间:2019-08-29 05:46:54

标签: kubernetes kubernetes-ingress

我正在开发一个应用程序,允许用户在有限的使用寿命内在自己的沙箱中玩耍。从概念上讲,可以认为用户正在玩Pong游戏。用户可以与main /上托管的Web界面进行交互以启动Pong游戏。每次Pong游戏都将存在于自己的广告连播中。由于每个游戏都有一定的生存期,因此可以通过单个Pod作为Kubernetes作业按需(通过Kubernetes API)动态创建Pod。因此,乒乓球和豆荚之间存在一对一的关系。至此,我已经弄清楚了。

我的问题是,如何设置一个入口以将动态创建的URL(例如main / game1)映射到相应的Pod?也就是说,如果用户通过主界面启动游戏,我希望将他重定向到托管他的游戏的相应pod的URL。

我可以预先分配一组URL,检查它们是否有活动的作业,如果没有,则进行重定向,但是不能很好地扩展。我认为动态分配URL是Kubernetes中的常见模式,因此必须有一种标准的方法来做到这一点。我已经看过使用nginx-ingress了,但这不是必须的。

2 个答案:

答案 0 :(得分:1)

此外,我在minikube上为您创建了一个小演示,提供了一个有效的 Ingress Class 控制器(通过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复制相同的结果,但正如我建议的那样在注释中,您应该创建一个单个 Ingress 资源,并以动态方式相应地更新 Path 子项。

但是,如果您尝试模拟伪造Host标头的cURL调用,则可以看到工作结果:

# curl `minikube ip`/game2 -sH 'Host: hello-world.info'|grep -i server
<p><span>Server&nbsp;address:</span> <span>172.17.0.5:80</span></p>
<p><span>Server&nbsp;name:</span> <span>deployment-2-5b98b954f6-8g5fl</span></p>

# curl `minikube ip`/game4 -sH 'Host: hello-world.info'|grep -i server
<p><span>Server&nbsp;address:</span> <span>172.17.0.7:80</span></p>
<p><span>Server&nbsp;name:</span> <span>deployment-4-767ff76774-d2fgj</span></p>

您还可以看到 Pod IP和名称。

答案 1 :(得分:1)

我同意Efrat Levitan。这不是入口/ kubernetes本身的任务。

您需要另一个应用程序(不同的抽象层)来区分应将流量路由到何处,例如基于cookie的istio和Routing rule for HTTP traffic