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管理的负载均衡器,为集群提供全局的负载均衡能力。

使用流程:

  1. 部署Ingress Controller
  2. 创建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

 

 

posted @   逆风飞翔的博客  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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 热点速览」
点击右上角即可分享
微信分享提示