首页 > 解决方案 > 使用 Kuberenetes 入口控制器作为集群中其他服务的反向代理

问题描述

我在 kops 和 aws 上有一个简单的 Kubernetes 集群,它服务于一个 Web 应用程序,有一个 html 页面和一些 api。它们都作为服务运行。我想公开所有端点(html 和 apis)以使网页正常工作。

我已将 html 服务公开为 LoadBalancer,并且我也在使用 nginx-ingress 控制器。我也想使用相同的 LoadBalancer 来公开其他 api(为每个服务使用不同的 LoadBalancer 似乎是一种糟糕且昂贵的方式),这是我在本地版本中使用 Nginx 反向代理能够做到的通过在 nginx conf 文件中为每个 api 提供不同的路径,来实现同一应用程序。

虽然我不能在集群中做同样的事情,但我尝试了服务入口,但不知何故,如果我添加一个路径,例如“路径:”/mobiles-service“”,然后添加对于它的特定服务,http 请求不会以某种方式重定向到该服务。只有 html 服务适用于根路径。任何帮助,将不胜感激。

标签: nginxkuberneteskubernetes-ingress

解决方案


首先,您需要为在 AWS 上运行的 Kops 集群创建控制器

kubectl apply -f https://raw.githubusercontent.com/kubernetes/kops/master/addons/ingress-nginx/v1.6.0.yaml

然后通过运行检查是否创建了 ingress-nginx 服务:

kubectl get svc ingress-nginx -n kube-ingress

然后为您的每个应用程序创建您的 pod 和 ClusterIP 类型的服务,如下面的示例:

kind: Service
apiVersion: v1
metadata:
  name: app1-service
spec:
  selector:
    app: app1
  ports:
    - port: <app-port>

然后创建入口规则文件,如下例所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
        - path: /app1
          backend:
            serviceName: app1-service
            servicePort: <app1-port>
        - path: /app2
          backend:
            serviceName: app2-service
            servicePort: <app2-port>

部署此入口规则 yaml 后,Kubernetes 会在您的集群上创建一个入口资源。在您的集群中运行的 Ingress 控制器负责创建一个 HTTP(S) 负载均衡器,以将所有外部 HTTP 流量(在端口 80 上)路由到您在指定路径上公开的后端应用服务。

您可以通过运行查看新创建的入口规则:

kubectl get ingress

您将看到如下输出:

NAME              HOSTS   ADDRESS                                                                  PORTS   AGE
example-ingress   *       a886e57982736434e9a1890264d461398-830017012.us-east-2.elb.amazonaws.com   80      1m

在相关路径中http://external-dns-name/app1http://external-dns-name/app2您将访问您的应用程序并在根/路径中,您将获得<default backend - 404>


推荐阅读