ingress 会跳过 kube-proxy 直接代理到pod 上面

安装k8s desktop

git clone https://github.moeyy.xyz/https://github.com/AliyunContainerService/k8s-for-docker-desktop
cd k8s-for-docker-desktop
sh load_images.sh

kubectl env

open -e ~/.bash_profile
export PATH="/Applications/Docker.app/Contents/Resources/bin:$PATH"
source -e ~/.bash_profile

通过LoadBalancer 暴露服务

kubectl expose deployment my-deployment --type=LoadBalancer --port=80

为什么需要ingress

如果我们只是需要 四层代理
 *  k8s 对外提供服务,只能通过cluterIP、nodeport、extranName、loadbalance等方式
*  serivce 的 cluterIP 是一个域名将一组 pod 通过Endpoints 关联起来作为一个完整服务
*  通过 kube-porxy 从将coredns中获取cluterIP的Endpoints,然后将Iptable/ipvps 规则写入宿主机实现kube-porxy路由转发功能
kube-porxy 优化
*  v1.41默认使用 iptables代理 、之后使用ipvps 做proxy 通过kube-porxy  

缺点只能IP、port 转发

* 提供了 headerless  servcie  实现转发指定pod 但是会失去负载均衡和DNS解析
  • 因此 默认cluterIP直接对应到pod ip port
  • 不经过kube-porxy core 的负债均衡也是失效
七层应用层代理 ingress
* 可以直接 通过nginx 负载到 pod 实现流量的精细控制
* /api/  路由到一个指定的service 或者pod
*  四层代理无法做到这一点

ingress 是如何直接跳过kube-proxy

  • ingress Controller借助service的服务发现机制,实现配置的动态更新以实现Pod的负载均衡机制实现
  • 客户端请求发出后 ingress Controller 根据 Ingress 规则确定要将请求转发到哪个 Service 上
  • Ingress Controller 会查询 Kubernetes 的 API 服务器,获取与该 Service 相关联的 Endpoints的 Pod 的IP地址列表

主流的Ingress Controller

  • 传统的七层负载均衡如Nginx,HAproxy,

  • 优点: 成熟,高性能

  • 缺点: 动态更新需reload配置文件

  • 新型微服务负载均衡如Traefik,Envoy,Istio

    • 优点: 专门适用于微服务+容器化应用场景、动态更新
    • 缺点: 性能还有待提升
  • 使用nginx + lua 可以高性能又可以动态更新 例如 kong、openresty、apisix

Ingress Controller 存在方式

  • ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序

Ingress Controller 工作原理

  • 监听API Server,获取全部Ingress的定义
  • 基于Ingress的定义,生成Nginx所需的配置文件/etc/nginx/nginx.conf
  • 执行nginx -s reload命令,重新加载nginx.conf配置文件的内容
posted @ 2024-04-25 17:21  vx_guanchaoguo0  阅读(35)  评论(0编辑  收藏  举报