云端技术驾驭DAY15——ClusterIP服务、Ingress服务、Dashboard插件、k8s角色的认证与授权

往期回顾:
云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述
云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板
云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装
云端技术驾驭DAY04——Logstash安装部署及插件模块
云端技术驾驭DAY06——容器技术概述、镜像与容器管理、定制简单镜像、容器内安装部署服务
云端技术驾驭DAY07——Dockerfile详解、容器镜像制作、私有仓库
云端技术驾驭DAY08——部署容器服务、Compose微服务管理、harbor仓库部署及管理
云端技术驾驭DAY09——k8s集群安装部署、calico插件部署、计算节点配置管理
云端技术驾驭DAY10——kubectl命令详解、Pod创建过程、Pod的生命周期、定制Pod、资源对象文件
云端技术驾驭DAY11——资源对象文件、Pod自定义命令、多容器Pod、资源监控工具
云端技术驾驭DAY12——Pod调度策略、Pod标签管理、Pod资源配额与限额、全局资源配额与限额策略
云端技术驾驭DAY13——Pod污点、容忍策略、Pod优先级与抢占、容器安全
云端技术驾驭DAY14——存储卷管理、临时卷、持久卷、PV/PVC管理

云端技术驾驭DAY15

  • 服务管理
      • Service
          • 服务原理
          • Cluster IP 服务
      • 对外发布应用
          • 服务类型
          • NodePort服务
          • Ingress服务
          • 配置Ingress规则
  • WEB管理工具
      • Dashboard
          • Dashboard概述
          • Dashboard安装
          • 发布服务
  • 认证与授权
      • ServiceAccount
          • 用户概述
          • 创建ServiceAccount
      • 权限管理
          • 角色与授权
          • RBAC授权

服务管理

Service

服务原理
  • 容器化带来的问题
    • 自动调度:在Pod创建之前,用户无法预知Pod所在的节点以及Pod的IP地址
    • 一个已经存在的Pod在运行过程中,如果出现故障,Pod也会在新的节点使用新的IP进行部署
    • 应用程序访问服务的时候,地址也不能经常变换
    • 多个相同的Pod如何访问它们上面的服务
  • Service就是解决这些问题的方法
  • 服务的自动感知
    • 服务会创建一个cluster IP这个地址对应资源地址,不管Pod如何变化,服务总能找到对应的Pod,且cluster IP保持不变
  • 服务的负载均衡
    • 如果服务后端对应多个Pod,则会通过IPTables/LVS规则将访问的请求最终映射到Pod的容器内部,自动在多个容器间实现负载均衡
  • 服务的自动发现
    • 服务创建时会自动在内部DNS上注册域名
    • 域名:<服务名称>.<名称空间>.svc.cluster.local
Cluster IP 服务
  • Cluster IP 类型
    • 默认的ServiceType,通过集群的内部IP暴露服务,选择该值时服务只能够在集群内部访问
[root@master ~]# vim mysvc.yaml
---
apiVersion: v1
kind: Service                   # 资源对象类型
metadata:
  name: mysvc                   # 资源对象名称
spec:
  ports:
  - port: 80                    # 监听的端口
    protocol: TCP               # 协议
    targetPort: 80              # 后端服务端口
  selector:                     # 选择算符
    app: web                    # Pod标签
  type: ClusterIP               # 服务类型

[root@master ~]# kubectl apply -f mysvc.yaml 
service/mysvc created
[root@master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.245.0.1     <none>        443/TCP   7d19h
mysvc        ClusterIP   10.245.74.82   <none>        80/TCP    7s
  • 服务的自动发现(域名自动注册)
[root@master ~]# dnf -y install bind-utils

[root@master ~]# kubectl -n kube-system get service kube-dns              # 查看 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 mysvc.default.svc.cluster.local 10.245.0.10         # 域名解析测试
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: 

mysvc.default.svc.cluster.local has address 10.245.74.82
[root@master ~]# vim myweb.yaml            # 创建后端应用
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
  labels:
    app: web                               # 服务靠标签寻找后端
spec:
  containers:
  - name: apache
    image: myos:httpd

[root@master ~]# kubectl apply -f myweb.yaml
pod/web1 created
[root@master ~]# curl 10.245.74.82
Welcome to The Apache.
  • 负载均衡
[root@master ~]# sed 's,web1,web2,' myweb.yaml | kubectl apply -f -
pod/web2 created
[root@master ~]# sed 's,web1,web3,' myweb.yaml | kubectl apply -f -
pod/web3 created
[root@master ~]# curl 10.245.74.82/info.php | grep php_host
php_host:       web3
[root@master ~]# curl 10.245.74.82/info.php | grep php_host
php_host:       web2
[root@master ~]# curl 10.245.74.82/info.php | grep php_host
php_host:       web1
  • Cluster IP 服务的工作原理
    • kube-proxy是在所有节点上运行的代理。可以实现简单的数据转发,可以设置更新IPTables/LVS规则,在服务创建时,还提供服务地址DNS自动注册与服务发现功能
  • 使用固定IP
    • Cluster IP 是随机分配的,如果想使用固定IP,可以自定义,但IP的范围必须符合服务的CIDR
    • 通过kubectl cluster-info dump | grep -i service-cluster-ip-range查看IP范围
[root@master ~]# vim mysvc.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  type: ClusterIP
  clusterIP: 10.245.1.80

[root@master ~]# kubectl delete service mysvc 
service "mysvc" deleted
[root@master ~]# kubectl apply -f mysvc.yaml 
service/mysvc created
[root@master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.245.0.1    <none>        443/TCP   7d20h
mysvc        ClusterIP   10.245.1.80   <none>        80/TCP    7s
  • 端口别名
    • 当两个作为后端的Pod端口号不一样时,可以使用端口别名
[root@master ~]# vim mysvc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: myhttp           # 使用别名查找后端服务端口
  selector:
    app: web
  type: ClusterIP
  clusterIP: 10.245.1.80
[root@master ~]# vim myweb.yaml 
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
  labels:
    app: web
spec:
  containers:
  - name: apache
    image: myos:httpd
    ports:                # 配置端口规范
    - name: myhttp        # 声明端口别名
      protocol: TCP       # 协议
      containerPort: 80   # 端口号
[root@master ~]# kubectl delete service mysvc 
service "mysvc" deleted
[root@master ~]# kubectl apply -f mysvc.yaml 
service/mysvc created
[root@master ~]# kubectl apply -f myweb.yaml 
pod/web1 created
[root@master ~]# curl 10.245.1.80           # 通过别名和指定IP访问成功
Welcome to The Apache.

对外发布应用

服务类型
  • 发布服务
    • ClusterIP服务可以解决集群内应用互访的问题,但外部的应用无法访问集群内的资源,某些应用需要访问集群内的资源,我们就需要对外发布服务
  • 服务类型
    • ClusterIP默认类型可以实现Pod的自动感知与负载均衡,是最核心的服务类型,但ClusterIp不能对外发布服务,如果想对外发布服务可以使用NodePort或Ingress
NodePort服务

在这里插入图片描述

  • NortPort概述
    • 使用基于端口映射(默认值:30000-32767)的方式对外发布服务,可以发布任意服务(四层)
  • 服务资源文件
[root@master ~]# vim mysvc1.yaml
---
kind: Service
apiVersion: v1
metadata:
  name: mysvc1
spec:
  type: NodePort           # 指定服务类型
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80
    nodePort: 30080        # 可选,不指定则使用随机端口
    targetPort: 80

[root@master ~]# kubectl apply -f mysvc1.yaml
service/mysvc1 created
[root@master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.245.0.1      <none>        443/TCP        7d21h
mysvc1       NodePort    10.245.238.47   <none>        80:30080/TCP   6m29s
  • 访问nodePort服务
root@master ~]# curl node-0001:30080
Welcome to The Apache.
[root@master ~]# curl node-0002:30080
Welcome to The Apache.
[root@master ~]# curl node-0003:30080
Welcome to The Apache.
[root@master ~]# curl node-0004:30080
Welcome to The Apache.
[root@master ~]# curl node-0005:30080
Welcome to The Apache.
Ingress服务

在这里插入图片描述

  • Ingress概述
    • 使用Ingress控制器(一般由Nginx或HAProxy构成),用来发布http、https服务(七层)
  • Ingress控制器镜像地址:github.com/kubernetes/ingress-nginx
  • Ingress安装
[root@master ingress]# docker load -i ingress.tar.xz           # 导入Ingress镜像
[root@master ingress]# 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
[root@master ingress]# sed -ri 's,^(\s*image: )(.*/)?(.+)@.*,\1harbor:443/plugins/\3,' deploy.yaml       # 修改以下三行
458:    image: harbor:443/plugins/controller:v1.5.1
565:    image: harbor:443/plugins/kube-webhook-certgen:v20220916-gd32f8c343
614:    image: harbor:443/plugins/kube-webhook-certgen:v20220916-gd32f8c343
[root@master ingress]# kubectl apply -f deploy.yaml
[root@master ingress]# kubectl label nodes node-0001 ingress-ready="true"       # 通过标签指定在那台机器上发布应用
node/node-0001 labeled
[root@master ~]# kubectl -n ingress-nginx get pods
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-bnk2n       0/1     Completed   0          2m12s
ingress-nginx-admission-patch-jsbxh        0/1     Completed   0          2m12s
ingress-nginx-controller-bbbb5f675-m4tck   1/1     Running     0          2m12s
配置Ingress规则
  • 保证ClusterIP 访问正常
[root@master ~]# kubectl get pods,service
NAME       READY   STATUS    RESTARTS      AGE
pod/web1   1/1     Running   1 (31m ago)   3h52m

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.245.0.1       <none>        443/TCP        8d
service/mysvc        ClusterIP   10.245.1.80      <none>        80/TCP         16m
service/mysvc1       NodePort    10.245.209.208   <none>        80:30080/TCP   3h1m
[root@master ~]# curl 10.245.1.80
Welcome to The Apache.
  • 配置规则
    • 资源对象模板:kubectl create ingress mying --class=nginx --rule=nsd.tedu.cn/*=mysvc:80 --dry-run=client -o yaml
[root@master ~]# vim mying.yaml
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: mying
spec:
  ingressClassName: nginx         # 使用的类名称
  rules:                          # ingress 规则定义
  - host: mying.cn                # 域名定义,可以不写
    http:                         # 协议
      paths:                      # 访问的路径定义
      - path: /                   # 访问的url路径
        pathType: Prefix          # 路径的类型[Exact Prefix]
        backend:                  # 后端服务
          service:                # 服务声明
            name: mysvc           # 服务名称
            port:                 # 端口号声明
              number: 80          # 访问服务的端口号
  • 发布服务
[root@master ~]# kubectl apply -f mying.yaml 
ingress.networking.k8s.io/mying created
[root@master ~]# kubectl get ingress
NAME    CLASS   HOSTS      ADDRESS   PORTS   AGE
mying   nginx   mying.cn             80      12s
[root@master ~]# kubectl get ingress
NAME    CLASS   HOSTS      ADDRESS        PORTS   AGE
mying   nginx   mying.cn   192.168.1.51   80      14m
[root@master ~]# curl -H "Host: mying.cn" http://192.168.1.51
Welcome to The Apache.

WEB管理工具

Dashboard

Dashboard概述
  • Dashboard是什么?
    • Dashboard是给予网页的Kubernetes用户界面
    • Dashboard同时展示了Kubernetes集群中的资源状态信息和所有报错信息
    • 可以使用Dashboard将应用部署到集群中,也可以对容器应用排错,还能管理集群资源
    • 地址:github.com/kubernetes/dashboard
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
[root@master dashboard]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' recommended.yaml
193:    image: harbor:443/plugins/dashboard:v2.7.0
278:    image: harbor:443/plugins/metrics-scraper:v1.0.8
[root@master dashboard]# kubectl apply -f recommended.yaml
[root@master dashboard]# kubectl -n kubernetes-dashboard get pods
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-66f6f56b59-trznx   1/1     Running   0          28s
kubernetes-dashboard-65ff57f4cf-7dn87        1/1     Running   0          28s
发布服务
  • 导出服务资源文件
[root@master dashboard]# sed -n '30,45p' recommended.yaml > dashboard-svc.yaml
[root@master dashboard]# vim dashboard-svc.yaml 
---
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort                   # 添加类型,以NodePort形式发布
  ports:
    - port: 443
      nodePort: 30443              # 指定端口
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

[root@master dashboard]# kubectl apply -f dashboard-svc.yaml 
service/kubernetes-dashboard configured
[root@master dashboard]# kubectl -n kubernetes-dashboard get services
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.245.155.177   <none>        8000/TCP        8m14s
kubernetes-dashboard        NodePort    10.245.210.63    <none>        443:30443/TCP   8m14s
  • 添加监听器,前端端口设置为30443,并监听任意一个节点的30443端口
  • 使用弹性公网IP绑定ELB在这里插入图片描述
  • 发布成功后,通过浏览器访问https://公网IP:30443,出现如下界面即成功
    在这里插入图片描述

认证与授权

ServiceAccount

用户概述
  • 用户认证
    • 所有k8s集群都有两类用户:由k8s管理的服务帐号和普通用户
    • 普通用户是以证书或密钥形式签发,主要用途是认证和鉴权,集群中并不包含用来代表普通用户帐号的对象,普通用户的信息无法调用和查询
    • 服务帐号是Kubernetes API所管理的用户。它们被绑定到特定的名称空间,与一组Secret凭据相关联,供Pod调用以获得相应的授权
创建ServiceAccount
  • 编写ServiceAccout资源对象文件
[root@master dashboard]# vim admin-user.yaml
---
kind: ServiceAccount
apiVersion: v1
metadata:
  name: kube-admin
  namespace: kubernetes-dashboard

[root@master dashboard]# kubectl apply -f admin-user.yaml 
serviceaccount/kube-admin created
[root@master dashboard]# kubectl -n kubernetes-dashboard get sa
NAME                   SECRETS   AGE
default                0         30m
kube-admin             0         11s
kubernetes-dashboard   0         30m
  • 创建登陆用token
[root@master dashboard]# kubectl -n kubernetes-dashboard create token kube-admin
eyJhbGciOiJSUzI1NiIsImtpZCI6Im... ...          # 这一串字符就是登陆用的token

在这里插入图片描述

权限管理

角色与授权
  • 如果想访问和管理k8s集群,就要对身份以及权限做验证,k8s支持的鉴权模块有Node、RBAC、ABAC、Webhook API
    • Node:专门对kubelet发出的请求进行鉴权
    • RBAC:是一种基于组织中用户的角色来控制资源使用的方法
    • ABAC:基于属性的访问控制,是一种通过将用户属性与权限组合在一起向用户授权的方法
    • Webhook:是一个HTTP回调
  • 查询集群使用的鉴权方法
[root@master dashboard]# kubectl cluster-info dump | grep authorization-mode
                            "--authorization-mode=Node,RBAC",
RBAC授权
  • RBAC声明了四种k8s对象:
    • Role:用来在某一名称空间内创建授权角色,创建Role时,必须指定所属的名称空间的名字
    • Cluster:可以和Role相同完成授权,但属于集群范围,对所有名称空间有效
    • RoleBinding:是将角色中定义的权限赋予一个或者一组用户,可以使用Role或ClusterRole完成授权
    • ClusterRoleBinding:在集群范围执行授权,对所有名称空间有效,只能使用ClusterRole完成授权
  • 资源对象角色与作用域
资源对象描述作用域
ServiceAccount服务账号,为 Pod 中运行的进程提供了一个身份单一名称空间
Role角色,包含一组代表相关权限的规则单一名称空间
ClusterRole角色,包含一组代表相关权限的规则全集群
RoleBinding将权限赋予用户,Role、ClusterRole 均可使用单一名称空间
ClusterRoleBinding将权限赋予用户,只可以使用 ClusterRole全集群
  • 资源对象权限
createdeletedeletecollectiongetlistpatchupdatewatch
创建删除删除集合获取属性获取列表补丁更新监控
  • 创建自定义角色
# 资源对象模板
[root@master ~]# kubectl -n default create role myrole --resource=pods --verb=get,list --dry-run=client -o yaml
[root@master ~]# kubectl -n default create rolebinding kube-admin-role --role=myrole --serviceaccount=kubernetes-dashboard:kube-admin --dry-run=client -o yaml

[root@master ~]# vim myrole.yaml 
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myrole           # 角色名称
  namespace: default
rules:                   # 规则
- apiGroups:             # 资源对象所属组信息
  - ""                   # 分组信息
  resources:             # 要设置权限的资源对象
  - pods                 # 授权资源对象名称
  verbs:                 # 权限设置
  - get                  # 权限
  - list                 # 权限
  • 给kube-admin赋予普通用户权限
... ...                                     # 接着上面的写
---
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           # 帐号所在的名称空间

[root@master dashboard]# kubectl apply -f myrole.yaml
role.rbac.authorization.k8s.io/myrole created
rolebinding.rbac.authorization.k8s.io/kube-admin-role created
  • 给kube-admin赋予集群管理员权限
... ...
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kube-admin-role
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kube-admin
  namespace: kubernetes-dashboard

[root@master dashboard]# kubectl apply -f myrole.yaml
role.rbac.authorization.k8s.io/myrole created
clusterrolebinding.rbac.authorization.k8s.io/kube-admin-role created
  • 授予管理员权限后,再次登陆Dashboard可以管理集群信息
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中继承的作用及解析

在 Java 中&#xff0c;继承是一种非常重要的面向对象编程特性。它的主要作用包括以下几个方面&#xff1a; 代码复用&#xff1a;通过继承&#xff0c;子类可以复用父类的代码&#xff0c;包括属性和方法。这样可以避免重复编写相同的代码&#xff0c;提高代码的复用性和可维护…

keycloak-鉴权springboot

一、环境描述 keycloak鉴权springboot的方式&#xff0c;此处简单介绍&#xff0c;springboot官方也提供了demo https://github.com/keycloak/keycloak-quickstarts/tree/latest/spring/rest-authz-resource-server 以及文档说明 Securing Applications and Services Guide…

2024年智能驾驶年度策略:自动驾驶开始由创造型行业转向工程型行业

感知模块技术路径已趋于收敛&#xff0c;自动驾驶从创造型行业迈向工程型行业。在特斯拉的引领下&#xff0c;国内主机厂2022年以来纷纷跟随特斯拉相继提出“重感知、轻地图”技术方案&#xff0c;全球自动驾驶行业感知模块技术路径从百花齐放开始走向收敛。我们认为主机厂智能…

波斯猫 6页面 宠物动物 长毛猫 HTML5 带背景音乐 JS图片轮播特效 滚动文字 鼠标经过图片 JS时间代码

波斯猫 6页面 宠物动物 长毛猫 HTML5 带背景音乐 JS图片轮播特效 滚动文字 鼠标经过图片 JS时间代码 注册表单 宠物网页成品 海量学生网页成品 个人博客 人物明星 城市家乡 旅游景点 美食特产 购物电商 公司企业 学校大学 科普教育 宠物动物 鲜花花卉 植物水果 茶叶咖啡 健康生…

目标识别项目:基于Yolov7-LPRNet的动态车牌目标识别算法模型(一)

前言 目标识别如今以及迭代了这么多年&#xff0c;普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述&#xff0c;YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性…

【springboot】乡镇卫生院、二甲医院云HIS运维平台源码

目录 云HIS运营管理 ​编辑电子病历主模块&#xff1a;包括门诊电子病历、住院电子病历等子模块 &#xff08;1&#xff09;门诊电子病历功能简介 &#xff08;2&#xff09;住院电子病历功能简介 ▶患者列表主模块&#xff1a;包括患者信息子模块 &#xff08;1&#xf…

【应用多元统计分析】--多元数据的直观表示(R语言作图)

例1.2 为了研究全国31个省、市、自治区2018年城镇居民生活消费的分布规律&#xff0c;根据调查资料做区域消费类型划分。 指标&#xff1a; 食品x1&#xff1a;人均食品支出(元/人) 衣着x2&#xff1a;人均衣着商品支出(元/人) 居住x3&#xff1a;人均居住支出(元/人) 生活x4…

基于ARIMA+SARIMA的航空公司 RPM 时间序列预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

快速幂模板

#include<bits/stdc.h> using namespace std;typedef long long ll;ll n; ll Mi[40];ll quick_M(ll a, ll b, ll p) {// 初始化答案为1ll res 1;// 将b用二进制表示while(b){// 如果二进制位为1&#xff0c;则相乘&#xff08;如上图右半边&#xff09;if(b & 1) re…

STM32(6)中断

1.中断 1.1 中断的概念 STM32的中断&#xff1a; 1.2 中断优先级 用数字的大小表示中断优先级的高低&#xff0c;数字的范围&#xff1a;0000--1111&#xff08;二进制&#xff09;&#xff0c;即0-15&#xff0c;共16级优先级。 进一步对这4位二进制数进行划分&#xff0c;可…

芯片ERP:应用广泛的领域及其影响

在现代科技快速发展的时代&#xff0c;芯片ERP(企业资源规划)已成为许多行业不可或缺的工具。这种集成了先进技术和先进管理理念的系统&#xff0c;极大地提高了企业的运营效率和竞争力。那么&#xff0c;芯片ERP主要应用在哪些领域呢?本文将为您一一揭晓。 一、电子制造行业 …

STM32(11)按键产生中断

1.初始化IO引脚&#xff0c;设置模式&#xff0c;速度等 2.设置AFIO&#xff08;配置EXTI的引脚映射&#xff09;&#xff0c;记得开启时钟 3.配置EXTI的通道&#xff08;EXTI0和EXTI1&#xff09; 4.配置NVIC 4.1 中断优先级分组 4.2 配置中断 5.编写中断响应函数 在中断向量…

《一》在Vue中搭建Three.js环境(超详细、保姆级),创建场景、相机、渲染器

目录 Three.js简介创建vue项目引入Three.js实际操作环节文件目录创建初始化场景、相机 Three.js简介 Three.js 是一款基于 WebGL的 JavaScript 3D 库&#xff0c;它封装了 WebGL API&#xff0c;为开发者提供了简单易用的 API 来在 Web 浏览器中展示 3D 图形。Three.js 提供了…

uniapp问卷调查(单选)

前言 该代码片段只支持问卷调查的单选功能 使用组件库 配置 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) 代码 <template> <view> <view v-for"(item, index) in radiolist1" :key"index"> …

6 款顶级的 iPhone 数据恢复软件解决方案值得您花时间!

尽管iOS为您的数据提供了很多安全网&#xff08;例如iCloud&#xff09;&#xff0c;但由于事故、病毒等原因&#xff0c;仍然可能会发生“不可逆转”的数据丢失。在这种情况下&#xff0c;最好的DIY解决方案是使用iPhone数据恢复软件&#xff0c;这是一种利用先进算法直接从设…

中国电子学会2020年12月份青少年软件编程Sc ratch图形化等级考试试卷四级真题

【 单选题 】 1.陶朱家开了一间小卖部&#xff0c;学了编程的他想编写一个程序帮助分析小卖部各种商品的售卖情况。如下图所示&#xff0c;目前各个商品的名称和销售量分别存在了两张列表里&#xff0c;一一对应&#xff0c;并且每一样商品的销售量都不同。陶朱要先找出销售量…

selenuim【1】($x(‘xpath语法’)、WebDriverWait())

文章目录 初学selenuim记录1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素&#xff1a;等待&#xff08;1&#xff09;driver.set_page_load_timeout(t)&#…

在Python中使用多线程(通俗版本)

一、多线程的介绍&#xff1a; 1.进程 通常一个进程包含一个或者多个线程&#xff0c;每个进程有自己独立的一块内存空间&#xff0c;所有的线程共享这一块空间&#xff0c;例如&#xff1a;在Windows操作系统中&#xff0c;一个运行的xx.exe就是一个进程。 2.线程 一个进程…

低代码流程引擎实战:让表单字段成为流程节点审批人的得力助手!

在现代企业的日常运营中&#xff0c;流程审批是保障工作高效、规范进行的关键环节。随着企业对于灵活性和高效性的需求不断增长&#xff0c;传统的固定审批人设置已无法满足多变的业务场景。在JVS低代码中“设置流程节点审批人为表单字段”这一功能&#xff0c;旨在通过动态配置…

leetcode第 387 场周赛总结

很久没打周赛了&#xff0c;这周开始恢复 这次周赛&#xff0c;题目比较简单&#xff0c;第三道题有点浪费了时间&#xff0c;思路是对的&#xff0c;但是被我把问题复杂化了。 给你一个下标从 1 开始、包含 不同 整数的数组 nums &#xff0c;数组长度为 n 。 你需要通过 n 次…
最新文章