首页 > 解决方案 > 面向最终用户的 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 ?

标签: kuberneteskubernetes-ingress

解决方案


一种方法是使用一个 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 作为入口控制器以及应用一些配置来实现您希望的可能性。


推荐阅读