Ingress-nginx+内部LB(nginx)实现业务负载均衡

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ingress-nginx+内部LB(nginx)实现业务负载均衡相关的知识,希望对你有一定的参考价值。

注:本文使用k8s社区版ingress-nginx实现,涉及知识点:pod、pv、pvc、deployment、service、ingress、ingress-controller、nginx(loadbalance) 一. ingress介绍 1. ingress-nginx的kubernetes社区官网:  https://kubernetes.github.io/ingress-nginx/deploy/   2. ingress功能: 将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可。 3. ingress具体的工作原理如下:  3.1:ingress contronler通过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。  3.2:而这个ingress规则写明了哪个域名对应k8s集群中的哪个service,然后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。  3.3:然后再把该配置动态的写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,然后reload一下,使其配置生效,以此来达到域名分配置及动态更新的效果。 4. ingress可以解决的问题 1)动态配置服务 如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作。

2)减少不必要的端口暴露 配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式。 5. ingress-nginx-controller功能: 将新加入的Ingress转化成Nginx的配置文件并使之生效 二. ingress-nginx安装

  1. 打开社区官网并定位至bare-metal
  2. 执行如下命令下载deploy.yaml文件  wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/baremetal/deploy.yaml  2.1 修改deployment中replicas数量为2,另在spec中添加hostNetwork: true字段,添加此字段是为了暴露node的80和443端口,外部用户将通过node ip + 80/443端口方式访问集群内部服务。  2.2 查看deploy.yaml文件中需求的镜像版本  2.3 在阿里云或者其他镜像仓库查找对应镜像并下载 下载nginx-ingress-controller镜像: docker pull registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.5.1 下载kube-webhook-certgen镜像: docker pull registry.aliyuncs.com/google_containers/kube-webhook-certgen:v20220916-gd32f8c343  2.4 打包镜像并分别导入两个node节点中(这里有进行镜像重命名) 重命名镜像: docker tag registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.5.1 nginx-ingress-controller:v1.5.1 docker tag registry.aliyuncs.com/google_containers/kube-webhook-certgen:v20220916-gd32f8c343 kube-webhook-certgen:v20220916 打包镜像: docker save -o nginx-ingress-controller.tar nginx-ingress-controller:v1.5.1 docker save -o kube-webhook-certgen.tar kube-webhook-certgen:v20220916 在两个节点中分别加载镜像: docker load -i nginx-ingress-controller.tar docker load -i kube-webhook-certgen.tar
  3. 执行deploy.yaml文件进行安装  kubectl create -f deploy.yaml  执行完毕后查看pod ingress-nginx-controller的状态 三. 实验
  4. 实验架构 说明: 1.1 客户端访问业务域名,由DNS解析至LB ip(实验环境使用hosts解析代替DNS) 1.2 LB使用nginx实现,负责将请求转发至后端node 1.3 node接收到请求后,通过ipvs将流量转发到ingress-nginx-controller pod,然后由ingress-nginx-controller中的规则将流程分发到service对应的后端业务pod(即endpoint)。
  5. 实验步骤 2.1 创建pv卷,用于存储业务数据。 2.2 创建pvc,绑定上一步创建的pv 2.3 创建deployment 2.4 创建service 执行如下命令在两个node节点的/tmp/lab目录添加index.html文件 [root@k-node01 lab]# touch index.html && echo "test12345" > index.html 然后测试svc是否ok 2.5 创建ingress ingress创建后需等半分钟左右,待ingress-nginx-controller检测到新创建的ingress并将新ingress规则添加至其中。 2.6 在LB中添加规则,将外部请求转发至后端node 其中,upstream字段中server对应的即为两个后端node的ip location字段中必须要添加 proxy_set_header Host $http_host; 表示http头还是使用客户端请求的,不进行替换,不然ingress无法识别请求的url。 2.7 在hosts文件中添加解析记录 2.8 打开浏览器,输入www.nginx-lab.com进行测试,如下图,表示成功

相关参考: https://blog.csdn.net/weixin_44729138/article/details/105978555

以上是关于Ingress-nginx+内部LB(nginx)实现业务负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

双栈 部署ingress-nginx

双栈 部署ingress-nginx

ingress-nginx 保姆级别源码阅读

ingress-nginx部署

ingress高可用--使用DaemonSet方式部署ingress-nginx

K8s之Ingress-nginx原理及配置