使用Kuberenetes入口控制器作为集群中其他服务的反向代理

时间:2019-02-20 05:27:14

标签: nginx kubernetes kubernetes-ingress

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

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

尽管我无法在集群中执行相同的操作,但是我尝试了Service ingress,但是如果添加了路径,例如,我无法以某种方式获得期望的结果。 “路径:” / mobiles-service“”,然后为其添加特定的服务,http请求不会以某种方式重定向到该服务。只有html服务可在根路径上使用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,您需要为在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上)路由到您在指定路径上公开的后端的App Services。

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

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>