一、Ingress 资源对象需求背景

我们之前已经介绍过,可以使用 Service 资源对象进行负载均衡、管理流量,为什么还需要Ingress呢?

  • 使用 Service 资源对象进行负载均衡主要在 Kubernetes 集群的内部。虽然我们可以访问 NodePort 类型的 Service 资源对象,但是也存在诸多问题,例如大型系统中默认的端口数目不够、需要暴露节点 IP 存在安全风险等;
  • Service 资源对象管理流量能力弱。Service 资源对象是在第四层的负载均衡,作用在 TCP/IP 协议栈,只能够通过IP、端口号等信息对流量进行管控操作。但是 Ingress 资源对象是工作在第七层的负载均衡,作用在 HTTP/HTTPS 协议栈,可以对URL、Request header、证书等数据信息对行进行操作,流量控制的方式更加多样化。因此,Ingress 资源对象的出现可谓是众望所归。

Ingress在K8S集群中的位置

二、Ingress 孪生兄弟之 Ingress Controller 和 IngressClass

我们会把所有进入集群的流量交给Ingress,但是并不是所有的东西都是让 Ingress 来处理,否者的话 Ingress 会变得非常臃肿且复杂。Ingress 携手它的好兄弟Ingress Controller、IngressClass 共同管理这些流量:

  • Ingress,Kubernetes中的资源对象。主要用于定义请求流量的路由规则;
  • Ingress Controller,进行流量分发、负载均衡的实现主体。我们可以直接引用开源社区的实现,比如 Nginx 公司基于Nginx原理实现的的 Nginx Ingress Controller,还有比较火热的 Kong Ingress Controller 等;
  • IngressClass,Kubernetes提供的用于解耦 Ingress Controller 和 IngressClass 的资源对象。因为Ingress Controller 和 Ingress 并不是一对一的关系,而且Ingress 中如果定义了较多的规则,Ingress Controller 处理起来会存在较大的压力,因此这两个对象需要解耦;

三、使用 Yaml 文件定义 Ingress 与 IngressClass

3.1 使用 Yaml 文件定义 Ingress 资源对象

因为 Ingress 资源对象主要是用来进行流量转发的,所以我们在定义 Ingress 资源对象的时候只需要关注流量从哪里来,到那里去,跟哪个 IngressClass 对接就行了。我们通过 kubectl create 命令来创建定义 Ingress 资源对象的 Yaml 模版文件:

kubectl create ing test-ing --rule="host.test.com/=test-svc:8848" --class=test-ingk --dry-run=client -o yaml

ing: Ingress 资源对象的缩写;
- -rule: 指定流量的路由规则,格式形式为:“URI=Service”,表示从访问这个URI 的流量都会被转发到指定的服务上,该服务用服务名+端口号表示;
- -class: 指定对接的 IngressClass 对象;
- -dry-run=client -o yaml: 仅在本地模拟执行命令,并将模拟执行命令的结果以 Yaml 的形式返回;

然后我们可以得到 Ingress 资源对象在 yaml 文件中的定义内容如下:

apiVersion: networking.k8s.io/v1
kind: Ingress		#资源对象的类别
metadata:
  name: test-ing

spec:
  ingressClassName: test-ingk		# 指定要匹配的 ingressClass
  rules:
  - host: host.test.com	#指定匹配的南向域名
    http:
      paths:
      - path: /		#域名后的URL路径
        pathType: Exact		# URL 路径匹配类型
        backend:
          service:		# 指定把流量转发到哪个Service处理
            name: test-svc
            port:		# 指定目标Service的端口号
              number: 8848

3.2 使用 Yaml 文件定义 IngressClass 资源对象

IngressClass 资源对象主要是用来解耦 Ingress 和 Ingress Controller 的,我们在定义Ingress 时指定了使用了哪个 IngressClass,那我们在定义 IngressClass 的时候就需要明确我们要使用的 Ingress Controller。IngressClass 资源对象的定义Yaml内容如下:

apiVersion: networking.k8s.io/v1
kind: IngressClass		# 资源对象类别
metadata:
  name: test-ingk	# 指定 IngressClass 名

spec:		# 指定要使用的 Ingress Controller
  controller: nginx.org/ingress-controller

除此之外,因为 Ingress Controller 是真正进行流量转发处理的服务,一般由开源社区或者商用公司提供。我们在创建完 Ingess 和 IngressClass 资源对象之外还需要部署对应的 Ingress Controller,例如我们在上面定义 IngressClass 的时候已经通过 controller 字段指定了使用 Nginx 的Ingress Controller。此部分忽略。

四、在集群中操作使用 Ingress

通过 kubectl apply 命令分别创建 Ingress 和 IngressClass 资源对象:

kubectl apply -f test-ingress.yaml
kubectl apply -f test-ingressClass.yaml

查看Ingress 和 IngressClass 资源对象状态信息:

kubectl get ing
kubectl get ingressclass

我们在部署好Ingress Controller 之后,可能需要通过 kubectl port-forward 命令将部署Ingress Controller 的Pod 进行端口映射,这样外部才能访问的到。或者也可以创建一个 NodePort 类型的 Service 资源对象,方便外部的访问。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐