容器编排学习(七)控制器介绍与使用

news2025/2/26 3:45:12

一  控制器

控制器是 k8s内置的管理工具。可以帮助用户实现 Pod的自动部署、自维护、扩容、滚动更新等功能的自动化程序。

为什么要使用控制器?

  • 有大量的 Pod需要维护管理
  • 需要维护 Pod的健康状态
  • 控制器可以像机器人一样可以替用户完成维护管理的工作

二  Deployment

1  概述

最常用的无状态服务控制器,由 Deploymen、ReplicaSet、Pod 组成、支持集群扩容缩容滚动、更新、自动维护 Pod 可用性及·副本量等功能

ReplicaSet 和 Pod 由 Deployment 自动管理,用户无需干预

2  Deploy 图例

3  Deploy 资源文件

# 清理 Pod ,使用控制器创建
[root@master ~]# kubectl delete pod --all
# 资源对象模板
[root@master ~]# kubectl create deployment myweb --image=myos:httpd --dry-run=client -o yaml
[root@master ~]# vim mydeploy.yaml
---
kind: Deployment          # 资源对象类型
apiVersion: apps/v1       # 版本
metadata:                 # 元数据
  name: myweb             # 名称
spec:                     # 详细定义
  replicas: 2             # 副本数量
  selector:               # 定义标签选择器
    matchLabels:          # 支持 matchExpressions 表达式语法
      app: httpd          # 通过标签来确定那个 Pod 由它来管理
  template:               # 定义用来创建 Pod 的模板,以下为 Pod 定义
    metadata:             # Pod元数据
      labels:             # 名称由控制器生成
        app: httpd        # 这里只能定义标签
    spec:                 # Pod的详细定义
      restartPolicy: Always   # 重启策略
      containers:         # 容器定义
      - name: apache      # 容器名称
        image: myos:httpd # 创建容器使用的镜像
        imagePullPolicy: Always  # 镜像下载策略

# 创建 Deployment
[root@master ~]# kubectl apply -f mydeploy.yaml 
deployment.apps/myweb created
[root@master ~]# kubectl get deployments 
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
myweb   2/2     2            2           68s
[root@master ~]# kubectl get replicasets 
NAME               DESIRED   CURRENT   READY   AGE
myweb-64b544dcbc   2         2         2       73s
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myweb-64b544dcbc-5mhqn   1/1     Running   0          76s
myweb-64b544dcbc-nt6tz   1/1     Running   0          76s

4  ClusterIP 服务

如何访问 Deployment 资源?

Deployment 管理多个 Pod,可以使用服务对其资源进行访问

# 创建服务访问集群
[root@master ~]# vim websvc.yaml
---
kind: Service
apiVersion: v1
metadata:
  name: websvc
spec:
  type: ClusterIP
  clusterIP: 10.245.1.80
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

[root@master ~]# kubectl apply -f websvc.yaml 
service/websvc created
[root@master ~]# curl -m 3 http://10.245.1.80
Welcome to The Apache.

 5  Pod维护管理

# 自维护自治理
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myweb-64b544dcbc-5mhqn   1/1     Running   0          4m16s
myweb-64b544dcbc-nt6tz   1/1     Running   0          4m16s

# Pod 被删除后,Deploy 会自动创建新的 Pod 来维护集群的完整性
[root@master ~]# kubectl delete pod myweb-64b544dcbc-5mhqn 
pod "myweb-64b544dcbc-5mhqn" deleted
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myweb-64b544dcbc-g8l9p   1/1     Running   0          3s
myweb-64b544dcbc-nt6tz   1/1     Running   0          4m25s

6  集群扩缩容

# 设置 1 Pod 集群
[root@master ~]# kubectl scale deployment myweb --replicas=1
deployment.apps/myweb scaled
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myweb-64b544dcbc-nt6tz   1/1     Running   0          5m46s
# 设置 3 Pod 集群
[root@master ~]# kubectl scale deployment myweb --replicas=3
deployment.apps/myweb scaled
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myweb-64b544dcbc-5sf5z   1/1     Running   0          3s
myweb-64b544dcbc-6r6dw   1/1     Running   0          3s
myweb-64b544dcbc-nt6tz   1/1     Running   0          5m56s

7  历史版本信息

# 查看历史版本
[root@master ~]# kubectl rollout history deployment myweb 
deployment.apps/myweb 
REVISION  CHANGE-CAUSE
1         <none>

# 添加注释信息
[root@master ~]# kubectl annotate deployments myweb kubernetes.io/change-cause="httpd.v1"
deployment.apps/myweb annotated
[root@master ~]# kubectl rollout history deployment myweb 
deployment.apps/myweb 
REVISION  CHANGE-CAUSE
1         httpd.v1

8  滚动更新

# 修改镜像,滚动更新集群
[root@master ~]# kubectl set image deployment myweb apache=myos:nginx
deployment.apps/myweb image updated 
# 给新版本添加注释信息
[root@master ~]# kubectl annotate deployments myweb kubernetes.io/change-cause="nginx.v1"
deployment.apps/myweb annotated
# 查看历史版本信息
[root@master ~]# kubectl rollout history deployment myweb 
deployment.apps/myweb 
REVISION  CHANGE-CAUSE
1         httpd.v1
2         nginx.v1

# 访问验证服务
[root@master ~]# curl -m 3 http://10.245.1.80
Nginx is running !

9  版本回滚

# 历史版本与回滚
[root@master ~]# kubectl rollout undo deployment myweb --to-revision 1
deployment.apps/myweb rolled back
[root@master ~]# curl -m 3 http://10.245.1.80
Welcome to The Apache.

[root@master ~]# kubectl rollout history deployment myweb 
deployment.apps/myweb 
REVISION  CHANGE-CAUSE
2         nginx.v1
3         httpd.v1

# 删除控制器方法1
[root@master ~]# kubectl delete deployments myweb 
deployment.apps "myweb" deleted
# 删除控制器方法2
[root@master ~]# kubectl delete -f mydeploy.yaml
deployment.apps "myweb" deleted

三  DaemonSet

1  概述

  • 无法自定义副本数量
  • 所创建的 Pod与 node 节点绑定
  • 每个node 上都会运行一个 Pod
  • 当有新 Node 加入集群时,会为他新增 Pod 副本,当 Node 从集群移除时,这些 Pod 也会被回收典型应用:kube-proxy

2  DS图例

 3  资源对象案例

[root@master ~]# cp -a mydeploy.yaml myds.yaml
[root@master ~]# vim myds.yaml
---
kind: DaemonSet  # 资源对象类型
apiVersion: apps/v1
metadata:
  name: myds     # 控制器名称
spec:
  # replicas: 2  # 删除副本参数
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      restartPolicy: Always
      containers:
      - name: apache
        image: myos:httpd
        imagePullPolicy: Always

# 创建 DaemonSet 资源对象,与 node 绑定,每节点都创建容器
[root@master ~]# kubectl apply -f myds.yaml 
daemonset.apps/myds created
[root@master ~]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE
myds-msrcx   1/1     Running   0          31s   10.244.1.11   node-0001
myds-lwq8l   1/1     Running   0          31s   10.244.2.17   node-0002
myds-4wt72   1/1     Running   0          31s   10.244.3.14   node-0003
myds-6k82t   1/1     Running   0          31s   10.244.4.15   node-0004
myds-9c6wc   1/1     Running   0          31s   10.244.5.19   node-0005

4  污点干扰

# 设置污点,重建 daemonset
[root@master ~]# kubectl taint node node-0001 k=v:NoSchedule
node/node-0001 tainted
[root@master ~]# kubectl delete -f myds.yaml 
daemonset.apps "myds" deleted
[root@master ~]# kubectl apply -f myds.yaml 
daemonset.apps/myds created
# 有污点不会部署,特殊需求可以设置容忍策略
[root@master ~]# kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
myds-pkdn9   1/1     Running   0          2s
myds-pkp6b   1/1     Running   0          2s
myds-j84cw   1/1     Running   0          2s
myds-5c69p   1/1     Running   0          2s
# 删除污点后会立即部署
[root@master ~]# kubectl taint node node-0001 k=v:NoSchedule-
node/node-0001 untainted
[root@master ~]# kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
myds-2c86p   1/1     Running   0          1s
myds-pkdn9   1/1     Running   0          9s
myds-pkp6b   1/1     Running   0          9s
myds-j84cw   1/1     Running   0          9s
myds-5c69p   1/1     Running   0          9s

# 删除控制器
[root@master ~]# kubectl delete -f myds.yaml 
daemonset.apps "myds" deleted

四  Job/CronJob

1  概述

Job 是一个单任务控制器,负责执行一次任务,保证任务在一个或多个Pod上执行成功

CronJob 像是Job的升级版,他是基于时间管理的 Job 控制器

2  Job图例

3  Job 控制器

# 资源对象模板
[root@master ~]# kubectl create job myjob --image=myos:8.5 --dry-run=client -o yaml -- sleep 3
[root@master ~]# vim myjob.yaml 
---
kind: Job
apiVersion: batch/v1
metadata:
  name: myjob                  # 资源对象名称
spec:                          # job 的详细定义
  template:                    # 以下定义 Pod 模板
    spec:                      # pod的详细定义
      restartPolicy: OnFailure # 只支持[OnFailure,Never]
      containers:              # 容器定义
      - name: myjob            # 容器名称
        image: myos:8.5        # 创建容器使用的镜像
        command: ["/bin/bash"] # 自定义任务,可以使用脚本
        args:
        - -c
        - |
          sleep 3
          exit $((RANDOM%2))

# restartPolicy 会判断 exit 状态码
# 状态码为 0 表示正常,其他都表示失败

[root@master ~]# kubectl apply -f myjob.yaml 
job.batch/myjob created

# 失败了会重启
[root@master ~]# kubectl get pods -l job-name=myjob -w
NAME             READY   STATUS      RESTARTS     AGE
myjob--1-lrtbk   1/1     Running     0            2s
myjob--1-lrtbk   0/1     Error       0            4s
myjob--1-lrtbk   1/1     Running     1 (1s ago)   5s
myjob--1-lrtbk   0/1     Completed   1            9s

[root@master ~]# kubectl get jobs.batch 
NAME    COMPLETIONS   DURATION   AGE
myjob   1/1           8s         12s

# 删除Job控制器
[root@master ~]# kubectl delete -f myjob.yaml 
job.batch "myjob" deleted

4  CJ图例

 资源对象案例

# 资源对象模板
[root@master ~]# kubectl create cronjob mycj --image=myos:8.5 --schedule='* * * * *' --dry-run=client -o yaml -- sleep 3
[root@master ~]# vim mycj.yaml
---
kind: CronJob
apiVersion: batch/v1
metadata:
  name: mycj                      # 资源名称
spec:                             # cronjob 的详细定义
  schedule: "* * * * 1-5"         # 时间周期:[分、时、日、月、周]
  jobTemplate:                    # 以下定义 Job 模板
    spec:                         # Job的详细定义
      template:                   # 创建pod的模板
        spec:                     # Pod的详细定义
          restartPolicy: OnFailure# 只支持[OnFailure,Never]
          containers:             # 容器定义
          - name: myjob           # 容器名称
            image: myos:8.5       # 创建容器使用的镜像
            command: ["/bin/bash"]# 自定义任务
            args:
            - -c
            - |
              sleep 3             # 脚本
              exit $((RANDOM%2))  # 退出状态码,失败后会重新运行

[root@master ~]# kubectl apply -f mycj.yaml 
cronjob.batch/mycj created

# cronjob 会按照时间周期运行
[root@master ~]# kubectl get cronjobs 
NAME   SCHEDULE        SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * 1-5   False     0        <none>          4s

# 按照时间周期,每分钟触发一个任务
[root@master ~]# kubectl get jobs -w
NAME                     READY   STATUS              RESTARTS   AGE
mycj-27808172--1-w6sbx   0/1     Pending             0          0s
mycj-27808172--1-w6sbx   0/1     ContainerCreating   0          0s
mycj-27808172--1-w6sbx   1/1     Running             0          1s
mycj-27808172--1-w6sbx   0/1     Completed           1          4s

# 保留三次结果,多余的会被删除
[root@master ~]# kubectl get jobs 
NAME            COMPLETIONS   DURATION   AGE
mycj-27605367   1/1           31s        3m30s
mycj-27605368   1/1           31s        2m30s
mycj-27605369   1/1           31s        90s
mycj-27605370   0/1           30s        30s
[root@master ~]# kubectl get jobs 
NAME                 COMPLETIONS   DURATION   AGE
mycj-27605368   1/1           31s        2m33s
mycj-27605369   1/1           31s        93s
mycj-27605370   1/1           31s        33s

# 删除CJ控制器
[root@master ~]# kubectl delete -f mycj.yaml 
cronjob.batch "mycj" deleted

五  StatefulSet

1  概述

StatefulSet旨在与有状态的应用及分布式系统一起使用,涉及了 Headless 服务、存储卷、DNS 等相关知识点,是一个宽泛而复杂的话题

2  STS图例

3  headless服务

在配置 StatefulSets 的时候首先要定义一个 Headless 的服务。

在创建 Pod的时候会自动把 <Pod名称> 注册为域名

# 配置 headless 服务
[root@master ~]# cp websvc.yaml mysvc2.yaml 
[root@master ~]# vim mysvc2.yaml 
---
kind: Service
apiVersion: v1
metadata:
  name: mysvc2       # 服务名称
spec:
  type: ClusterIP
  clusterIP: None    # 设置 IP 为 None
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

[root@master ~]# kubectl apply -f mysvc2.yaml 
service/mysvc2 created
[root@master ~]# kubectl get service mysvc2
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
mysvc2        ClusterIP   None          <none>        80/TCP    61s

4  创建 StatefulSets 资源对象文件

[root@master ~]# cp -a mydeploy.yaml mysts.yaml
[root@master ~]# vim mysts.yaml
---
kind: StatefulSet      # 资源对象类型
apiVersion: apps/v1
metadata:
  name: mysts          # 控制器名称
spec:
  serviceName: mysvc2  # 新增 headless 服务名称
  replicas: 2
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      restartPolicy: Always
      containers:
      - name: apache
        image: myos:httpd
        imagePullPolicy: Always
        
[root@master ~]# kubectl apply -f mysts.yaml 
statefulset.apps/mysts created

[root@master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
mysts-0   1/1     Running   0          2s
mysts-1   1/1     Running   0          1s

# Pod 名称自动注册 DNS 服务
[root@master ~]# host mysts-0.mysvc2.default.svc.cluster.local 10.245.0.10
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: 

mysts-0.mysvc2.default.svc.cluster.local has address 10.244.1.81

[root@master ~]# host mysvc2.default.svc.cluster.local 10.245.0.10
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: 

mysvc2.default.svc.cluster.local has address 10.244.2.83
mysvc2.default.svc.cluster.local has address 10.244.1.81

# 删除sts控制器
[root@master ~]# kubectl delete -f mysts.yaml -f mysvc2.yaml
statefulset.apps "mysts" deleted
service "mysvc2" deleted

六  HPA控制器

1  HorizontalPodAutoscaling概述

HorizontalPodAutoscaling 简称 HPA,可以在 Kubernetes集群中基于CPU利用率或其他应程序提供的度量指标实现水平自动伸缩的功能,自动缩放POD的数量

控制器会周期性的获取平均利用率

与目标值相比较后来调整副本数量

2  HPA图例

 3  创建后端服务

# 为 Deploy 模板添加资源配额
[root@master ~]# vim mydeploy.yaml 
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: myweb
spec:
  replicas: 1                 # 修改副本数量
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      restartPolicy: Always
      containers:
      - name: apache
        image: myos:httpd
        imagePullPolicy: Always
        resources:           # 为该资源设置配额
          requests:          # HPA 控制器会根据配额使用情况伸缩集群
            cpu: 200m        # CPU 配额

[root@master ~]# vim websvc.yaml
---
kind: Service
apiVersion: v1
metadata:
  name: websvc
spec:
  type: ClusterIP
  clusterIP: 10.245.1.80
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

[root@master ~]# kubectl apply -f mydeploy.yaml -f websvc.yaml
deployment.apps/myweb created
service/websvc created

# 验证服务
[root@master ~]# kubectl top pods
NAME                    CPU(cores)   MEMORY(bytes)   
myweb-c8c66f894-2cfjv   1m           17Mi  
[root@master ~]# curl -s http://10.245.1.80
Welcome to The Apache.

4  创建HPA控制器

[root@master ~]# vim myhpa.yaml 
---
kind: HorizontalPodAutoscaler         # 资源对象类型
apiVersion: autoscaling/v1            # 版本
metadata:                             # 元数据
  name: myweb                         # 资源对象名称
spec:                                 # 详细定义
  minReplicas: 1                      # 最少保留的副本数量
  maxReplicas: 5                      # 最大创建的副本数量
  targetCPUUtilizationPercentage: 50  # 警戒值,以百分比计算
  scaleTargetRef:                     # 监控的资源对象
    kind: Deployment                  # 资源对象类型
    apiVersion: apps/v1               # 版本
    name: myweb                       # 资源对象名称


# 创建弹性集群
[root@master ~]# kubectl apply -f myhpa.yaml 
horizontalpodautoscaler.autoscaling/myweb created

# 刚刚创建 unknown 是正常现象,最多等待 60s 就可以正常获取数据
[root@master ~]# kubectl get horizontalpodautoscalers.autoscaling 
NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
myweb   Deployment/myweb   <unknown>/50%   1         5         0          4s

# 最多等待 60s 即可正常获取资源状态
[root@master ~]# kubectl get horizontalpodautoscalers.autoscaling 
NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
myweb   Deployment/myweb   0%/50%          1         5         1          71s

5  验证测试

持续访问 Web服务,增加CPU负载,在超过警戒值之后,会触发扩容操作,等待几秒之后发现副本数量增加了。

停止访问,让CPU空闲,为了防止集群性能抖动,副本不会立即释放,必须300秒内的平均负载小于警戒值,才开始释放副本,当副本达到最小值时候停止释放

测试时可以通过访问php 脚本增加CPU的负载

# 终端 1 访问提高负载
[root@master ~]# while sleep 1;do
    curl -s "http://10.245.1.80/info.php?id=100000" -o /dev/null
done
# 终端 2 监控 HPA 变化
[root@master ~]# kubectl get hpa -w
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
myweb   Deployment/myweb   0%/50%    1         3         1          8m21s
myweb   Deployment/myweb   49%/50%   1         3         1          9m
myweb   Deployment/myweb   56%/50%   1         3         1          9m15s
myweb   Deployment/myweb   56%/50%   1         3         2          9m30s
myweb   Deployment/myweb   37%/50%   1         3         2          9m45s
myweb   Deployment/myweb   32%/50%   1         3         2          10m
myweb   Deployment/myweb   41%/50%   1         3         2          11m
myweb   Deployment/myweb   48%/50%   1         3         2          11m
myweb   Deployment/myweb   51%/50%   1         3         2          11m
myweb   Deployment/myweb   59%/50%   1         3         2          11m
myweb   Deployment/myweb   58%/50%   1         3         3          12m
myweb   Deployment/myweb   42%/50%   1         3         3          12m
myweb   Deployment/myweb   34%/50%   1         3         3          12m

# 如果 300s 内平均负载小于标准值,就会自动缩减集群规模
[root@master ~]# kubectl get hpa -w
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
myweb   Deployment/myweb   38%/50%   1         3         3          19m
myweb   Deployment/myweb   21%/50%   1         3         3          20m
myweb   Deployment/myweb   17%/50%   1         3         3          21m
myweb   Deployment/myweb    7%/50%   1         3         3          22m
myweb   Deployment/myweb    0%/50%   1         3         3          23m
myweb   Deployment/myweb    0%/50%   1         3         2          25m
myweb   Deployment/myweb    0%/50%   1         3         1          28m

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫逆向实战(31)-某花顺行情中心(cookie、补环境)

一、数据接口分析 主页地址&#xff1a;某花顺 1、抓包 通过抓包可以发现数据接口是/page/2/ajax/1/ 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 通过查看“标头”可以发现有一个Hexin-V加密参数&#xff0c;但是这个参数的值与c…

搭建自己的OCR服务,第二步:PaddleOCR环境安装

PaddleOCR环境安装&#xff0c;遇到了很多问题&#xff0c;根据系统不同问题也不同&#xff0c;不要盲目看别人的教程&#xff0c;有的教程也过时了&#xff0c;根据实际情况自己调整。 我这边目前是使用windows 10系统CPU python 3.7 搭建。 熟悉OCR的人应该知道&#xff0…

PostgresSQL----基于Kubernetes部署PostgresSQL

【PostgresSQL----基于Kubernetes部署PostgresSQL】 文章目录 一、创建SC、PV和PVC存储对象1.1 准备一个nfs服务器1.2 编写SC、PV、PVC等存储资源文件1.3 编写部署PostgresSQL数据库的资源声明文件 二、部署PostgresSQL2.1 部署 PV、PVC等存储对象2.2 部署PostgresSQL数据库2.3…

SpringMVC之前端增删改查实现

SpringMVC是一个基于MVC架构的框架&#xff0c;它可以帮助我们实现前后端的分离&#xff0c;同时也能很好地支持前端的增删改查操作。 配置 Cloudjun <?xml version"1.0" encoding"UTF-8" ?><taglib xmlns"http://java.sun.com/xml/ns/j…

Spring 家族框架常用注解

反射相关 Target Spring核心注解&#xff0c;指定自定义注解MyAnno可以应用到的java类型,从而提供编译时的类型检查和错误检测 指定类型时用枚举类ElementType下的具体枚举值&#xff0c;包括&#xff1a;ElementType.TYPE&#xff1a;表示MyAnno适用于类、接口、枚举。Eleme…

Java多线程(一)多线程概要

多线程概要 多线程概要 什么是进程&#xff1f; 进程的特点&#xff1a; 什么是多线程 多线程编程&#xff1a; 创建线程 1.继承 Thread 类 2.实现 Runnable 接口 多线程的优势 中断问题&#xff1a; 1. 通过共享的标记来进行沟通 2. 调用 interrupt() 方法来通知 …

flutter开发实战-实现自定义bottomNavigationBar样式awesome_bottom_bar

flutter开发实战-实现自定义bottomNavigationBar样式awesome_bottom_bar 在开发过程中&#xff0c;需要自定义bottomNavigationBar样式&#xff0c;可以自定义实现&#xff0c;这里使用的是awesome_bottom_bar库 一、awesome_bottom_bar 在pubspec.yaml中引入awesome_bottom_…

滑动谜题 -- BFS

滑动谜题 输入&#xff1a;board [[4,1,2],[5,0,3]] 输出&#xff1a;5 解释&#xff1a; 最少完成谜板的最少移动次数是 5 &#xff0c; 一种移动路径: 尚未移动: [[4,1,2],[5,0,3]] 移动 1 次: [[4,1,2],[0,5,3]] 移动 2 次: [[0,1,2],[4,5,3]] 移动 3 次: [[1,0,2],[4,5,3]…

前端实现展开收起的效果 (react)

需求背景&#xff1a;需要实现文本的展开收起效果&#xff0c;文本是一行一行的&#xff0c;数据格式是数组结构。 如图所示&#xff08;图片已脱敏&#xff09; 简单实现&#xff1a;使用一个变量控制展开收起效果。 展开收起逻辑部分&#xff08;react&#xff09; const […

layer is not a constructor缺少报错解决方案参考开发教程并在相关页面引入

问题场景&#xff1a; 1.在使用Mars3d热力图功能时&#xff0c;提示mars3d.layer.HeatLayer is not a constructor 问题原因: 1.mars3d的热力图插件mars3d-heatmap没有安装引用。 解决方案&#xff1a; 1.参考开发教程&#xff0c;找到相关的插件库&#xff1a;Mars3D 三维…

Power BI依据列中值的范围不同计算公式增加一列

Power BI依据列的范围不同计算公式增加一列&#xff0c;在我们遇到了依据范围不同的公式计算时&#xff0c;就可以采用下面公式 一、增加组计算公式 佣金分组 SWITCH(TRUE(), ry_vue clawer_zhuan[到手价]>0&&ry_vue clawer_zhuan[到手价]<475,80, ry_vue claw…

华为OD机考算法题:数字加减游戏

目录 题目部分 解读与分析 代码实现 题目部分 题目数字加减游戏难度难题目说明小明在玩一个数字加减游戏&#xff0c;只使用加法或者减法&#xff0c;将一个数字 s 变成数字 t 。 每个回合&#xff0c;小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减…

华为云云耀云服务器L实例评测|华为云上试用主机安全产品Elkeid

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上试用主机安全产品Elkeid一、背景&#xff1a;什么是主机安全二、主机安全之Elkeid1. Elkeid 介绍2. Elkeid Server3. Elkeid Server 架构Elkeid AgentCenter&#xff08;下面简称AC&#xff09;Elkeid Service Discov…

[构建自己的 Vue 组件库] 小尾巴 UI 组件库

文章归档于&#xff1a;https://www.yuque.com/u27599042/row3c6 组件库地址 npm&#xff1a;https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee&#xff1a;https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee&#xff1a…

Java(四)数组与类和对象

Java&#xff08;四&#xff09;数组与类和对象 六、数组&#xff08;非常重要&#xff09;1.定义2.遍历2.1遍历方法2.2Arrays方法 3.二维数组数组小总结 七、类和对象1. 定义&#xff08;重要&#xff09;1.1 类1.2 对象 2. this关键字&#xff08;重要&#xff09;2.1 特点 3…

方差分析的核心概念“方差分解“

方差是统计学中用来衡量数据集合中数值分散或离散程度的一种统计量。它表示了数据点与数据集合均值之间的差异程度&#xff0c;即数据的分散程度。方差越大&#xff0c;表示数据点更分散&#xff0c;而方差越小&#xff0c;表示数据点更集中。 方差的计算公式如下&#xff1a;…

自己开发一个接口文档页面html

演示效果 具体代码如下 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>框架框架文档页面</…

网络原理(一)网络基础,包括IP ,网络相关的定义

网络基础 以下图片是书上的网图。 什么是IP地址&#xff1f; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。P地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一…

电商(淘宝1688京东拼多多等)API接口服务:提升商业效率和用户体验的关键

电商API接口服务&#xff1a;提升商业效率和用户体验的关键 随着电子商务的飞速发展&#xff0c;电商企业需要不断提升自身的业务能力和服务质量&#xff0c;以应对日益激烈的市场竞争。为了更好地满足商家和消费者的需求&#xff0c;电商API接口服务应运而生。本文将探讨电商…

【进阶篇】Redis内存淘汰详解

文章目录 Redis内存淘汰详解0. 前言大纲Redis内存淘汰策略 1. 什么是Redis内存淘汰策略&#xff1f;1.1.Redis 内存不足的迹象 2. Redis内存淘汰策略3. 原理4. 主动和被动1. 主动淘汰1.1 键的生存周期1.2 过期键删除策略 2. 被动淘汰2.2 被动淘汰策略的实现 5. 项目实践优化策略…