什么是 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

image.png

NodePort是您在服务的 YAML 中声明的配置设置。将服务规范设置type为NodePort. 然后,Kubernetes 将在每个节点上为该服务分配一个特定端口,并且该端口上对您的集群的任何请求都会转发到该服务

缺点:您不知道您的服务将被分配哪个端口,并且该端口可能会在某个时候重新分配

LoadBalancer

image.png

您可以将服务设置为LoadBalancer与设置相同的类型NodePort-type在服务的 YAML 中指定属性。集群中需要有一些外部负载均衡器功能,通常由云提供商实现

这通常严重依赖于云提供商——GKE 创建一个网络负载均衡器,其中包含一个可用于访问服务的 IP 地址

每次要向外界公开服务时,都必须创建一个新的 LoadBalancer 并获取 IP 地址

Ingress

image.png

NodePort并LoadBalancer让您通过在服务的type. 另一方面,Ingress 是您服务的完全独立的资源。您将它与您的服务分开声明、创建和销毁

这使得它与您想要公开的服务分离和隔离。它还可以帮助您将路由规则整合到一个地方

一个缺点是你需要为你的集群配置一个入口控制器。但这很简单——在本例中,我们将使用 Nginx 入口控制器

如何使用 Nginx Ingress

安装

  1. 部署配置 Ingress namespace

    kubectl apply -f https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/namespace.yaml
  2. 部署配置 Ingress controller

获取官方配置文件

$ wget https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml

修改文件(212行左右)

image.png

这已经设置了 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
点赞(0)

评论列表 共有 0 评论

暂无评论

微信服务号

微信客服

淘宝店铺

support@elephdev.com

发表
评论
Go
顶部