5分钟搞懂Ingress / IngressController / IngressClass的区别

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

本文5分钟大白话说明白Ingress、IngressController、IngressClass的概念和区别,然后结合实践加深理解。

先来个一句话总结: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的具体实现。关系如下图:

1.3、Ingress的功能和工作流程

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

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

综上,IngressController 的功能如下:

  • 接受外部的流量,并将请求负载均衡到内部运行的 pod上
  • 部署Ingress路由转发规则
  • 监控Kubernetes中运行的Pod,并在添加或删除Pod后自动更新负载均衡规则

Ingress的工作流程,如下图:

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使用成功。

此时我们使用如下命令,进入到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

至此实践过程结束。

3、总结

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

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!

原文链接:http://www.mangod.top/articles/2023/09/15/1694742027308.htmlhttps://mp.weixin.qq.com/s/IQ6hrNM_EKHp-Lukuw5Nlw

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
Kubernetes Perl 容器
k8s学习-ReplicationController 、ReplicaSet(工作原理、模板、实战)
k8s学习-ReplicationController 、ReplicaSet(工作原理、模板、实战)
41 0
|
5月前
|
存储 Kubernetes NoSQL
k8s 学习九,pod 知识点 上
k8s 学习九,pod 知识点 上
159 0
|
10月前
|
存储 Kubernetes NoSQL
【k8s 系列】k8s 学习九,pod 知识点 上
在 K8S 中, pod 是一个非常关键的存在,我们一起来看看 pod 具体是个什么?
131 0
|
5月前
|
Kubernetes API 调度
pod 知识点 下
pod 知识点 下
|
7月前
|
存储 Kubernetes 持续交付
kubernetes系列文章第一篇-k8s基本介绍
kubernetes系列文章第一篇-k8s基本介绍
|
10月前
|
存储 Kubernetes API
【k8s 系列】k8s 学习十,pod 知识点 下
上一篇分享了 pod 的基本知识点,有 K8S 环境的小伙伴还是可以用起来的,还对比较简单,知道了 pod 的 yaml 文件结构,标识,基本的创建 pod 和删除 pod 的用法等等,我们继续
|
10月前
|
Prometheus Kubernetes 负载均衡
一文搞懂 Traefik Proxy 2.10 新版本特性
Hello folks,我是 Luga,今天我们来分享一下关于 Traefik 最新版本 - v2.10 相关特性。
223 0
|
10月前
|
Kubernetes Devops Linux
一文搞懂 Minikube 底层原理
随着容器技术的井喷式发展及落地,通常情况下,我们将 Kubernetes 描述为“将 Linux 容器集群作为单个系统进行管理,以加速开发并简化维护”。与此同时,企业应用服务进行容器化改造时避免不了学习和使用 Kubernetes 。然而能够在环境中完整部署一整套多节点的 Kubernetes 集群,对于刚接触这块体系的 Devops 人员来说确实有一定的难度... ...
207 0
一文搞懂 Minikube 底层原理
BXA
|
存储 弹性计算 Kubernetes
解析Kubernetes的设计与实现原理
Kubernetes 是一种用于自动化部署、扩展和管理容器化应用程序的开源平台。它通过提供跨主机集群的容器协调和管理服务,实现了高可用性和弹性伸缩的容器集群管理。
BXA
141 0
|
缓存 负载均衡 监控
10分钟带你深入浅出搞懂Nginx
10分钟带你深入浅出搞懂Nginx
164 0