k8s中,一.service发布服务,二.dashboard:基于网页的k8s管理插件,三.资源服务与帐号权限

一.service资源对内发布服务Cluster IP对外发布服务NodePortIngress
二.dashboard:基于网页的k8s管理插件
三.资源服务与帐号权限一.service:用户无法预知pod的ip地址以及所在的节点,多个相同的pod如何访问他们上面的服务功能:1.服务自动感知:pod迁移后访问service的ip,不受影响2.服务的自动发现:服务创建时自动在内部dns上注册域名服务名称.名称空间.svc.cluster.local3.服务负载均衡:访问多个相同标签的服务1.ClusterIP类型:集群内部发布服务(标签服务)1.1  资源清单文件生成#命令生成资源清单文件kubectl create service clusterip websvc --tcp=80:80 --dry-run=client -o yaml#自定义[root@master ~]# vim websvc.yaml---kind: ServiceapiVersion: v1metadata:name: websvc  spec:type: ClusterIP  #服务类型selector:app: web       #标签ports:           #端口- protocol: TCP  #协议port: 80 	      #服务的端口targetPort: 80 #后端pod端口1.2 解析域名# 安装工具软件包[root@master ~]# dnf install -y bind-utils# 查看 DNS 服务地址[root@master ~]# kubectl -n kube-system get service kube-dnsNAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)kube-dns   ClusterIP   10.245.0.10   <none>        53/UDP,53/TCP,9153/TCP# 域名解析测试[root@master ~]# host websvc.default.svc.cluster.local 10.245.0.10websvc.default.svc.cluster.local has address 10.245.5.181.3 通过标签完成请求转发,服务和service资源设置相同标签,创建后端应用[root@master ~]# vim web1.yaml ---kind: PodapiVersion: v1metadata:name: web1labels:app: web   # 服务靠标签寻找后端spec:containers:- name: apacheimage: myos:httpd1.4 给service服务设置固定的ip---kind: ServiceapiVersion: v1metadata:name: websvcspec:type: ClusterIPclusterIP: 10.245.1.80  #固定的ipselector:app: webports:- protocol: TCPport: 80targetPort: 801.5 端口别名,解决后端pod中多个服务的端口不一致情况service资源设置:---kind: ServiceapiVersion: v1metadata:name: websvcspec:type: ClusterIPclusterIP: 10.245.1.80  # 固定的ipselector:app: webports:- protocol: TCPport: 80targetPort: myhttp  # 端口别名pod资源设置:---kind: PodapiVersion: v1metadata:name: web1labels:app: web   	# 服务靠标签寻找后端spec:containers:- name: apacheimage: myos:httpdports:- name: myhttp  # 使用别名protocol: TCPcontainerPort: 802.NodePort:使用基于端口映射(30000-32767),外部服务请求节点,节点将请求转发给内部的clusteripnodeport--clusterip(service)--pod2.1 NodePort对外发布服务---kind: ServiceapiVersion: v1metadata:name: mysvcspec:type: NodePort            # 服务类型selector:app: webports:- protocol: TCPport: 80nodePort: 30080         # 映射端口号,不设置使用随机的端口号targetPort: 80	外部服务通过端口转发访问服务:curl http://node-0001:300803.Ingress(规则+控制器):通过http和https访问集群内部服务,支持域名解析ingress--service(clusterip)--pod前提:必须先配置好clusterip3.1 安装并配置ingress的规则# 查询ingress控制器类名称[root@master ~]# kubectl get ingressclasses.networking.k8s.io ---apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: simplespec:ingressClassName: ningx #控制器rules: 	       # 规则- host: foo.com   # 域名http:	       # 协议paths:	//前端参数- path: /bar	# 访问的url路径pathType: Exact #路径的类型(Prefix:宽松模式,访问路径以及子路径的内容,Exact:严格模式)//后端参数	backend: 	# 后端service: name: svc1	#服务名port:		#端口号number: 80status:loadBalancer: {}二.dashbord插件:基于网页的k8s用户界面1.安装dashborad[root@master ~]# cd plugins/dashboard[root@master dashboard]# docker load -i dashboard.tar.xz[root@master dashboard]# docker images|while read i t _;do[[ "${t}" == "TAG" ]] && continue[[ "${i}" =~ ^"harbor:443/".+ ]] && continuedocker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}docker push harbor:443/plugins/${i##*/}:${t}docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}donesed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' recommended.yaml[root@master dashboard]# kubectl apply -f recommended.yaml[root@master dashboard]# kubectl -n kubernetes-dashboard get pods2.修改nodePort发布服务---kind: ServiceapiVersion: v1metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboardspec:type: NodePortports:- port: 443nodePort: 30443targetPort: 8443selector:k8s-app: kubernetes-dashboard
三.资源与帐号权限1.角色与权限分类资源对象			描述					  作用域ServiceAccount	服务账号,为 Pod 中运行的进程提供了一个身份	单一名称空间Role			角色,包含一组代表相关权限的规则		单一名称空间RoleBinding		将权限赋予用户,Role、ClusterRole 均可使用	单一名称空间ClusterRole		角色,包含一组代表相关权限的规则		全集群ClusterRoleBinding	将权限赋予用户,只可以使用 ClusterRole	全集群2.资源对象的权限(对资源类型进行权限管理)create	 delete	deletecollection	get	list	 	创建	 删除		删除集合	     获取属性	获取列表(多个)  patch	 		update  	watch补丁(补充某一部分内容)	 更新	  	监控3.serviceaccount创建服务帐号# 资源对象模板kubectl -n kubernetes-dashboard create serviceaccount kube-admin --dry-run=client -o yaml[root@master ~]# vim admin-user.yaml---kind: ServiceAccountapiVersion: v1metadata:name: kube-adminnamespace: kubernetes-dashboard[root@master ~]# kubectl -n kubernetes-dashboard get serviceaccounts4.获取用户 token[root@master ~]# kubectl -n kubernetes-dashboard create token kube-admin6.自定义角色资源类型# 角色资源对象模板kubectl -n default create role myrole --resource=pods --verb=get,list --dry-run=client -o yaml---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: myrolenamespace: defaultrules:- apiGroups:- ""resources: # 设置的资源- podsverbs:  #设置的授权- get- list7.给kube-admin普通用户授权(RoleBinding)---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: kube-admin-role   #授权策略名称namespace: defaultroleRef: 			#关联权限apiGroup: rbac.authorization.k8s.io #角色对象组kind: Role 			#角色资源对象name: myrole 		#角色资源名称subjects: 			#帐号授权配置- kind: ServiceAccount     #帐号资源对象name: kube-admin 		#帐号资源名称namespace: kubernetes-dashboard #帐号所在的名称空间9.给集群管理员授权(ClusterRoleBinding)---kind: ServiceAccountapiVersion: v1metadata:name: kube-adminnamespace: kubernetes-dashboard---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: kube-admin-roleroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-adminsubjects:- kind: ServiceAccountname: kube-adminnamespace: kubernetes-dashboard

一.service资源
    对内发布服务
        Cluster IP
    对外发布服务
        NodePort
        Ingress
二.dashboard:基于网页的k8s管理插件
三.资源服务与帐号权限

一.service:用户无法预知pod的ip地址以及所在的节点,多个相同的pod如何访问他们上面的服务
        功能:
        1.服务自动感知:pod迁移后访问service的ip,不受影响
        2.服务的自动发现:服务创建时自动在内部dns上注册域名
            服务名称.名称空间.svc.cluster.local
        3.服务负载均衡:访问多个相同标签的服务
    
    1.ClusterIP类型:集群内部发布服务(标签服务)
      1.1  资源清单文件生成
        #命令生成资源清单文件
        kubectl create service clusterip websvc --tcp=80:80 --dry-run=client -o yaml
        
        #自定义
        [root@master ~]# vim websvc.yaml
        ---
        kind: Service
        apiVersion: v1
        metadata:
          name: websvc  
        spec:
          type: ClusterIP  #服务类型
          selector:
            app: web       #标签
          ports:           #端口
          - protocol: TCP  #协议
            port: 80           #服务的端口
            targetPort: 80 #后端pod端口

      1.2 解析域名
        # 安装工具软件包
        [root@master ~]# dnf install -y bind-utils
        # 查看 DNS 服务地址
        [root@master ~]# kubectl -n kube-system get service kube-dns
        NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)
        kube-dns   ClusterIP   10.245.0.10   <none>        53/UDP,53/TCP,9153/TCP
        # 域名解析测试
        [root@master ~]# host websvc.default.svc.cluster.local 10.245.0.10
        websvc.default.svc.cluster.local has address 10.245.5.18

      1.3 通过标签完成请求转发,服务和service资源设置相同标签,创建后端应用
        [root@master ~]# vim web1.yaml 
        ---
        kind: Pod
        apiVersion: v1
        metadata:
          name: web1
          labels:
            app: web   # 服务靠标签寻找后端
        spec:
          containers:
          - name: apache
            image: myos:httpd

     1.4 给service服务设置固定的ip
        ---
        kind: Service
        apiVersion: v1
        metadata:
          name: websvc
        spec:
          type: ClusterIP
          clusterIP: 10.245.1.80  #固定的ip
          selector:
            app: web
          ports:
          - protocol: TCP
            port: 80
            targetPort: 80

    1.5 端口别名,解决后端pod中多个服务的端口不一致情况
        service资源设置:
        ---
        kind: Service
        apiVersion: v1
        metadata:
          name: websvc
        spec:
          type: ClusterIP
          clusterIP: 10.245.1.80  # 固定的ip
          selector:
            app: web
          ports:
          - protocol: TCP
            port: 80
            targetPort: myhttp  # 端口别名
        pod资源设置:
        ---
        kind: Pod
        apiVersion: v1
        metadata:
          name: web1
          labels:
            app: web       # 服务靠标签寻找后端
        spec:
          containers:
          - name: apache
            image: myos:httpd
          ports:
          - name: myhttp  # 使用别名
            protocol: TCP
            containerPort: 80

    2.NodePort:使用基于端口映射(30000-32767),外部服务请求节点,节点将请求转发给内部的clusterip
        nodeport--clusterip(service)--pod
    2.1 NodePort对外发布服务
        ---
        kind: Service
        apiVersion: v1
        metadata:
          name: mysvc
        spec:
          type: NodePort            # 服务类型
          selector:
            app: web
          ports:
          - protocol: TCP
            port: 80
            nodePort: 30080         # 映射端口号,不设置使用随机的端口号
            targetPort: 80    
        外部服务通过端口转发访问服务:curl http://node-0001:30080

    3.Ingress(规则+控制器):通过http和https访问集群内部服务,支持域名解析
        ingress--service(clusterip)--pod
        前提:必须先配置好clusterip
        
    3.1 安装并配置ingress的规则
        # 查询ingress控制器类名称
        [root@master ~]# kubectl get ingressclasses.networking.k8s.io 
        ---
        apiVersion: networking.k8s.io/v1
        kind: Ingress
        metadata:
          name: simple
        spec:
          ingressClassName: ningx #控制器
          rules:            # 规则
          - host: foo.com   # 域名
            http:           # 协议
              paths:    
            //前端参数
              - path: /bar    # 访问的url路径
                pathType: Exact #路径的类型(Prefix:宽松模式,访问路径以及子路径的内容,Exact:严格模式)
            //后端参数    
                backend:     # 后端
                  service: 
                    name: svc1    #服务名
                    port:        #端口号
                      number: 80
        status:
          loadBalancer: {}

二.dashbord插件:基于网页的k8s用户界面
    1.安装dashborad
        [root@master ~]# cd plugins/dashboard
        [root@master dashboard]# docker load -i dashboard.tar.xz
        [root@master dashboard]# docker images|while read i t _;do
            [[ "${t}" == "TAG" ]] && continue
            [[ "${i}" =~ ^"harbor:443/".+ ]] && continue
            docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
            docker push harbor:443/plugins/${i##*/}:${t}
            docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
        done
        sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' recommended.yaml
        [root@master dashboard]# kubectl apply -f recommended.yaml
        [root@master dashboard]# kubectl -n kubernetes-dashboard get pods
        
    2.修改nodePort发布服务
        ---
        kind: Service
        apiVersion: v1
        metadata:
          labels:
            k8s-app: kubernetes-dashboard
          name: kubernetes-dashboard
          namespace: kubernetes-dashboard
        spec:
          type: NodePort
          ports:
            - port: 443
              nodePort: 30443
              targetPort: 8443
          selector:
            k8s-app: kubernetes-dashboard
三.资源与帐号权限
    1.角色与权限分类
        资源对象            描述                      作用域
        ServiceAccount    服务账号,为 Pod 中运行的进程提供了一个身份    单一名称空间

        Role            角色,包含一组代表相关权限的规则        单一名称空间
        RoleBinding        将权限赋予用户,Role、ClusterRole 均可使用    单一名称空间

        ClusterRole        角色,包含一组代表相关权限的规则        全集群
        ClusterRoleBinding    将权限赋予用户,只可以使用 ClusterRole    全集群

    2.资源对象的权限(对资源类型进行权限管理)
        create     delete    deletecollection    get    list         
        创建     删除        删除集合         获取属性    获取列表(多个)  
        patch             update      watch
        补丁(补充某一部分内容)     更新          监控

    3.serviceaccount创建服务帐号
        # 资源对象模板
        kubectl -n kubernetes-dashboard create serviceaccount kube-admin --dry-run=client -o yaml
        
        [root@master ~]# vim admin-user.yaml
            ---
            kind: ServiceAccount
            apiVersion: v1
            metadata:
              name: kube-admin
              namespace: kubernetes-dashboard
        
        [root@master ~]# kubectl -n kubernetes-dashboard get serviceaccounts
    
    4.获取用户 token
        [root@master ~]# kubectl -n kubernetes-dashboard create token kube-admin

    6.自定义角色资源类型
        # 角色资源对象模板
        kubectl -n default create role myrole --resource=pods --verb=get,list --dry-run=client -o yaml
        ---
        kind: Role
        apiVersion: rbac.authorization.k8s.io/v1
        metadata:
          name: myrole
          namespace: default
        rules:
        - apiGroups:
          - ""
          resources: # 设置的资源
          - pods
          verbs:  #设置的授权
          - get
          - list

    7.给kube-admin普通用户授权(RoleBinding)
        ---
        kind: RoleBinding
        apiVersion: rbac.authorization.k8s.io/v1
        metadata:
          name: kube-admin-role   #授权策略名称
          namespace: default
        roleRef:             #关联权限
          apiGroup: rbac.authorization.k8s.io #角色对象组
          kind: Role             #角色资源对象
          name: myrole         #角色资源名称
        subjects:             #帐号授权配置
        - kind: ServiceAccount     #帐号资源对象
          name: kube-admin         #帐号资源名称
          namespace: kubernetes-dashboard #帐号所在的名称空间

    9.给集群管理员授权(ClusterRoleBinding)
        ---
        kind: ServiceAccount
        apiVersion: v1
        metadata:
          name: kube-admin
          namespace: kubernetes-dashboard
        
        ---
        kind: ClusterRoleBinding
        apiVersion: rbac.authorization.k8s.io/v1
        metadata:
          name: kube-admin-role
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: ClusterRole
          name: cluster-admin
        subjects:
        - kind: ServiceAccount
          name: kube-admin
          namespace: kubernetes-dashboard
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14370.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是三层交换技术?与二层有什么区别?

什么是三层交换技术&#xff1f;让你的网络飞起来&#xff01; 一. 什么是三层交换技术&#xff1f;二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱 大家好…

amis组件crud使用踩坑

crud注意 过滤条件参数同步地址栏 默认 CRUD 会将过滤条件参数同步至浏览器地址栏中&#xff0c;比如搜索条件、当前页数&#xff0c;这也做的目的是刷新页面的时候还能进入之前的分页。 但也会导致地址栏中的参数数据合并到顶层的数据链中&#xff0c;例如&#xff1a;自动…

Baklib重塑内容中台智能推荐系统提高服务质量的策略和实操

内容概要 随着信息技术的飞速发展&#xff0c;企业在内容管理和用户体验方面面临越来越多的挑战。在这个大背景下&#xff0c;内容中台的智能化推荐系统应运而生&#xff0c;Baklib作为一个突出的工具&#xff0c;为企业提供了解决方案。Baklib 是什么类型的工具&#xff0c;它…

浅谈 HashMap 的扩容过程和 put 过程

这是在基于 JDK 1.8 之后的源码进行的浅谈 简介&#xff1a; 在 JDK 8 中&#xff0c;HashMap 由 “数组 链表 红黑树” 组成。链表过长会影响查询性能&#xff0c;而红黑树搜索的时间复杂度是 O(logn)&#xff0c;而链表则是O(n)&#xff0c;JDK 8 对数据结构进行了进一步的…

Unity-Mirror网络框架-从入门到精通之Discovery示例

文章目录 前言Discovery示例NetworkDiscoveryNetworkDiscoveryHUDServerRequestServerResponse最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Un…

25/2/7 <机器人基础> 牛顿-欧拉递推公式,开闭环

牛顿-欧拉递推公式是用于计算刚体动力学中&#xff0c;刚体的角速度和角加速度的递推关系。这个公式是牛顿第二定律和欧拉旋转定理的结合&#xff0c;适用于描述刚体在空间中的旋转运动。 对于一个刚体&#xff0c;设其在某时刻的角速度为 ω&#xff0c;角加速度为 α&#xf…

Qt实现简易视频播放器

使用Qt6实现简易音乐播放器&#xff0c;效果如下&#xff1a; github&#xff1a; Gabriel-gxb/VideoPlayer: qt6实现简易视频播放器 一、整体架构 该代码整体架构围绕着MainWindow类构建一个媒体播放器相关的应用程序。 主要组件 &#xff08;一&#xff09;界面组件&…

使用 JFreeChart 创建动态图表:从入门到实战

文章目录 前言一、JFreeChart 简介二、环境准备三、 创建第一个折线图四、自定义图表样式4.1 设置背景色4.2 设置折线颜色4.3 设置字体&#xff08;解决中文乱码&#xff09;4.4 设置横坐标的标签宽度和方向 五、导出图表六、实战&#xff1a;动态生成日报图表总结 前言 在数据…

Codeforces Round 940 (Div. 2) and CodeCraft-23(A-D)

题目链接&#xff1a;Dashboard - Codeforces Round 940 (Div. 2) and CodeCraft-23 - Codeforces A. Stickogon 思路 正多边形意味着要用相等的木棍&#xff0c;相等的木棍最少需要3根才能组成正三角&#xff0c;我们把相等的数的数量除3加起来 代码 void solve(){int n;…

C++开发(软件开发)常见面试题

目录 1、C里指针和数组的区别 2、C中空指针请使用nullptr不要使用NULL 3、http/https区别和头部结构&#xff1f; 4、有了mac地址为什么还要ip地址&#xff1f;ip地址的作用 5、有了路由器为什么还要交换机&#xff1f; 6、面向对象三大特性 7、友元函数 8、大端小端 …

常用数据结构之String字符串

字符串 在Java编程语言中&#xff0c;字符可以使用基本数据类型char来保存&#xff0c;在 Java 中字符串属于对象&#xff0c;Java 提供了 String 类来创建和操作字符串。 操作字符串常用的有三种类&#xff1a;String、StringBuilder、StringBuffer 接下来看看这三类常见用…

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章&#xff0c;支持多种AI服务&#xff08;如OpenAI、百度文心一言、智谱AI等&#xff09;&#xff0c;并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成&#xff1a;根据输入的关键词生成高质量文章。 内容…

Vite 为什么快,是怎么打包的

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

协议-ACLLite-ffmpeg

是什么&#xff1f; FFmpeg是一个开源的多媒体处理工具包&#xff0c;它集成了多种功能&#xff0c;包括音视频的录制、转换和流式传输处理。FFmpeg由一系列的库和工具组成&#xff0c;其中最核心的是libavcodec和libavformat库。 libavcodec是一个领先的音频/视频编解码器库&…

【C++高并发服务器WebServer】-12:TCP详解及实现

本文目录 一、TCP通信流程二、套接字函数2.1 socket()2.2 bind()2.3 listen()2.4 accept()2.5 connect() 三、demo实现3.1 server端代码3.2 client端代码 四、TCP三次握手五、TCP滑动窗口六、TCP四次挥手七、多进程并发服务器 一、TCP通信流程 先来讲讲服务器端&#xff0c;是…

【Maven】项目管理工具-Maven

目录 1. Maven简介 1.1 项目管理 1.2 项目构建 1.3 项目构建工具 1.4 Maven的四大特征 1.4.1 依赖管理系统 1.4.2 多模块构建 1.4.3 一致的项目结构 1.4.4 一致的构建模型和插件机制 1.5 Maven模型 ​编辑 2.maven的安装配置 2.1 Maven的安装配置 2.1.1检测jdk的版…

dijkstra算法类型题解

dijkstra算法&#xff08;有权图&#xff0c;无权图&#xff09;&#xff1a; 带权路径长度——当图是带权图时&#xff0c;一条路径上所有边的权值之和&#xff0c;称为该路径的带权路径长度 初始化三个数组&#xff0c;final标记各顶点是否已找到最短路径&#xff0c;dist最…

RabbitMQ 消息顺序性保证

方式一&#xff1a;Consumer设置exclusive 注意条件 作用于basic.consume不支持quorum queue 当同时有A、B两个消费者调用basic.consume方法消费&#xff0c;并将exclusive设置为true时&#xff0c;第二个消费者会抛出异常&#xff1a; com.rabbitmq.client.AlreadyClosedEx…

基于开源AI智能名片2+1链动模式S2B2C商城小程序的个人IP活动运营策略与影响力提升研究

摘要&#xff1a;本文围绕个人IP运营者借助活动运营提升影响力这一主题&#xff0c;深入探讨如何将开源AI智能名片21链动模式S2B2C商城小程序融入借势、造势、提升参与感及用户激励等活动运营环节。通过分析该创新模式与活动运营各要素的结合点&#xff0c;为个人IP运营者提供切…

计算机图形学论文 | 面向制造的设计: 五轴铣削的几何制造可行性评估

&#x1f355;&#x1f355;&#x1f355;宝子们好久不见&#xff0c;新年快乐~~~&#xff0c;今天我们来更新一篇关于五轴CNC制造中的模型制造可达性分析的论文。老规矩&#xff1a; 红色是名词&#xff0c;蓝色是结论&#xff0c;绿色是文章工作&#xff0c;黄色是一些其他重…