kubernetes-ingress介绍、IngressNginx部署

1,961 阅读4分钟

Kubernetes集群的流量管理

image.png

Service --东西向流量

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

Ingress --南北流量

Ingress API

声明式的API

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

Ingress Controller共同组成

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

  • Ingress Controller非为内置的控制器,需要额外部署
  • 通常以Pod形式运行于Kubernetes集群之上
  • 一般应该由专用的LB Service负责为其接入集群外部流量

Kubernetes上的标准API资源类型之一

  • 仅定义了抽象路由配置信息,只是元数据,需要由相应的控制器动态加载
  • 依赖的控制器(七层反代 负载均衡), 没有被controller 内置, 需要自定部署

Ingress Controller --外置安装的控制器

七层负载均衡反代 需要以pod的形式部署运行在k8s集群

  • 反向代理服务程序,需要监视API Server上Ingress资源的变动,并将其反映至自身的配置文件中
  • Kubernetes的非内置的控制器,需要额外选择部署
    • 实现方案有很多,包括Ingress-Nginx、HAProxy、Traefik、Gloo、Contour和Kong等
    • Kubernetes支持同时部署二个或以上的数量的Ingress Controller
    • Ingress资源配置可通过特定的annotation或spec中嵌套专有的字段指明期望加载该资源的Ingress Controller
      • 专用的annotation:kubernetes.io/ingress.class
      • v1.18版本起,Ingress资源配置中增添了新字段:ingressClassName,引用的IngressClass是一种特定的资源类型

Ingress Nginx的作用

  • 去监听apiserver 创建的ingeress新资源
  • 然后将流量转发规则 动态转换为nginx格式的配置
  • 然后重新热加载nginx配置文件

Ingress流量转发

Ingress需要借助于Service资源来发现后端端点

注意: Ingress Controller会基于Ingress的定义将流量直接发往其相关Service的后端端点,该转发过程并不会再经由Service进行

image.png

client --->Ingress Controller svc --> Ingress Controller pod ---> 直达 pods

pods 依然会创建 service 但是负载均衡功能没了 但是 会用到服务发现功能

部署 Ingress Nginx

以Kubernetes社区维护的Ingress-Nginx为例

以v1.5.1版为例

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

image.png

controller部署成功 image.png

Ingress资源类型一:Simple fanout 简单扇出

在同一个FQDN下通过不同的URI完成不同应用间的流量分发

  • 基于单个虚拟主机接收多个应用的流量
  • 常用于将流量分发至同一个应用下的多个不同子应用
  • 同一个应用内的流量由调度算法分发至该应用的各后端端点
  • 不需要为每个应用配置专用的域名

image.png

Ingress资源类型二: Name based virtual hosting --基于虚拟主机

为每个应用使用一个专有的主机名,并基于这些名称完成不同应用间的流量转发

  • 每个FQDN对应于Ingress Controller上的一个虚拟主机的定义
  • 同一组内的应用的流量,由Ingress Controller根据调度算法完成请求调度

image.png

Ingress资源类型三: TLS

Ingress也可以提供TLS支持,但仅限于443/TCP端口

  • 若TLS配置部分指定了不同的主机,则它们会根据通过SNI TLS扩展指定的主机名
    • 前提:Ingress控制器支持SNI在同一端口上复用
  • TLS Secret必须包含名为tls.crt和 的密钥tls.key,它们分别含有TLS的证书和私钥

image.png

Ingress 配置示例

命令式命令

创建Ingress的命令:

kubectl create ingress NAME --rule=host/path=service:port[,tls[=secret]] 

常用选项
--annotation=[]:提供注解,格式为“annotation=value” 
--rule=[]:代理规则,格式为“host/path=service:port[,tls=secretname]” 
--class=‘’:该Ingress适配的Ingress Class

准备环境:两个Service(demoapp10和demoapp11)

部署demoapp v1.0

kubectl create deployment demoapp10 --image=ikubernetes/demoapp:v1.0 --replicas=3 
kubectl create service clusterip demoapp10 --tcp=80:80 

部署demoapp v1.1

kubectl create deployment demoapp11 --image=ikubernetes/demoapp:v1.1 --replicas=2 
kubectl create service clusterip demoapp11 --tcp=80:80