k8s ingress-controller处理流程及原理

“ 💋 戏 子. ✟ 发表于: 2023-02-01   最后更新时间: 2024-03-14 22:51:20  
{{totalSubscript}} 订阅, 1,770 游览

一、这都是什么

  • ingress:路由转发规则集合,k8s的默认资源。

  • service:提供服务对外暴露功能,模式有4种:ClusterIP(集群内部访问),Nodeport,Loadbalance,ExternalNAME(这三个可以对外提供服务)。

  • ingress-controller:实际规则转发工作者, ingress-controller并不是k8s的默认资源。

二、工作原理

  1. ingress-contronler通过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。

  2. 而这个ingress规则写明了哪个域名对应k8s集群中的哪个service,然后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。

  3. 然后再把该配置动态的写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,然后reload一下,使其配置生效。以此来达到域名分配置及动态更新的效果。

  4. 通过ingress-controller访问后端的请求是不走kube-proxy的代理的,也就是下图中的13不走kube-proxy,24还是走kube-proxy。

ingress-controller有很多种:Kubernetes-Ingress-ControllerNGINX Ingress ControllerKong IngressTraefikHAProxy Ingress等10多种,用那种需要结合自身实际需求去选择,无特殊场景一般用k8s-ingress-controller

三、访问流程图

在这里插入图片描述

说明:
1、<>里面代表资源类型,无此符号的部分是这个资源的名字
2、实线部分是实际访问流程,虚线部分是路由规则的维护

流程分解:

实线:

1、企业级应用场景最常用的方式就是用外层4层或7层负载来保证后端服务的可用性,如图是负载nginx这个ingress-controller的svc。
2、nginx-controller有自己的service,用的是nodeport模式对外暴露端口,关联后端ingress-controller。
3、ingress-controller拿到请求后转发给后端的service。
4、service通过标签选择器,找到后面对应的pod。

虚线:

5、ingress里面test.k8s.com这个域名的路由规则。
6、ingress的规则会通过k8s-apiserver对外提供查询。
7、ingress-controller查询k8s-apiserver拿到ingress路由规则,并更新在自己的配置文件里面。

四、配置实战

ingress-controller安装通过kuboard集成插件完成,这里不再赘述,网上文章也很多,可以参考kuboard安装ingress-controller:实战-使用-ingress-访问-web-应用

创建ingress+svc+deployment,并关联ingress-controller:

应用程序的yaml文件:

[root@k8s-master ingress]# vim app-nginx.yaml
apiVersion: apps/v1
kind: Deployment           ##资源类型deployment
metadata:
name: nginx-app            ##pod名称
namespace: test            ##名称空间
spec:
  replicas: 2              ##副本数
  selector:                
    matchLabels:           ##标签选择器
      app: nginx
  template:                ##以下是pod模板
    metadata:
      labels:
        app: nginx         ##给pod作标签
    spec:
      containers:
      - name: nginx        ##容器名称
        image: nginx:v1.20.0    ##镜像版本
        ports:
        - containerPort: 8090    ##容器端口

svc的yaml文件,主要是对外暴露应用端口:

[root@k8s-master ingress]# vim service-nginx.yaml
apiVersion: v1 
kind: Service
metadata:
  name: nginx-app-svc        ##svc名称
  namespace: test            ##名称空间
spec:
  type: ClusterIP            ##用clusterIP模式
  ports:
  - protocol: TCP
    port: 8090               ##svc暴露的端口
    targetPort: 80           ##关联容器端口
  selector:
    app: nginx               ##标签选择器,这里选择app:nginx的pod

ingress配置文件:

[root@k8s-master ingress]# vim ingress-app.yaml
apiVersion: extensions/v1beta1        ##k8s拓展接口及版本
kind: Ingress                         ##ingress资源类型
metadata:
  name: nginx-app-ingress             ##ingress名称
  namespace: test                     ##名称空间
  annotations:
spec:
  ingressClassName: nginx             ##这是最关键的一个配置,这个配置就是用来关联ingress-controller,这个值是ingress-controller的名称
  rules:                              ##ingress的路由规则从这开始
  - host: test.k8s.com                ##这里配置域名
    http:                             ##协议类型
      paths:                          ##位置信息
      - path: /                       ##域名的根目录
        backend:                      ##关联后端信息
          serviceName: nginx-app-svc  ##关联的svc的名字
          servicePort: 80             ##关联的svc的端口

应用:

[root@k8s-master ingress]# kubectl apply -f app-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f service-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f ingress-app.yaml

查看ingress-controller的配置是否更新:

在这里插入图片描述

访问测试,先拿到ingress-controller的service暴露在服务器的端口,这里能看到:http是30215,https是32740

[root@k8s-master ingress]# kubectl get svc -n ingress-nginx
NAME                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller-admission-nginx   ClusterIP   10.111.48.12     <none>        443/TCP                      24h
ingress-nginx-controller-nginx             NodePort    10.107.204.218   <none>        80:30215/TCP,443:32740/TCP   24h

修改本机host,通过浏览器访问测试

192.168.XXX.XXX  test.k8s.com

在这里插入图片描述

如有误,请各位大佬指正

原创不易,求赞

更新于 2024-03-14

查看shares更多相关的文章或提一个关于shares的问题,也可以与我们一起分享文章