-1

我的目标是这样的:

  • 我的整个集群的单个公共 DNS 记录
  • 我的整个集群的单个入口
  • 我不想为新的部署/服务更新入口——它有一种自动路由到它们的方法

我正在使用 gke:https ://cloud.google.com/kubernetes-engine/docs/concepts/service-discovery

因此,默认情况下,服务会获取内部 DNS 记录,例如 my-svc.my-namespace.svc.my-zone

我想要的是能够像这样使用该服务:http://myapps.com/my-svc.my-namespace.svc.my-zone/someEndpoint

这可能吗?这意味着我可以部署新的部署和服务,并且集群外的消费者可以立即访问它们。

您是否必须将入口与后端服务相关联?我不想这样做,因为这意味着我需要更新它以添加每个新的部署/服务,并且我想让它动态化。您可以让入口使用内部 DNS 路由到服务吗?

4

2 回答 2

2

我认为有几种方法可以做到这一点。一种方法是根本不使用Ingress资源,而是在您的服务前面放置一个 Nginx 代理。然后将其配置为代理所有请求。这样的配置应该可以工作。

location ~ ^\/(.+?)\/(.*)$ {
  proxy_pass http://$1/$2;
}
于 2020-10-09T22:15:30.397 回答
0

这可能最好使用 nginx 代理和 Ingress 的组合来实现。

首先,您使用所需的主机名创建一个入口,并添加一个指向您的 nginx 代理的后端。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: youringress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - yourhostname
    secretName: yourtlssecret
  rules:    
  - host: yourhostname
    http:
      paths:
      - path: /your-app-path
        backend:  
          serviceName: nginxservice
          servicePort: nginxserviceport 

路径值可以是一个通用斜杠,它将首先将所有传入请求路由到 nginx 代理服务器,然后根据路径将其转发到相应的服务。每次部署新服务时都不需要更新此入口,因为它的主要职责只是将请求发送到 nginx 代理服务器。

然后,您创建具有多个位置块的 nginx 代理服务器,这些位置块根据 kube-dns 名称将请求路由到集群中的相应服务。

server {
        listen       1080;
        server_name  localhost $hostname;

        location /path-to-the-service1 {
           proxy_pass http://name-of-service1
        }

        location /path-to-the-service2 {
           proxy_pass http://name-of-service2
        }

        location /path-to-the-service3 {
           proxy_pass http://name-of-service3
        }
    }

如果您在集群中创建一个名为 frontendservice 的服务,则 nginx 代理服务器可以使用 kube-dns 名称访问它

location /path-to-the-frontendservice {
               proxy_pass http://frontendservice
            }

您可以继续将您的新部署添加为 nginx 代理服务器中的单独位置块,它将为您处理路由。

然后,您应该能够使用您的网址访问任何服务,例如

http://my-app-url/path-to-the-service/

于 2020-10-11T03:57:58.923 回答