什么是 Ingress
在 Kubernetes 中,Ingress 是一个对象,它允许从 Kubernetes 集群外部访问您的 Kubernetes 服务。您可以通过创建定义哪些入站连接到达哪些服务的规则集合来配置访问。
这使您可以将路由规则整合到单个资源中。例如,您可能希望将请求发送到example.com/api/v1/
一个api-v1服务,并请求example.com/api/v2/
到api-v2服务。使用 Ingress,您可以轻松地进行设置,而无需创建一堆 LoadBalancer 或在 Node.js 上公开每个服务
Kubernetes Ingress, LoadBalancer, NodePort
都做同样的事情。它们允许您向外部网络请求公开服务。它们允许您从 Kubernetes 集群外部向集群内部的服务发送请求
NodePort
NodePort
是您在服务的 YAML 中声明的配置设置。将服务规范设置type为NodePort. 然后,Kubernetes 将在每个节点上为该服务分配一个特定端口,并且该端口上对您的集群的任何请求都会转发到该服务
缺点:您不知道您的服务将被分配哪个端口,并且该端口可能会在某个时候重新分配
LoadBalancer
您可以将服务设置为LoadBalancer与设置相同的类型NodePort-type在服务的 YAML 中指定属性。集群中需要有一些外部负载均衡器功能,通常由云提供商实现
这通常严重依赖于云提供商——GKE 创建一个网络负载均衡器,其中包含一个可用于访问服务的 IP 地址
每次要向外界公开服务时,都必须创建一个新的 LoadBalancer 并获取 IP 地址
Ingress
NodePort并LoadBalancer让您通过在服务的type. 另一方面,Ingress 是您服务的完全独立的资源。您将它与您的服务分开声明、创建和销毁
这使得它与您想要公开的服务分离和隔离。它还可以帮助您将路由规则整合到一个地方
一个缺点是你需要为你的集群配置一个入口控制器。但这很简单——在本例中,我们将使用 Nginx 入口控制器
如何使用 Nginx Ingress
安装
-
部署配置 Ingress
namespace
kubectl apply -f https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/namespace.yaml
-
部署配置 Ingress controller
获取官方配置文件
$ wget https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml
修改文件(212行左右)
这已经设置了 Nginx 入口控制器。现在,我们可以在 Kubernetes 集群中创建 Ingress 资源并将外部请求路由到我们的服务
解决国内网络访问问题
创建 Kubernetes Ingress
首先,让我们创建两个服务来演示 Ingress 如何路由我们的请求。我们将运行两个输出略有不同响应的 Web 应用程序
kind: Pod
apiVersion: v1
metadata:
name: apple-app
labels:
app: apple
spec:
containers:
- name: apple-app
image: hashicorp/http-echo
args:
- "-text=apple"
---
kind: Service
apiVersion: v1
metadata:
name: apple-service
spec:
selector:
app: apple
ports:
- port: 5678 # Default port for image
kind: Pod
apiVersion: v1
metadata:
name: banana-app
labels:
app: banana
spec:
containers:
- name: banana-app
image: hashicorp/http-echo
args:
- "-text=banana"
---
kind: Service
apiVersion: v1
metadata:
name: banana-service
spec:
selector:
app: banana
ports:
- port: 5678 # Default port for image
创建资源
$ kubectl apply -f apple.yaml
$ kubectl apply -f banana.yaml
现在,声明一个 Ingress 以将请求路由/apple到第一个服务,并将请求路由/banana到第二个服务。查看rules 声明请求如何传递的 Ingress字段
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /apple
backend:
serviceName: apple-service
servicePort: 5678
- path: /banana
backend:
serviceName: banana-service
servicePort: 5678
在集群中创建 Ingress
kubectl create -f ingress.yaml
检查它是否正常工作
$ curl -kL http://localhost/apple
apple
$ curl -kL http://localhost/banana
banana
$ curl -kL http://localhost/notfound
default backend - 404
发表评论 取消回复