k8s-Ingress
• Ingress为弥补NodePort不足而生
• Pod与Ingress的关系
• Ingress Controller
• Ingress 规则配置
Ingress 为弥补NodePort不足而生
NodePort存在的不足:
- 一个端口只能一个服务使用,端口需提前规划
- 只支持4层负载均衡
Ingress是什么
Ingress:Ingress公开了从集群外部到集群内服务的http和https路由的规则集合,而具体实现流量路由则是由Ingress Controller负责。
Ingress:k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法。
Ingress Controller:根据Ingress生成具体的路由规则,并对pod负载均衡。
Ingress Controller
Ingress管理的负载均衡器,为集群提供全局的负载均衡能力。
使用流程:
- 部署Ingress Controller
- 创建Ingress 规则
Ingress Controller部署方式Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。
项目地址:https://github.com/kubernetes/ingress-nginx 下载YAML:wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml (课件中名称是ingress-controller.yaml) 修改YAML: • 镜像地址修改成国内的:lizhenliang/nginx-ingress-controller:0.30.0 • 将Ingress Controller暴露,一般使用宿主机网络(hostNetwork: true)或者使用NodePort
配置文件修改的位置
Controller 和 admissionWebhook,的镜像地址,需要将公网镜像同步至公司内网镜a像仓库
hostNetwork 设置为 truee
cdnsPolicy设置为ClusterFirstWithHostNete
NodeSelector添加ingress:"true"部署至指定节点
类型更改为 kind: DaemonSete
其他控制器:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/ nodePort的部署是在每个节点上开辟nodePort的端口,将流量引入进来,而后通过iptables首先转发到ingress-controller容器中,而后由nginx根据ingress的规则进行判断,将其转发到对应的应用web容器中。因此采用nodePort部署较为简单。 hostNetwork模式不再需要创建一个nodePort的svc,而是直接在每个节点都创建一个ingress-controller的容器,而且将该容器的网络模式设为hostNetwork。就是说每个节点物理机的80和443端口将会被ingress-controller中的nginx容器占用。当流量通过80/443端口进入时,将直接进入到nginx中。而后nginx根据ingress规则再将流量转发到对应的web应用容器中。 Ingress 参考资料: https://www.cnblogs.com/zhrx/p/15923445.html https://blog.51cto.com/u_15155081/2720752 两种部署方式的比较: https://www.cnblogs.com/xuxinkun/p/11052646.html
两种部署方式的比较
相比起来,nodeport部署模式中需要部署的ingress-controller容器较少。一个集群可以部署几个就可以了。而hostNetwork模式需要在每个节点部署一个ingress-controller容器,因此总起来消耗资源较多。另外一个比较直观的区别,nodeport模式主要占用的是svc的nodePort端口。而hostNetwork则需要占用物理机的80和443端口。 从网络流转来说,通过nodePort访问时,该node节点不一定部署了ingress-controller容器。因此需要iptables将其转发到部署有ingress-controller的节点上去,多了一层流转。 通过nodeport访问时,nginx接收到的http请求中的source ip 将会被转换为接收请求的node节点的ip,而非真正的client端ip。 而使用hostNetwork的方式,ingress-controller将会使用的是物理机的DNS域名解析(即物理机的/etc/resolv.conf)。而无法使用内部的比如coredns的域名解析。 因此具体使用哪种部署方式,需要根据实际情况和需求进行选择
Ingress 规则配置
创建:
kubectl apply -f xxx.yaml
查看:
kubectl get ingress
测试:本地电脑绑定hosts记录对应ingress里面配置的域名
例:<Ingress Controller Pod所在Node IP> web.aliangedu.cn
[root@k8s-master1 k8s-work]# cat ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: aliangedu spec: rules: - host: web.aliangedu.cn http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80 [root@k8s-master1 k8s-work]# kubectl get pod -n ingress-nginx NAME READY STATUS RESTARTS AGE nginx-ingress-controller-qzzz5 1/1 Running 2 19h [root@k8s-master1 k8s-work]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE aliangedu <none> web.aliangedu.cn 80 19h 在host文件中配置相应域名节点的ip和域名访问 [root@k8s-master1 k8s-work]# kubectl get ep NAME ENDPOINTS AGE kubernetes 192.168.31.71:6443 2d8h nginx 10.244.36.91:80 2d8h web 10.244.36.92:8080 28h
ingress自定义配置
--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress annotations: kubernetes.io/ingress.class: "nginx" ##指定Ingress Controller的类型 nginx.ingress.kubernetes.io/use-regex: "true" ##指定后面rules定义的path可以使用正则表达式 nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" ##连接超时时间,默认为5s nginx.ingress.kubernetes.io/proxy-send-timeout: "600" ##后端服务器回转数据超时时间,默认为60s nginx.ingress.kubernetes.io/proxy-read-timeout: "600" ##后端服务器响应超时时间,默认为60s nginx.ingress.kubernetes.io/proxy-body-size: "50m" ##客户端上传文件,最大大小,默认为20m #nginx.ingress.kubernetes.io/rewrite-target: / ##URL重写 nginx.ingress.kubernetes.io/app-root: /index.html spec: rules: #路由规则 - host: web.yangpengcheng.com ##客户端访问的host域名 http: paths: - path: / pathType: Prefix backend: service: name: web-nginx #转发至哪个service port: number: 80 #转发至service的端口号
Ingress的配置技巧
Ingress策略可以按多种方式进行配置,下面对几种常见的ingress转发策略进行说明: 1、转发到单个后端服务上 基于这种设置,客户端到ingress Controller的访问请求都将被转化到后端的唯一service上,这种情况下Ingress无须定义任何rule。 如下:对Ingress Controller 的访问请求都将被转到myweb:8080这个服务上。 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tomcat-web-ingress spec: backend: service: name: web-tomcat #转发至哪个service port: number: 8080 #转发至service的端口号 2.同一域名下,不同的URL路径被转发到不同的服务上 这种配置常用于一个网站通过不同的路径提供不同的服务的场景,例如/web表示访问web页面,api表示访问API接口,对应到后端的两个服务,通过Ingress的设置很容易就能将基于URL路径的转发规则定义出来。 如下:对my.nginx.test/web的 访问请求将被转发到web-service:80服务上,对my.nginx.test/api的访问请求将被转发到api-service:8080服务上。 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-test annotations: kubernetes.io/ingress.class: nginx spec: rules: - host: my-nginx.test.com http: paths: - path: /web backend: serviceName: web-service servicePort: 80 - path: /api backend: serviceName: api-service servicePort: 8080 3.不同的域名转发到不同的服务上 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-web namespace: Ingress-nginx-test spec: rules: - host: my-nginx1.test.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-app1-svc port: number: 80 - host: my-nginx2.test.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-app2-svc port: number: 80 4.不使用域名的转发规则 这种配置用于一个网站不使用域名直接提供服务的场景,此时通过任意一台运行ingress-control的node都能访问到后端的服务 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-web namespace: Ingress-nginx-test annotations: ingress.kubernetes.io/ssl-redirect: "false" spec: rules: - host: my-nginx1.test.com http: paths: - path: /demo pathType: Prefix backend: servicename: webapp-svc servicePort: 8080 注意:使用无域名的Ingress转发规则时,将默认禁用非安全HTTP,强制启用https。例如,当使用nginx作为Ingress Controller时, 其配置文件/etc/nginx/nginx.conf中将会自动设置下面的规则,将全部http的访问请求直接返回301错误。 可以在Ingress的定义中设置一个annotation "ingress.kubernetes.io/ssl-redirect=false"来关闭强制启用HTTPS的设置。
Ingress 规则配置:https
配置HTTPS步骤:
1.准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发) 解压: cfssl.tar.gz [root@k8s-master1 ssl]# cp cfssl /usr/bin/ [root@k8s-master1 ssl]# cp cfssl-certinfo /usr/bin/ [root@k8s-master1 ssl]# cp cfssljson /usr/bin/ 生成证书: bash certs.sh 2.将证书文件保存到Secret kubectl create secret tls web-aliangedu-cn --cert=web.aliangedu.cn.pem --key=web.aliangedu.cn-key.pem [root@k8s-master1 k8s-work]# kubectl get secret 3、Ingress规则配置tls [root@k8s-master1 k8s-work]# cat ingress-https.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: aliangedu-https spec: tls: - hosts: - web.aliangedu.cn secretName: web-aliangedu-cn rules: - host: web.aliangedu.cn http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80 查看创建的https域名: [root@k8s-master1 k8s-work]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE aliangedu <none> web.aliangedu.cn 80 19h aliangedu-https <none> web.aliangedu.cn 80, 443 16m 然后浏览器登录验证:https://web.aliangedu.cn 小结: Ingress Controller怎么工作的? root@k8s-master1 ssl]# kubectl get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE nginx-ingress-controller-qzzz5 1/1 Running 2 19h [root@k8s-master1 ssl]# kubectl exec -it nginx-ingress-controller-qzzz5 -n ingress-nginx -- bash bash-5.0$ ps -ef PID USER TIME COMMAND 1 www-data 0:00 /usr/bin/dumb-init -- /nginx-ingress-controller --configmap=ingress-nginx/nginx-co 7 www-data 3:42 /nginx-ingress-controller --configmap=ingress-nginx/nginx-configuration --tcp-serv 26 www-data 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
Ingress Controlle 怎么工作的
Ingress Controller 通过与kubernetes API 交互,动态的去感知集群中Ingress 规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个Service,生成一段Nginx配置,应用管理的Nginx服务,然后热加载生效。以此来达到nginx负载均衡器配置及动态更新的问题。
流程:客户端--->负责均衡器---> Ingress Controller(nginx) ----->分布在各个节点pod
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」