k8s之ingress

Service & Ingress

Service

  • 基于iptables或ipvs实现的四层负载均衡机制
  • 不支持基于URL等机制对HTTP/HTIPS协议进行高级路由、超时/重试、基于流量的灰度等高级流量治理机制
  • 难以将多个Seryice流量统一管理

Ingress

  • 由Ingress API和Ingress Controller共同组成

  • 前者负责以k8s标准的资源格式定义流量调度、路由等规则

  • 后者负责监视(watch)Ingress并生成自身的配置,并据此完成流量转发。

  • Ingress Controller非为内置的控制器,需要额外部署

  • 通常以Pod形式运行于Kubernetes集群之上

  • 一般应该由专用的LB Service负责为其接入集群外部流量

Ingress API

将Kubernetes集群内部运行的某服务(Service)通过七层负载均衡的机制开放到集群外部。Ingress API是Kubernetes一种声明式配置接口。

Ingress Controller

Ingress Controller 是实现Ingress API的实体。

通常将能够通过API Server读取ingress的定义,并能够将其自动转换成当前应用程序的配置,而且支持自动热重载,它就能够成为支撑Ingress API的Ingress Controller。

  • 读取 Ingress 定义:Ingress Controller 需要能够监听 Kubernetes API Server,以获取 Ingress 资源的定义。这包括对 Ingress 资源的增加、删除和修改的监听。
  • 自动转换配置:Ingress Controller 根据读取到的 Ingress 定义,自动转换并更新其内部的配置。这个配置决定了如何将外部流量路由到集群内的服务。
  • 支持自动热重载:当 Ingress 资源发生变化时,Ingress Controller 应该能够无需重启服务的情况下,动态地更新其路由规则。这种能力通常称为“热重载”,意味着流量不会因配置更新而中断。
  • 实现 Ingress API:Ingress Controller 需要实现 Kubernetes Ingress API 的规范,确保它能够支持定义的路由规则、SSL 终端、重写规则等。
  • 网络和负载均衡:Ingress Controller 通常还需要与网络组件交互,如服务发现、负载均衡器配置等,以确保流量正确地分发到后端服务。
  • 高可用性和容错性:在生产环境中,Ingress Controller 应该具备高可用性和容错性,以确保流量管理的稳定性。
  • 安全性:Ingress Controller 管理着进入集群的流量,因此需要考虑安全性,包括 SSL/TLS 证书管理、访问控制等。

Ingress创建

LoadBalancer + Ingress Nginx

1、部署 LoadBalancer

创建一个 LoadBalancer 类型的 Service 来为 Ingress 控制器提供外部访问点。云服务提供商会为您的 LoadBalancer 分配一个外部 IP 地址,该地址将流量路由到 Ingress 控制器。
通过MetalLB 也可以实现 Kubernetes 集群的负载均衡。

2、部署 Ingress 控制器

部署一个 Ingress 控制器,如 nginx-ingress、traefik 或 haproxy-ingress。这些控制器会监视 Ingress 资源,并根据定义的规则配置其内部的负载均衡器和反向代理。

  • 外部流量策略设置

使用Nodeport类型的service时,不确定流量从哪个节点进入需要修改外部流量策略为Cluster。
externalTrafficPolicy : Local (Local只负责将从哪个节点进来的流量只调度给率属于该Service的Pod)
externalTrafficPolicy : Cluster

3、创建工作负载以及Service

4、定义 Ingress 资源

创建 Ingress 资源来定义如何将外部流量路由到集群内的服务。这些资源指定了域名、URL 路径和后端服务之间的映射。
Ingress需要通过Ingressclass指定所属的Ingress Controller。

对于每个ingress资源的定义,都会被ingress 控制器通过API Server读取过来装换成自身的配置文件,载入到该进程之上。

基于demo.magedu.com主机名称空间default下的demoapp服务发布出去。

--rule=主机名/path=后端服务:端口
--class=ingressclass (kubectl get ingressclass)

kubectl create ingress demoapp --rule='demo.magedu.com/*'=demoapp:80 --class='nginx' -n default --dry-run=client -o yaml

posted @ 2024-09-12 09:22  *一炁化三清*  阅读(19)  评论(0编辑  收藏  举报