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

随笔2个月前发布 佳谷
32 0 0

安装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配置文件的内容

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...