kubernetes - 面向最终用户的 kubernaties 中的隔离应用程序
问题描述
我有传统的服务器应用程序堆栈:
- 数据库
- 应用程序(红宝石)
- 微服务(节点)
应用程序可通过https://example.com获得
我的用户想要通过连接字符串完全访问数据库的独立个人应用程序(以实现高可用性)
所以我们需要服务器应用程序堆栈: - 个人(隔离)数据库 - 个人(隔离)应用程序 - 个人(隔离)微服务
应用程序必须通过http://cloud.example.com/userX可用,其中 userX 是用户的登录名
我认为每个用户都应该有自己的命名空间。因此,个人数据库、应用程序和微服务器都属于这个命名空间。
此外,我现在为所有用户应用程序提供了一个 Ingress(在命名空间中:kube-public):
# ? apiVersion: networking.k8s.io/v1beta1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mgrs
namespace: kube-public
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- cloud.example.com
secretName: cloud-tls
rules:
- host: cloud.example.com
http:
paths:
- path: /user1
backend:
serviceName: user1-service
servicePort: 80
- path: /user2
backend:
serviceName: user2-service
servicePort: 80
...
Kubernetes 怎么可能?也许我需要为每个用户提供几个入口?
也许更容易让路径 userX.example.com 而不是 cloud.example.com/userX ?
解决方案
一种方法是使用一个 Ngnix 作为服务的动态代理,因为您可以在云中添加一个 ConfigMap 以动态地死记硬背用户服务,
如果您使用一个命名空间并将用户名放在服务名称中,则应使用此配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config-dns-file
data:
nginx.conf: |
server {
listen 80;
resolver kube-dns.kube-system.svc.cluster.local valid=5s;
location ~ /(.*) {
proxy_pass http://$1-service.default.svc.cluster.local;
}
}
如果您为每个用户使用一个命名空间并将用户名放在服务名称中,您应该使用类似这样的配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config-dns-file
data:
nginx.conf: |
server {
listen 80;
resolver kube-dns.kube-system.svc.cluster.local valid=5s;
location ~ /(.*) {
proxy_pass http://$1-service.$1.svc.cluster.local;
}
}
与此一致的另一种可能性是使用Nginx-Ingress
控制器并利用 Ngnix 作为入口控制器以及应用一些配置来实现您希望的可能性。
推荐阅读
- java - 无法将模型类传递给我的 BaseAdapter
- javascript - 在 mvc 中调用带有 jquery 参数的 url
- sql - 规则列表的 SQL 检查约束
- python - 图像理解——CNN Triplet loss
- angular - Angular-cli 只注册组件
- python - Pytest:如果另一个文件的测试失败,如何在一个文件中设置要跳过的测试
- c# - 如何使用 StreamReader.ReadAsync(内存
, 取消令牌) - javascript - Nodejs 需要异步方式的模块
- opc - 将数据写入 Matrikon OPC UA 服务器
- google-app-engine - 即使服务正在运行,gcloud app deploy 也不会终止