Kubernetes 的动态通配符子域入口
Posted
技术标签:
【中文标题】Kubernetes 的动态通配符子域入口【英文标题】:Dynamic wildcard subdomain ingress for Kubernetes 【发布时间】:2017-09-01 23:33:18 【问题描述】:我目前在 GKE 上使用 Kubernetes,通过 Ingress 资源在不同子域上为我的产品的各个部分提供服务。例如:api.mydomain.com
、console.mydomain.com
等
ingress.yml(当前):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
rules:
- host: api.mydomain.com
http:
paths:
- backend:
serviceName: api-service
servicePort: 80
- host: console.mydomain.com
http:
paths:
- backend:
serviceName: console-service
servicePort: 80
使用 L7 GCE 负载平衡器路由到适当的位置,效果非常好。然而,我想做的是将许多功能分支部署部署为子域,以便在投入生产之前测试和演示新功能。这些可能是 new-stylesheet.console.mydomain.com
或 upgraded-algorithm.api.mydomain.com
,受 GitLab CI 的 environments 启发。
以下是每个部署的潜在工作流程:
-
创建 feature-api-deployment.yml
创建 feature-api-service.yml
使用新的子域规则更新 ingress.yml:
feature.api.mydomain.com
指定 serviceName: feature-api-service
但枚举和维护所有子域->服务映射会因拆除部署而变得混乱,并创建大量 GCE 后端(默认配额为 5...),因此并不理想。
我忽略了 Kubernetes 内置的什么来处理这个问题?根据匹配的子域选择目标服务是理想的选择:
ingress.yml(需要)
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
rules:
- host: *.api.mydomain.com
http:
paths:
- backend:
serviceName: value of *-api-service
servicePort: 80
【问题讨论】:
您是否能够实施所需的自动化解决方案?如果是的话,你能分享一些细节吗? @AngelTodorov 的开发重点最终发生了转变,这个特殊的项目从雷达上消失了。最好的办法是遵循已接受答案中的建议。如果我有时间实际实施答案,我会更新这个问题。 【参考方案1】:在 kubernetes 中肯定没有通配符域可用,但您可以使用 Helm 获得想要的东西
使用 helm,您可以在清单中模板化变量,因此您可以将分支的名称放在 helm values file
从那里,您可以让 gitlab-ci 在构建管道中进行 helm 安装,如果您正确配置图表,则可以指定管道名称的 helm 参数。
关于这种工作流程here 有一篇很棒的博客文章 - 希望这能让你到达你需要去的地方。
【讨论】:
您会根据您的上述建议提供一个示例解决方案吗? @Angel Todorov 你最终想出了解决方案吗? 其实不是,其实我早就放弃这个话题了……【参考方案2】:服务在本地可用
my-svc.svc.cluster.local
您可以编写一个简单的 nginx 代理,它可以转发,它可以解析子域,只要子域和服务名称匹配,就可以将其传递给 http://$service。
【讨论】:
您能否提供一个关于建议方法的简单实现示例?【参考方案3】:这是一个例子:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/bar"
backend:
service:
name: service1
port:
number: 80
- host: "*.foo.com"
http:
paths:
- pathType: Prefix
path: "/foo"
backend:
service:
name: service2
port:
number: 80
还有source。
【讨论】:
以上是关于Kubernetes 的动态通配符子域入口的主要内容,如果未能解决你的问题,请参考以下文章