• 【云原生】Kubernetes----轻量级的现代HTTP反向代理和负载均衡器之Traefik


    目录

    引言

    一、Traefik基本概念

    (一)什么是Ingress

    (二)什么是Traefik

    (三)Traefik和Nginx的区别

    1.设计目标

    2.配置语言

    3.容器支持

    4.功能特性

    二、安装部署Traefik

    (一)获取文件

    (二)创建管理用户

    1.查看文件

    2.启用RBAC

    (三)创建Daemonset

    1.查看文件

    2.创建资源

    (四)创建UI界面

    1.查看文件

    2.创建资源

    三、创建访问资源

    (一)创建deployment

    (二)创建service

    (三)创建ingress规则


    引言

    在今天的云原生和微服务架构中,反向代理和负载均衡器扮演着至关重要的角色。它们不仅负责处理外部请求并将其路由到正确的服务,而且还提供了诸如SSL终止、负载均衡、请求重写和身份验证等关键功能。在这篇文章中,我们将深入探索Traefik,一个功能强大且轻量级的现代HTTP反向代理和负载均衡器

    一、Traefik基本概念

    (一)什么是Ingress

    Ingress其实就是从 kuberenets 集群外部访问集群的一个入口,将外部的请求转发到集群内不同的 Service 上,其实就相当于 nginx、haproxy 等负载均衡代理服务器,有的人可能觉得我们直接使用 nginx 就实现了,但是只使用nginx这种方式有很大缺陷,每次有新服务加入的时候怎么改 Nginx 配置?不可能让我们去手动更改或者滚动更新前端的 Nginx Pod 吧?那我们再加上一个服务发现的工具比如 consul如何?貌似是可以,对吧?而且在之前单独使用 docker 的时候,这种方式已经使用得很普遍了,Ingress 实际上就是这样实现的,只是服务发现的功能自己实现了,不需要使用第三方的服务了,然后再加上一个域名规则定义,路由信息的刷新需要一个靠Ingress controller 来提供。
    Ingress controller 可以理解为一个监听器,通过不断地与 kube-apiserver 打交道,实时的感知后端 service、pod 的变化,当得到这些变化信息后,Ingress controller 再结合 Ingress 的配置,更新反向代理负载均衡器,达到服务发现的作用。其实这点和服务发现工具 consul consul-template 非常类似。

    现在可以供大家使用的 Ingress controller 有很多,比如 traefik、nginx-controller、KubernetesIngress Controller for Kong、HAProxy,Ingress controller,当然你也可以自己实现一个 IngressController,现在普遍用得较多的是 traefik 和 nginx-controller

    traefik 的性能较 nginx-controller差,但是配置使用要简单许多,如果你的环境主要是容器化的,且需要自动服务发现、动态路由和自动SSL证书管理等特性,Traefik可能更适合。如果你更注重性能、稳定性,或者在传统的Web服务器场景下使用,Nginx可能是更好的选择。

    (二)什么是Traefik

    Traefik 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持Docker、Swarm、Mesos/Marathon、Mesos、Kubernetes、Consu、Etcd、Zookeeper、BoltDB、Rest API等等后端模型。

    1.在NodePort模式下,客户端通过主机名、URL等方式,访问宿主机绑定的随机端口

    2.根据随机端口确定访问的是HTTP还是HTTPS

    3.Traefik组件会匹配ingress规则,然后代理到后端服务

    (三)Traefik和Nginx的区别

    Traefik和Nginx都是常见的反向代理服务器,用于在网络中路由和负载均衡请求。它们在设计和功能上有一些区别,下面是它们之间的对比:

    1.设计目标

    - Traefik的设计目标是为容器化环境提供动态路由和负载均衡。它在支持Docker、Kubernetes等容器编排平台方面表现出色,并且具有自动发现和配置的能力。
    - Nginx的设计目标是作为通用的高性能Web服务器和反向代理。它在传统的服务器环境中广泛使用,可以处理静态和动态内容,并提供丰富的功能和模块化的架构。

    2.配置语言

    - Traefik使用声明性的配置文件格式,支持多种后端和路由规则的定义。它还提供了REST API和动态配置的能力,可以与现代的容器编排工具集成。
    - Nginx使用基于文件的配置语言,具有灵活的配置选项和强大的模块化系统。它的配置通常需要手动编辑配置文件,并在需要时重新加载。

    3.容器支持

    - Traefik是为容器化环境而设计的,可以自动检测和配置与容器相关的路由和负载均衡规则。它可以与Docker、Kubernetes等容器编排平台紧密集成,并提供简化的配置和部署体验。
    - Nginx也可以在容器环境中使用,但需要手动配置并与容器编排工具进行集成。它通常被用作独立的反向代理服务器,而不是与容器平台紧密集成。

    4.功能特性

    - Traefik在容器环境中具有自动服务发现和负载均衡的能力。它支持HTTP/2、WebSocket、Let's Encrypt等功能,并提供了丰富的插件生态系统。
    - Nginx具有强大的性能和灵活的配置选项。它支持高并发、反向代理、负载均衡、缓存、SSL/TLS等功能,并具有丰富的第三方模块和社区支持。

    二、安装部署Traefik

    (一)获取文件

    官方下载地址
    wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-rbac.yaml
    wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-deployment.yaml
    wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-ds.yaml
    wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/ui.yaml

    国内的 gitee下载地址
    wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-deployment.yaml
    wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-rbac.yaml
    wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-ds.yaml
    wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/ui.yaml

    1. [root@master01 traefik]#ls
    2. traefik-deployment.yaml traefik-ds.yaml traefik-rbac.yaml ui.yaml
    3. -------------------------------------------------------------------------
    4. #traefik-deployment.yaml:以deployment的方式创建traefik的yaml文件
    5. #traefik-ds.yaml:以daemonset的方式创建traefik的yaml文件
    6. #traefik-rbac.yaml:用于创建用户及授权绑定的yaml文件
    7. #ui.yaml:用于创建提供web ui访问的页面的yaml文件

    (二)创建管理用户

    将traefik-deployment.yaml文件中的创建ServiceAccount字段的信息,删除并复制到traefik-rbac.yaml文件当中

    1. [root@master01 traefik]#cat traefik-deployment.yaml
    2. ---
    3. apiVersion: v1
    4. kind: ServiceAccount
    5. metadata:
    6. name: traefik-ingress-controller
    7. namespace: kube-system
    8. ......

    由于该字段是属于创建用户、创建权限,及绑定阶段的操作,为便于区分,给大家梳理一下,当然也可以不用移动,按照官方规定的格式执行文件,以下列顺序执行

    //启用RBAC认证
    kubectl apply -f traefik-rbac.yaml

    //部署 Traefik 到 Kubernetes 集群,为外部访问创建 NodePorts
    kubectl apply -f traefik-deployment.yaml

    //部署 Traefik Web UI
    kubectl apply -f ui.yaml

    1.查看文件

    1. [root@master01 traefik]#vim traefik-rbac.yaml 
    2. [root@master01 traefik]#cat traefik-rbac.yaml 
    3. #创建用户
    4. apiVersion: v1
    5. kind: ServiceAccount #指定创建资源类型为用户
    6. metadata:
    7.   name: traefik-ingress-controller #用户名称
    8.   namespace: kube-system #指定命名空间
    9. ---
    10. kind: ClusterRole #定义一个集群级别的角色
    11. apiVersion: rbac.authorization.k8s.io/v1beta1
    12. metadata:
    13.   name: traefik-ingress-controller #ClusterRole的名称
    14. rules:
    15.   - apiGroups: #定义第一个规则组
    16.       - "" #表示核心API组,如PodsServicesEndpoints等核心资源
    17.     resources: #指定对哪些资源设置权限
    18.       - services #service资源
    19.       - endpoints #endpoint信息
    20.       - secrets #secrets资源
    21.     verbs:
    22.       - get #添加获取权限
    23.       - list #添加获取列表权限
    24.       - watch #添加监听权限
    25.   - apiGroups: #定义第二个规则组
    26.       - extensions #extensions组包含了如IngressesDeployments等扩展资源
    27.     resources: #指定对哪些资源设置权限
    28.       - ingresses #ingress资源
    29.     verbs:
    30.       - get #添加获取权限
    31.       - list #添加获取列表权限
    32.       - watch #添加监听权限
    33.   - apiGroups: #定义第三个规则组
    34.     - extensions #
    35.     resources: #指定对哪些资源设置权限
    36.     - ingresses/status #ingress的状态资源
    37.     verbs: #
    38.     - update #更新Ingress资源的status字段
    39. ---
    40. #用户与集群角色绑定
    41. kind: ClusterRoleBinding
    42. apiVersion: rbac.authorization.k8s.io/v1beta1
    43. metadata:
    44.   name: traefik-ingress-controller
    45. roleRef:
    46.   apiGroup: rbac.authorization.k8s.io #指定绑定
    47.   kind: ClusterRole #指定绑定的类型为集群角色
    48.   name: traefik-ingress-controller #指定集群角色名称
    49. subjects:
    50. - kind: ServiceAccount #指定绑定类型为用户
    51.   name: traefik-ingress-controller #指定绑定的用户名称
    52.   namespace: kube-system #指定所在命名空间
    53. #一个ClusterRole可以与多个ServiceAccount绑定

    2.启用RBAC

    (三)创建Daemonset

    1.查看文件

    1. [root@master01 traefik]#cat traefik-ds.yaml
    2. kind: DaemonSet
    3. apiVersion: apps/v1
    4. metadata:
    5. name: traefik-ingress-controller
    6. namespace: kube-system
    7. labels:
    8. k8s-app: traefik-ingress-lb #设置标签
    9. spec:
    10. selector:
    11. matchLabels:
    12. k8s-app: traefik-ingress-lb
    13. name: traefik-ingress-lb
    14. #用于匹配与这个DaemonSet关联的 Pods。只有当Pods的标签与这里定义的matchLabels匹配时,才会被视为这个DaemonSet的一部分。
    15. template:
    16. metadata:
    17. labels: #定义pod标签
    18. k8s-app: traefik-ingress-lb
    19. name: traefik-ingress-lb
    20. spec:
    21. serviceAccountName: traefik-ingress-controller
    22. #指定了Pods运行时要使用的ServiceAccount的名称,为上一步创建并已经授权的用户账户
    23. terminationGracePeriodSeconds: 60 #定义了Pod终止前等待的时间
    24. containers:
    25. - image: traefik:v1.7 #定义版本为1.7,也可以自定义版本
    26. name: traefik-ingress-lb
    27. ports: #定义了容器监听的端口以及是否映射到宿主机的端口
    28. - name: http #端口的名称。
    29. containerPort: 80 #定义监听端口80,用于提供web服务
    30. hostPort: 80 #宿主机上监听的端口号
    31. - name: admin #端口的名称。
    32. containerPort: 8080 #监听8080端口,用于提供UI界面
    33. hostPort: 8080 #宿主机上监听的端口号
    34. securityContext: #定义容器的安全策略
    35. capabilities: #定义了容器可以使用的 Linux 能力
    36. drop: #列出了要从容器中删除的能力
    37. - ALL #ALL表示所有
    38. add: #列出了要添加到容器中的能力
    39. - NET_BIND_SERVICE #网卡绑定到service的能力
    40. args: #传递给容器的命令行参数
    41. - --api #启用其 API
    42. - --kubernetes #启用 Kubernetes 支持
    43. - --logLevel=INFO #将日志级别设置为INFO
    44. ---
    45. kind: Service #创建service资源
    46. apiVersion: v1
    47. metadata:
    48. name: traefik-ingress-service
    49. namespace: kube-system
    50. spec:
    51. selector:
    52. k8s-app: traefik-ingress-lb
    53. ports: #定义提供web界面与UI界面的端口
    54. - protocol: TCP
    55. port: 80
    56. name: web
    57. - protocol: TCP
    58. port: 8080
    59. name: admin

    2.创建资源

    1. [root@master01 traefik]#kubectl apply -f traefik-ds.yaml
    2. daemonset.apps/traefik-ingress-controller created
    3. service/traefik-ingress-service created
    4. [root@master01 traefik]#kubectl get daemonsets.apps traefik-ingress-controller -n kube-system
    5. NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
    6. traefik-ingress-controller 2 2 2 2 2 4m16s
    7. [root@master01 traefik]#kubectl get svc traefik-ingress-service -n kube-system
    8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    9. traefik-ingress-service ClusterIP 10.96.194.37 80/TCP,8080/TCP 4m44s
    10. [root@master01 traefik]#kubectl get pod -n kube-system
    11. NAME READY STATUS RESTARTS AGE
    12. coredns-74ff55c5b-dwzdp 1/1 Running 9 19d
    13. coredns-74ff55c5b-ws8c8 1/1 Running 9 19d
    14. etcd-master01 1/1 Running 9 19d
    15. kube-apiserver-master01 1/1 Running 4 5d11h
    16. kube-controller-manager-master01 1/1 Running 41 19d
    17. kube-proxy-psdnv 1/1 Running 9 19d
    18. kube-proxy-zmh82 1/1 Running 11 19d
    19. kube-proxy-zwnx2 1/1 Running 9 19d
    20. kube-scheduler-master01 1/1 Running 44 19d
    21. traefik-ingress-controller-qgs7z 1/1 Running 0 5m15s
    22. traefik-ingress-controller-td99z 1/1 Running 0 5m15s
    23. #在所有节点上创建一个traefik-ingress-controller

    (四)创建UI界面

    1.查看文件

    1. [root@master01 traefik]#cat ui.yaml
    2. ---
    3. apiVersion: v1
    4. kind: Service #创建service
    5. metadata:
    6. name: traefik-web-ui
    7. namespace: kube-system
    8. spec:
    9. selector:
    10. k8s-app: traefik-ingress-lb
    11. ports:
    12. - name: web
    13. port: 80
    14. targetPort: 8080
    15. ---
    16. apiVersion: extensions/v1beta1
    17. kind: Ingress #创建ingress规则
    18. metadata:
    19. name: traefik-web-ui
    20. namespace: kube-system
    21. spec:
    22. rules:
    23. - host: traefik-ui.minikube #触发规则的主机名
    24. http:
    25. paths:
    26. - path: /
    27. backend:
    28. serviceName: traefik-web-ui #Daemonset中创建的service资源
    29. servicePort: web #Daemonset中创建的service资源

    2.创建资源

    1. [root@master01 traefik]#kubectl apply -f ui.yaml
    2. service/traefik-web-ui created
    3. Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
    4. ingress.extensions/traefik-web-ui created
    5. [root@master01 traefik]#kubectl get svc traefik-web-ui -n kube-system
    6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    7. traefik-web-ui ClusterIP 10.96.214.175 80/TCP 43s
    8. [root@master01 traefik]#kubectl get ingress traefik-web-ui -n kube-system
    9. NAME CLASS HOSTS ADDRESS PORTS AGE
    10. traefik-web-ui traefik-ui.minikube 80 56s

    此时可以通过NodeIP地址,直接访问8080端口

    三、创建访问资源

    (一)创建deployment

    1. [root@master01 traefik]#cat deployment.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: traefik-ingress01
    6. labels:
    7. traefik: ingress
    8. spec:
    9. replicas: 2
    10. selector:
    11. matchLabels:
    12. traefik: ingress
    13. template:
    14. metadata:
    15. labels:
    16. traefik: ingress
    17. spec:
    18. containers:
    19. - name: nginx
    20. image: nginx:1.18.0
    21. ports:
    22. - containerPort: 80

    创建资源,并自定义访问界面

    1. [root@master01 traefik]#kubectl apply -f deployment.yaml
    2. deployment.apps/traefik-ingress01 created
    3. [root@master01 traefik]#kubectl get deployments.apps traefik-ingress01
    4. NAME READY UP-TO-DATE AVAILABLE AGE
    5. traefik-ingress01 2/2 2 2 14s
    6. [root@master01 traefik]#kubectl get pod -owide
    7. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    8. traefik-ingress01-7c6d58b95c-mqth2 1/1 Running 0 30s 10.244.1.221 node01
    9. traefik-ingress01-7c6d58b95c-wkl4s 1/1 Running 0 30s 10.244.2.12 node02
    10. //自定义web界面
    11. [root@master01 traefik]#kubectl exec -it traefik-ingress01-7c6d58b95c-mqth2 bash
    12. root@traefik-ingress01-7c6d58b95c-mqth2:/# echo "this is traefik01" >/usr/share/nginx/html/index.html
    13. root@traefik-ingress01-7c6d58b95c-mqth2:/# exit
    14. exit
    15. [root@master01 traefik]#kubectl exec -it traefik-ingress01-7c6d58b95c-wkl4s bash
    16. root@traefik-ingress01-7c6d58b95c-wkl4s:/# echo "this is traefik02" >/usr/share/nginx/html/index.html
    17. root@traefik-ingress01-7c6d58b95c-wkl4s:/# exit
    18. exit
    19. [root@master01 traefik]#curl 10.244.1.221
    20. this is traefik01
    21. [root@master01 traefik]#curl 10.244.2.12
    22. this is traefik02

    (二)创建service

    1. [root@master01 traefik]#cat service.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: traefik-svc
    6. spec:
    7. ports:
    8. - port: 80
    9. targetPort: 80
    10. protocol: TCP
    11. selector:
    12. traefik: ingress
    13. [root@master01 traefik]#kubectl apply -f service.yaml
    14. service/traefik-svc created
    15. [root@master01 traefik]#kubectl get svc traefik-svc
    16. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    17. traefik-svc ClusterIP 10.96.31.72 80/TCP 9s

    (三)创建ingress规则

    1. [root@master01 traefik]#cat ingress.yaml
    2. apiVersion: networking.k8s.io/v1
    3. kind: Ingress
    4. metadata:
    5. name: traefik-test
    6. spec:
    7. rules:
    8. - host: www.traefik01.com
    9. http:
    10. paths:
    11. - path: /
    12. pathType: Prefix
    13. backend:
    14. service:
    15. name: traefik-svc
    16. port:
    17. number: 80
    18. [root@master01 traefik]#kubectl apply -f ingress.yaml
    19. ingress.networking.k8s.io/traefik-test created
    20. [root@master01 traefik]#kubectl get ingress traefik-test
    21. NAME CLASS HOSTS ADDRESS PORTS AGE
    22. traefik-test www.traefik01.com 80 11s

    (四)客户端访问

    1. [root@nfs ~]#grep www.traefik01.com /etc/hosts
    2. 192.168.83.40 node01 www.traefik01.com
    3. [root@nfs ~]#curl www.traefik01.com
    4. this is traefik01
    5. [root@nfs ~]#curl www.traefik01.com
    6. this is traefik02
    7. [root@nfs ~]#curl www.traefik01.com
    8. this is traefik01
    9. [root@nfs ~]#curl www.traefik01.com
    10. this is traefik02

    web界面监控

    Total Response Time

    总响应时间指的是从客户端发送请求开始,直到接收到完整响应所花费的总时间。它包括了请求在网络中的传输时间、服务器处理请求的时间以及响应数据的传输时间。在高负载或网络延迟高的情况下,Total Response Time 可能会显著增加。

    Total Code Count

    代码总量是指在某个软件项目或代码库中源代码的总行数。它可以用来衡量项目的规模或复杂度。在软件工程中,代码行数(LOC, Lines Of Code)有时被用作项目进度或开发工作量的粗略指标,尽管它并不是衡量软件质量的可靠标准。

    Uptime Since

    自上次启动以来的运行时间,通常显示为“Uptime Since”后面跟一个日期和时间。这是指系统或服务自从上一次重启后持续运行的时间长度。长时间的运行时间通常意味着系统稳定,没有经历频繁的重启或故障。

    2024-06-05 09:54:41 +08:00

    这是一个具体的时间戳,采用 ISO 8601 格式。这里的时间是2024年6月5日的9点54分41秒,处于东八区的时区(中国标准时间)。这个时间戳可以用于日志记录、事件追踪或系统状态的时间标记。

    Average Response Time

    平均响应时间是所有请求响应时间的平均值,通常用于衡量服务器或服务的性能。较低的平均响应时间表明系统响应迅速,处理能力强。它是性能监控和调优的关键指标之一。

    Code Count

    代码计数通常指的是单个文件或模块中的源代码行数。与 Total Code Count 不同,它关注的是特定部分的代码量,而不是整个项目。

    PID

    PID,即进程标识符(Process Identifier),是操作系统分配给每个运行进程的唯一数字标识。PID 用于跟踪和管理进程,如发送信号、终止进程或查询进程状态。在系统管理和调试中,PID 是一个重要的标识符。

    在更高的版本中,Traefik会提供更友好的UI界面,部署的方式也会多样化,后续会给大家介绍更高版本的Traefik组件

  • 相关阅读:
    openssl编程-基础知识-回调函数
    在线教育市场持续火爆,潜力巨大
    Golang并发控制方式有几种?
    【通刷】_晶晨S905L3A、S905L3AB芯片_安卓9.0_AI语音_完美线刷固件包
    python第三方库之pretty_errors——美化traceback 报错信息
    milvus数据管理-压缩数据
    SQL复习(2)
    Excel宏标记在所有工作表中标记关键字(以域名为例)并将结果输出到另一张Sheet
    【算法】分治法的应用——快速排序
    基于CefSharp开发浏览器(十)CefSharp.Wpf中文输入法偏移处理
  • 原文地址:https://blog.csdn.net/hy199707/article/details/139453956