使用 Kubernetes 入口控制器作为集群中其他服务的反向代理
Using Kuberenetes ingress controller as reverse proxy to other services in the cluster
我在 kops 和 aws 上有一个简单的 Kubernetes 集群,它正在为一个网络应用程序提供服务,有一个 html 页面和几个 apis。它们都是 运行 作为服务。我想公开所有端点(html 和 apis)以使网页正常工作。
我已将 html 服务公开为 LoadBalancer,并且我还在使用 nginx-ingress 控制器。我也想使用相同的 LoadBalancer 来公开其他 apis(为每个服务使用不同的 LoadBalancer 似乎是一种糟糕且昂贵的方式),这是我能够使用 Nginx 反向代理在同一应用程序的本地版本,通过为 nginx conf 文件中的每个 api 提供不同的路径。
虽然我无法在集群中做同样的事情,但我尝试了 Service ingress 但不知何故,如果我添加路径,例如"path: "/mobiles-service"" 然后为其添加特定服务,http 请求不会以某种方式重定向到该服务。只有 html 服务在根路径上工作。任何帮助将不胜感激。
首先,您需要在 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
然后为您的 每个应用程序 创建您的 pods 和 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 上)路由到您在指定路径上公开的后端应用服务。
通过运行:
可以看到新建的ingress规则
kubectl get ingress
你会看到如下输出:
NAME HOSTS ADDRESS PORTS AGE
example-ingress * a886e57982736434e9a1890264d461398-830017012.us-east-2.elb.amazonaws.com 80 1m
在 http://external-dns-name/app1
和 http://external-dns-name/app2
等相关路径中,您将访问您的应用程序,在根 /
路径中,您将获得 <default backend - 404>
我在 kops 和 aws 上有一个简单的 Kubernetes 集群,它正在为一个网络应用程序提供服务,有一个 html 页面和几个 apis。它们都是 运行 作为服务。我想公开所有端点(html 和 apis)以使网页正常工作。
我已将 html 服务公开为 LoadBalancer,并且我还在使用 nginx-ingress 控制器。我也想使用相同的 LoadBalancer 来公开其他 apis(为每个服务使用不同的 LoadBalancer 似乎是一种糟糕且昂贵的方式),这是我能够使用 Nginx 反向代理在同一应用程序的本地版本,通过为 nginx conf 文件中的每个 api 提供不同的路径。
虽然我无法在集群中做同样的事情,但我尝试了 Service ingress 但不知何故,如果我添加路径,例如"path: "/mobiles-service"" 然后为其添加特定服务,http 请求不会以某种方式重定向到该服务。只有 html 服务在根路径上工作。任何帮助将不胜感激。
首先,您需要在 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
然后为您的 每个应用程序 创建您的 pods 和 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 上)路由到您在指定路径上公开的后端应用服务。
通过运行:
可以看到新建的ingress规则kubectl get ingress
你会看到如下输出:
NAME HOSTS ADDRESS PORTS AGE
example-ingress * a886e57982736434e9a1890264d461398-830017012.us-east-2.elb.amazonaws.com 80 1m
在 http://external-dns-name/app1
和 http://external-dns-name/app2
等相关路径中,您将访问您的应用程序,在根 /
路径中,您将获得 <default backend - 404>