Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

21|Ingress:集群进出流量的总管

你好,我是 Chrono。
上次课里我们学习了 Service 对象,它是 Kubernetes 内置的负载均衡机制,使用静态 IP 地址代理动态变化的 Pod,支持域名访问和服务发现,是微服务架构必需的基础设施。
Service 很有用,但也只能说是“基础设施”,它对网络流量的管理方案还是太简单,离复杂的现代应用架构需求还有很大的差距,所以 Kubernetes 就在 Service 之上又提出了一个新的概念:Ingress。
比起 Service,Ingress 更接近实际业务,对它的开发、应用和讨论也是社区里最火爆的,今天我们就来看看 Ingress,还有与它关联的 Ingress Controller、Ingress Class 等对象。

为什么要有 Ingress

通过上次课程的讲解,我们知道了 Service 的功能和运行机制,它本质上就是一个由 kube-proxy 控制的四层负载均衡,在 TCP/IP 协议栈上转发流量(Service 工作原理示意图):
但在四层上的负载均衡功能还是太有限了,只能够依据 IP 地址和端口号做一些简单的判断和组合,而我们现在的绝大多数应用都是跑在七层的 HTTP/HTTPS 协议上的,有更多的高级路由条件,比如主机名、URI、请求头、证书等等,而这些在 TCP/IP 网络栈里是根本看不见的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes中的Ingress是集群流量管理的关键概念,通过Ingress,用户可以实现更高级的路由条件,如主机名、URI、请求头等,从而安全、顺畅、便捷地访问内部服务。Ingress Controller负责处理、调度流量,而Ingress Class解除了Ingress和Ingress Controller的强绑定关系,简化了Ingress规则的复杂度。文章介绍了如何使用YAML描述Ingress/Ingress Class,以及在Kubernetes里使用Ingress/Ingress Class和Ingress Controller的方法。此外,文章还强调了Ingress Controller的多功能性,包括TLS终止、网络应用防火墙、限流限速、流量拆分、身份认证、访问控制等。通过详细的操作步骤和示例,读者可以快速了解并掌握Kubernetes中Ingress的使用和部署方法。文章深入浅出地介绍了Ingress、Ingress Controller和Ingress Class的作用和关系,为读者提供了全面的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(76)

  • 最新
  • 精选
  • Jasper
    四层架构简单,无需解析消息内容,在网络吞吐量及处理性能上高于七层。 而七层负载优势在于功能多,控制灵活强大。

    作者回复: good

    2022-08-08归属地:北京
    26
  • Xu.
    老师,我在安装文档里找到了大多数同学遇到的问题的解决方法: https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/ Create Custom Resources 这一节 注意:默认情况下,需要为 VirtualServer, VirtualServerRoute, TransportServer and Policy 创建自定义资源的定义。否则,Ingress Controller Pod 将不会变为 Ready 状态。如果要禁用该要求,请将 -enable-custom-resources 命令行参数配置为 Readyfalse 并跳过此部分。 也就是说可以 kubectl apply -f 下面几个文件: $ kubectl apply -f common/crds/k8s.nginx.org_virtualservers.yaml $ kubectl apply -f common/crds/k8s.nginx.org_virtualserverroutes.yaml $ kubectl apply -f common/crds/k8s.nginx.org_transportservers.yaml $ kubectl apply -f common/crds/k8s.nginx.org_policies.yaml 然后就启动成功了。 也可以将 -enable-custom-resources 命令行参数配置为 Readyfalse

    作者回复: good solution!

    2022-10-22归属地:上海
    3
    16
  • 新时代农民工
    文末的kic.yml是来自 https://github.com/nginxinc/kubernetes-ingress/blob/main/deployments/deployment/nginx-ingress.yaml

    作者回复: good

    2022-08-09归属地:上海
    11
  • 小江爱学术
    一个小问题老师,service基于四层转发,会暴露ip。基于这些缺点我们引入了ingress,基于七层网络协议转发,但是为了外部服务访问,需要在ingress前再暴露一个nodeport类型的service,那我们这么做的意义在哪里捏,最外层的入口处不还是service吗。

    作者回复: Ingress基于http协议,有更丰富的路由规则,能够更精细地管理流量。而且有了Ingress,只需要对外暴露一个Service对象就可以了,也更加安全。

    2022-10-06归属地:北京
    3
    7
  • stefen
    最后ingress-controller运行起来的pod 可以看作是一个pod的nginx反向代理的VIP, 由于pod网络隔离的原因,需要还套娃一个service, 对外提供统一的管理入口,是否可以换种思路, 在启动这种ingress-controller运行起来的pod的,设置pod的网络为host,就是公用宿主机网卡,这样就不用套娃service了.

    作者回复: 可以的,后面的实战就是这么做的。

    2022-08-28归属地:上海
    7
  • Grey
    Nginx Ingress Controller 只用那4个不行,看了23节,跟着老师用bash脚本全部弄进去了才把kic起了起来

    作者回复: 脚本里用的YAML 比较多,还创建了crd资源。

    2022-08-14归属地:北京
    2
    7
  • 李一
    老师,请问 Ingress 工作在7层协议中,指针对http(s)应用层协议进行控制,那如果 我的应用是需要长链接的 不如IM通讯相关,那是不是Ingress就无法满足了,只能通过service 定义吗?

    作者回复: 四层协议可以由Ingress Controller的crd资源来定义,比如Nginx Ingress Controller的Transport Server,可以参考它们的相关文档,比如:https://docs.nginx.com/nginx-ingress-controller/configuration/transportserver-resource/

    2022-08-08归属地:北京
    5
  • 极客酱酱
    为ingres-controller设置Service: ➜ ingress kubectl expose deploy nginx-kic-dep -n nginx-ingress --port=80 --target-port=80 $=out>ingress-svc.yml ➜ ingress cat ingress-svc.yml apiVersion: v1 kind: Service metadata: name: nginx-kic-svc namespace: nginx-ingress spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx-kic-dep type: NodePort ➜ ingress kubectl get svc -n nginx-ingress NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-kic-svc NodePort 10.105.174.176 <none> 80:32519/TCP 3m41s ➜ ingress kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ubuntu Ready control-plane,master 4d v1.23.3 10.211.55.5 <none> Ubuntu 22.04 LTS 5.15.0-58-generic docker://20.10.12 worker Ready <none> 4d v1.23.3 10.211.55.6 <none> Ubuntu 22.04 LTS 5.15.0-58-generic docker://20.10.12 ➜ ingress curl --resolve ngx.test:32519:10.211.55.5 http://ngx.test:32519 srv : 10.10.1.10:80 host: ngx-dep-6796688696-867dm uri : GET ngx.test / date: 2023-02-09T15:10:48+00:00 ➜ ingress curl --resolve ngx.test:32519:10.211.55.5 http://ngx.test:32519 srv : 10.10.1.11:80 host: ngx-dep-6796688696-psp5v uri : GET ngx.test / date: 2023-02-09T15:10:50+00:00

    作者回复: great

    2023-02-09归属地:四川
    2
    4
  • YueShi
    service方式如下: apiVersion: v1 kind: Service metadata: name: ingress-svc namespace: nginx-ingress spec: selector: app: ngx-kic-dep ports: - port: 80 targetPort: 80 type: NodePort 请求 后面的端口要根据kubectl get svc -n nginx-ingress 查看 curl --resolve ngx.test:31967:127.0.0.1 http://ngx.test:31967

    作者回复: great

    2022-08-12归属地:北京
    3
    4
  • GeekNeo
    我发现了一个问题,我是用了最新版的yml,从github拉的,没有直接用老师的,但是kic.yml文件就是使用老师贴出来的,然后运行起来,pod一直都是未READY和AVAILABLE,查看日志logs,报错: Failed to watch *v1.Endpoints: failed to list *v1.Endpoints: endpoints is forbidden: User "system:serviceaccount:nginx-ingress:nginx-ingress" cannot list resource "endpoints" in API group "" at the cluster scope 我排查了很久,最后发现rabc文件规则异同,导致版本不兼容,不知道我猜测的对不对? 把老师的镜像文件 nginx/nginx-ingress:2.2-alpine更换为nginx/nginx-ingress:3.0.2 再次apply后,就一切正常OK了,没问题了。 总结:因没有拉老师提供的yml清单生成对应的对象,而是自己去github拉最新版本的yml生成对象,而镜像文件使用了老师提供,导致pod起不来。目测是版本对rabc规则的不兼容导致,不知道老师可以解答下吗?

    作者回复: 是的,镜像和YAML 必须对应,否则会版本不匹配。

    2023-03-26归属地:浙江
    2
收起评论
显示
设置
留言
76
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部