k8s之七层接入层代理Ingree-Controller
四层负载和七层负载的区别:
区别:
1)四层负载:四层的负载均衡就是基于IP+端口的负载均衡:在三层负载均衡的基础上,通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
2)七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡:在四层负载均衡的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。
3)四层负载均衡工作在传输层,七层负载均衡工作在应用层
2. Ingress介绍
Ingress官网定义:Ingress可以把进入到集群内部的请求转发到集群中的一些服务上,从而可以把服务映射到集群外部。Ingress 能把集群内Service 配置成外网能够访问的 URL,流量负载均衡,提供基于域名访问的虚拟主机等。
Ingress简单的理解就是你原来需要改Nginx配置,然后配置各种域名对应哪个 Service,现在把这个动作抽象出来,变成一个 Ingress 对象,你可以用 yaml 创建,每次不要去改Nginx 了,直接改yaml然后创建/更新就行了;那么问题来了:”Nginx 该怎么处理?”
Ingress总结:ingress是k8s中的资源,主要是管理ingress-controller这个代理的配置文件
Ingress Controller 这东西就是解决 “Nginx 的处理方式” 的;Ingress Controller 通过与 Kubernetes API 交互,动态的去感知集群中Ingress规则变化,然后读取他,按照他自己模板生成一段 Nginx 配置,再写到 Nginx Pod 里,最后 reload 一下
https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
3.Ingress Controller介绍
Ingress Controller是一个七层负载均衡调度器,客户端的请求先到达这个七层负载均衡调度器,由七层负载均衡器在反向代理到后端pod,常见的七层负载均衡器有nginx、traefik,以我们熟悉的nginx为例,假如请求到达nginx,会通过upstream反向代理到后端pod应用,但是后端pod的ip地址是一直在变化的,因此在后端pod前需要加一个service,这个service只是起到分组的作用,那么我们upstream只需要填写service地址即可。
https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/
4.Ingress和Ingress Controller总结
Ingress Controller
Ingress Controller结合Ingress 定义的规则生成配置,然后动态更新ingress-controller里的Nginx 或者trafik负载均衡器,并刷新使配置生效,来达到服务自动发现的作用。
Ingress 则是定义规则,通过它定义某个域名的请求过来之后转发到集群中指定的 Service。它可以通过 Yaml 文件定义,可以给一个或多个 Service 定义一个或多个 Ingress 规则。
5. 使用Ingress Controller代理k8s内部pod的流程
(1)部署Ingress controller,我们ingress controller使用的是nginx
(2)创建Pod应用,可以通过控制器创建pod
(3)创建Service,用来分组pod
(4)创建Ingress http,测试通过http访问应用
(5)创建Ingress https,测试通过https访问应用
客户端通过七层调度器访问后端pod的方式
6、Ingress-controller高可用
Ingress Controller是集群流量的接入层,对它做高可用非常重要,可以基于keepalive实现nginx-ingress-controller高可用,具体实现如下:
Ingress-controller根据Deployment+ nodeSeletor+pod反亲和性方式部署在k8s指定的两个work节点,nginx-ingress-controller这个pod共享宿主机ip,然后通过keepalive+nginx实现nginx-ingress-controller高可用
参考:https://github.com/kubernetes/ingress-nginx
https://github.com/kubernetes/ingress-nginx/tree/main/deploy/static/provider/baremetal
部署文件:https://github.com/ruidongchenxi/k8s-ack/blob/main/ingress-deploy.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@k8s-master k8s-ckq] # kubectl apply -f ingress-deploy.yaml namespace /ingress-nginx created serviceaccount /ingress-nginx created configmap /ingress-nginx-controller created clusterrole.rbac.authorization.k8s.io /ingress-nginx created clusterrolebinding.rbac.authorization.k8s.io /ingress-nginx created role.rbac.authorization.k8s.io /ingress-nginx created rolebinding.rbac.authorization.k8s.io /ingress-nginx created service /ingress-nginx-controller-admission created service /ingress-nginx-controller created deployment.apps /ingress-nginx-controller created ingressclass.networking.k8s.io /nginx created validatingwebhookconfiguration.admissionregistration.k8s.io /ingress-nginx-admission created serviceaccount /ingress-nginx-admission created clusterrole.rbac.authorization.k8s.io /ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io /ingress-nginx-admission created role.rbac.authorization.k8s.io /ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io /ingress-nginx-admission created job.batch /ingress-nginx-admission-create created job.batch /ingress-nginx-admission-patch created |
查看pod
1 2 3 4 5 6 | [root@k8s-master k8s-ckq] # kubectl get pod -n ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-czm9b 0 /1 Completed 0 81s ingress-nginx-admission-patch-5lscf 0 /1 Completed 1 81s ingress-nginx-controller-64bdc78c96-7hqh6 1 /1 Running 0 81s ingress-nginx-controller-64bdc78c96-zv7x7 1 /1 Running 0 81s |
报错如下:
1 | # kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission |
高可用实现
1 | yum install epel-release nginx keepalived nginx-mod-stream -y |
nginx 配置
http 协议代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | [root@k8s-master ingress] # cat ingress-dame.yaml apiVersion: v1 kind: Service metadata: name: tomcat namespace: default spec: selector: app: tomcat release: canary ports: - name: http targetPort: 8080 port: 8080 - name: ajp targetPort: 8009 port: 8009 --- apiVersion: apps /v1 kind: Deployment metadata: name: tomcat-deploy namespace: default spec: replicas: 2 selector: matchLabels: app: tomcat release: canary template: metadata: labels: app: tomcat release: canary spec: containers: - name: tomcat image: tomcat:8.5.34-jre8-alpine imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 name: ajp containerPort: 8009 [root@k8s-master ingress] # kubectl apply -f ingress-dame.yaml service /tomcat created deployment.apps /tomcat-deploy created [root@k8s-master ingress] # vim ingress-1.yaml apiVersion: networking.k8s.io /v1 kind: Ingress metadata: name: ingress-myapp namespace: default spec: ingressClassName: nginx rules: - host: tomcat.lucky.com # 域名 http: # paths : - backend: # service: name: tomcat port: number: 8080 path: / pathType: Prefix [root@k8s-master ingress] # kubectl apply -f ingress-1.yaml ingress.networking.k8s.io /ingress-myapp created |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?