3-15-3-Ingress IngressController IngressClass的区别

熊 0 阅读 容器

Ingress由Ingress规则、IngressController、IngressClass这3部分组成。Ingress资源只是一系列路由转发配置 , 必须使用IngressController才能让路由规则生效 , 而IngressClass是IngressController的具体实现。使用原则 : 先部署IngressController → 再部署Ingress资源。

1. 理论

1.1 Ingress的概念

没有Ingress之前 , 可以通过Service的nodePort对外暴露服务 , 将容器端口与Service的nodePort端口做映射 , 这样访问集群中任意一台Node的IP:nodePort就能访问到集群内部。Service 的这种暴露服务的形式是工作在TCP/IP层。或者将Pod的端口与HostPort做映射。

但是这样做弊端较多 , 比如暴露了太多的Node端口、无法做域名转发等。

所以引入了Ingress的概念 , Ingress是一个七层路由转发器 , 类似于Nginx。使用Ingress进行路由转发时 , ingressController会基于ingress规则将客户端请求直接转发到Service对应的Pod上 , 这样会跳过 kube-proxy 设置的路由转发规则 , 可以提高网络转发效率。

1.2 Ingress的组成

Ingress资源是一种虚拟的资源和规则定义 , 需要配合ingressController才能生效。所以要让Ingress资源工作 , 集群必须有一个正在运行的ingressController。

Ingress由Ingress规则、IngressController、IngressClass这3部分组成。Ingress规则只是一系列的配置 , 必须使用IngressController才能使其生效 , 而IngressClass是IngressController的具体实现。关系如下图 :

kubernetes-ingress-consist-1

1.3 Ingress的功能和工作流程

ingressController的实现有多种 , 比如有Ingress-Nginx、Traefik、Kong Ingress等 , 所以需要在Yaml编排文件中指定ingressClass。

一旦Ingress资源成功部署创建 , IngressController就会监控到其配置的路由策略 , 并更新到Nginx的配置文件中生效。

综上 , IngressController 的功能如下 :

  • 接受外部的流量 , 并将请求负载均衡到内部运行的 pod上

  • 部署Ingress路由转发规则

  • 监控Kubernetes中运行的Pod , 并在添加或删除Pod后自动更新负载均衡规则

Ingress的工作流程 , 如下图 :

kubernetes-ingress-consist-2

2. 实践

2.1 安装IngressClass

本文实践使用的是ingress-nginx , 其实方式你可以自行实践。

官网地址 : https://kubernetes.github.io/ingress-nginx/deploy/#quick-start

可以通过helm或kubectl安装 , 本文使用的是kubectl方式安装 , yaml的文件内容较多 , 你可以自行下载查阅。执行以下命令安装 :

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

2.2 编排Yaml

IngressController部署完毕后 , 就是开始编排Yaml了。

Yaml中定义了一个容器镜像是Nginx的Pod , 然后通过Service与Pod关联 , 再通过Ingress规则访问对应的Pod。

apiVersion: v1
kind: Pod
metadata:
  name: web-app
  namespace: demo
  labels:
    app: web-app
spec:
  containers:
    - name: web-app
      image: nginx
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-service
  namespace: demo
  labels:
    app: web-service
spec:
  selector:
    app: web-app
  # ClusterIP | LoadBalancer | NodePort , 使用Ingress就没必要设置成NortPort
  type: ClusterIP
  clusterIP: None
  ports:
    - name: web-service-port
      protocol: TCP
      port: 80
      targetPort: 80
---
# 创建Ingress策略
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: web-ingress
  namespace: demo
spec:
  # 指定ingressClass
  ingressClassName: nginx
  rules:
    - host: web-ingress.mangod.top
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

2.3 部署测试

Yaml编排完毕后 , 使用kubectl apply命令部署 , 部署完毕后 , 在本地/etc/hosts里配置域名和某个K8S-Node节点的映射关系(当然 , 生产环境的访问链路比这个长 , 后面有机会再介绍 , 文中为了快速测试 , 直接在本地配置DNS) , 类似这样点的映射关系 :

10.20.1.23 web-ingress.mangod.top

然后 , 浏览器访问http://web-ingress.mangod.top/ , 界面如下 , 说明ingress使用成功。

kubernetes-ingress-consist-3

此时我们使用如下命令 , 进入到ingressController对应的pod , 继续验证 , 可以看到熟悉的nginx.conf , 之前配置的ingress规则在配置里都可以看到 , 如下 :

kubectl get pods -n ingress-nginx
kubectl exec ingress-nginx-controller-nginx-d864d97df-22ljk -it -n ingress-nginx /bin/bash
kubernetes-ingress-consist-4
kubernetes-ingress-consist-5

3、总结

一句话总结 : Ingress由Ingress规则、IngressController、IngressClass这3部分组成。Ingress资源只是一系列路由转发配置 , 必须使用IngressController才能让路由规则生效 , 而IngressClass是IngressController的具体实现。使用原则 : 先部署IngressController → 再部署Ingress资源。


参考链接

5分钟搞懂Ingress / IngressController / IngressClass的区别 (qq.com)