K8S初级入门系列之六-控制器(RC/RS/Deployment)

news2024/11/26 23:48:56

一、前言

     在第一章我们了解到,如果master节点是一个大脑,那么控制器组件就是大脑的总管,用来控制Pod的状态和行为。今天我们就来认识弹性扩缩容相关的控制器ReplicationController,ReplicaSet,Deployment。

二、ReplicationController(RC)

      前面我们创建的Pod都是单个的,无法满足高可用的设计要求。对于无状态的应用,一般采用多副本机制,并将多副本实例打散部署到不同的节点上,确保任何一个副本出现问题,整体服务还是可用的。

       ReplicationController是多副本管理的控制器,确保在任何时候都有特定数量的 Pod 副本处于运行状态。如下图示例所示:

    Pod副本数为3,一开始就启动3个Pod实例,运行过程中,其中一个Pod由于节点宕机处于不可用,RC就会新启一个Pod,确保副本数为3。同样,如果Pod副本数超过3,就是删除掉多余Pod

 1、RC创建

编辑nginx-rc.yaml文件,内容如下:

[root@k8s-master yaml]# cat nginx-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx-rc
  template:
    metadata:
      name: nginx
      labels:
        app: nginx-rc
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

   该文件结构看上去比较复杂,我们来分析,如下图所示:

 可以看到,ReplicationController是个"套娃"结构,共分三层。

    第一层为RC自身的属性定义,主要关注replicas,selector,template三个属性。replicas设置副本数;selector选择待控制的pod标签,需要与下面Pod的标签一致;template表示Pod的模板,其内容是Pod的定义。

  第二层和第三层,就是Pod和Container的定义,这个我们非常熟悉,就不一一介绍。

执行该文件,创建RC对象,可以查看下rc列表和Pod副本

[root@k8s-master yaml]# kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
nginx   3         3         3       26m
[root@k8s-master yaml]# kubectl get pod
NAME                        READY   STATUS      RESTARTS            AGE
nginx-2l2vp                 1/1     Running     0                   26m
nginx-ln4hd                 1/1     Running     0                   26m
nginx-n5cxx                 1/1     Running     0                   26m

      在rc列表中,期望副本数为3个,当前为3个。再看pod列表,确实启动了三个nginx的Pod,其名称都是定义的Pod的Name(name:nginx)后增加了5个随机字符,以区分不同的Pod副本。

  RC控制器能将副本数控制在目标值,接下来,我们删除其中一个Pod,模拟异常测试下。

[root@k8s-master yaml]# kubectl delete pod nginx-2l2vp
pod "nginx-2l2vp" deleted
[root@k8s-master yaml]# kubectl get pod
NAME                        READY   STATUS              RESTARTS           AGE
nginx-c4rr6                 0/1     ContainerCreating   0                  4s
nginx-ln4hd                 1/1     Running             0                  33m
nginx-n5cxx                 1/1     Running             0                  33m

可以看到,RC又帮我们重新启动了一个Pod,从而确保副本数为3,从rc的详情中也可以看到该过程。

[root@k8s-master yaml]# kubectl describe rc nginx
....
Events:
  Type    Reason            Age   From                    Message
  ----    ------            ----  ----                    -------
  Normal  SuccessfulCreate  35m   replication-controller  Created pod: nginx-ln4hd
  Normal  SuccessfulCreate  35m   replication-controller  Created pod: nginx-n5cxx
  Normal  SuccessfulCreate  35m   replication-controller  Created pod: nginx-2l2vp
  Normal  SuccessfulCreate  2m8s  replication-controller  Created pod: nginx-c4rr6

2、扩缩容

    通过调整replicas的个数,进行扩缩容,上面的例子,我们将副本数增加到4个,修改nginx-rc.yaml 文件。

[root@k8s-master yaml]# cat nginx-rc.yaml 
....
spec:
  replicas: 4 
  ....

仅修改replicas值为4,其他保持一致,重新执行该文件。

[root@k8s-master yaml]# kubectl apply -f nginx-rc.yaml 
replicationcontroller/nginx configured

可以看到期望副本数变成了4个。

[root@k8s-master yaml]# kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
nginx   4         4         4       6h16m

再看下pod的实际副本数,已经变成了4个。

[root@k8s-master ~]# kubectl get pod
NAME                        READY   STATUS      RESTARTS          AGE
nginx-c4rr6                 1/1     Running     0                 7h22m
nginx-ln4hd                 1/1     Running     0                 7h55m
nginx-n5cxx                 1/1     Running     0                 7h55m
nginx-q847k                 1/1     Running     0                 103m

大家可以自行尝试下缩容。 

3、RC删除

     RC的删除有两种方式,一种采用kubectl delete rc <rc name>指令是将rc以及pod都删除。如下所示:

[root@k8s-master ~]# kubectl delete rc nginx
replicationcontroller "nginx" deleted
[root@k8s-master ~]# kubectl get rc
No resources found in default namespace.
[root@k8s-master ~]# kubectl get pod -l app=nginx-rc
No resources found in default namespace.

另一种是将为kubectl delete rc <rc name> --cascade=orphan指令,仅删除rc,而保留pod。

[root@k8s-master yaml]# kubectl delete rc nginx --cascade=orphan
replicationcontroller "nginx" deleted
[root@k8s-master yaml]# kubectl get rc
No resources found in default namespace.
[root@k8s-master yaml]# kubectl get pod -l app=nginx-rc
NAME          READY   STATUS    RESTARTS   AGE
nginx-k4d2g   1/1     Running   0          3m16s
nginx-rjz9n   1/1     Running   0          3m16s
nginx-xqm66   1/1     Running   0          3m16s
nginx-znjdv   1/1     Running   0          3m16s

三、ReplicaSet

    ReplicaSet是ReplicationController的升级版,实现的功能是一致的,K8S推荐使用ReplicaSet。ReplicaSet对于选择器selector支持更多的表达模式,包括matchLabels和matchExpressions两种。

  • matchLabels

matchLabels支持多个标签同时匹配,如下:

 selector:
    matchLabels:
      app: busybox-prod
      app: nginx-rc
  • matchExpressions

matchExpressions支持更复杂的表达式,如下:

selector:
   matchExpressions:
      - key: app
        operator: In
        values:
          - busybox-prod
          - busybox-test
          - busybox-dev

其中运算符operator支持:

In:Label的值必须与其中一个指定的values匹配。
NotIn:Label的值与任何指定的values不匹配。
Exists:pod必须包含一个指定名称的标签(值不重要)。使用此运算符时,不应指定
values字段。
DoesNotExist:pod不得包含有指定名称的标签。values属性不得指定。

下面我们用ReplicaSet来改写上面的例子的yaml文件为 nginx-rs.yaml,内容如下:

[root@k8s-master yaml]# cat nginx-rs.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 4 
  selector:
    matchLabels:
     app: nginx-rs
  template:
    metadata:
      name: nginx
      labels:
        app: nginx-rs
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

接下来,执行指令创建rs,并查看结果

[root@k8s-master yaml]# kubectl apply -f nginx-rs.yaml 
replicaset.apps/nginx created
[root@k8s-master yaml]# kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
nginx   4         4         4       45s
[root@k8s-master yaml]# kubectl get pod -l app=nginx-rs
NAME          READY   STATUS    RESTARTS   AGE
nginx-ht9cg   1/1     Running   0          114s
nginx-kbc9d   1/1     Running   0          114s
nginx-lzf59   1/1     Running   0          114s
nginx-qkxv9   1/1     Running   0          114s

可以看到,创建了一个RS对象,并正确的生成了4个标签为nginx-rs的Pod副本。

其他的功能可以参考rc。

四、Deployment

     前面讲的RC,RS虽然能解决弹性扩缩容,确保既定副本数的Pod,但是在实际工程中,扩缩容仅是其中一个场景,比如在版本发布过程中如何进行灰度,版本升级,回滚等,那这些问题需要使用Deployment控制器才能解决。K8S也推荐使用Deployment,不推荐直接使用RC或者RS。

1、创建Deployment

编辑ngnix-deploy.yaml文件,内容如下:

[root@k8s-master yaml]# cat nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-deploy
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

yaml文件的结构和RC,RS基本类似。其模型为:

 执行该文件创建deployment对象,并查看pod对象

[root@k8s-master yaml]# kubectl apply -f nginx-deploy.yaml 
deployment.apps/nginx-deployment created
[root@k8s-master yaml]# kubectl get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           9m32s
[root@k8s-master yaml]# kubectl get pod -l app=nginx-deploy
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7bfc746ff9-8mxzj   1/1     Running   0          2m55s
nginx-deployment-7bfc746ff9-gpgm6   1/1     Running   0          2m55s
nginx-deployment-7bfc746ff9-w5hhw   1/1     Running   0          2m55s

     可以看到,创建一个deployments对象,并按照设定的replicas,启动了3个副本pod。我们再来看下rs列表。

[root@k8s-master yaml]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-7bfc746ff9   3         3         3       9m6s

    我们并没有在yaml文件中定义rs,这里为何自动生成了RS对象呢(以deployment名字为前缀)?实际上,Deployment是通过ReplicaSet操控Pod的,他们之间的关系:

 2、升级

     接下来,我们需要将nginx的版本从1.14.2更新到1.16.1。可以使用如下指令更新

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

或者

kubectl edit deployment/nginx-deployment

   更新完成后,我们看下pod列表,已经完成了Pod实例的替换和升级。

[root@k8s-master ~]# kubectl get pod -l app=nginx-deploy
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-588b64cc48-7tmp6   1/1     Running   0          4m31s
nginx-deployment-588b64cc48-b9s4n   1/1     Running   0          5m23s
nginx-deployment-588b64cc48-bg9m2   1/1     Running   0          4m30s

查看其中一个pod的ngnix版本号,已经升级到1.16.1版本。

[root@k8s-master ~]# kubectl describe pod nginx-deployment-588b64cc48-7tmp6
....
Containers:
  nginx:
    Container ID:   docker://9ce7482f41624bf48cfabf1fbb866f35371a23e62818d23f21dad474bcf8c48c
    Image:          nginx:1.16.1
....

那么deployment是如何做到的呢?在deployment的详情事件信息记录着这一过程。

[root@k8s-master ~]#  kubectl describe deployments nginx-deployment
....
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  28m   deployment-controller  Scaled up replica set nginx-deployment-588b64cc48 to 1
  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled down replica set nginx-deployment-7bfc746ff9 to 2
  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled up replica set nginx-deployment-588b64cc48 to 2
  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled down replica set nginx-deployment-7bfc746ff9 to 1
  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled up replica set nginx-deployment-588b64cc48 to 3
  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled down replica set nginx-deployment-7bfc746ff9 to 0

      一开始 产生了一个新的ReplicaSet控制器对象(nginx-deployment-588b64cc48),并将replica设置为1,即新增一个新Pod;再通过老的ReplicaSet控制器对象(nginx-deployment-7bfc746ff9),设置replica为2,即将老的Pod缩减到2。如此循环,其过程就是新Pod递增,而老Pod递减的过程。需要注意的是,老的Pod删除了,但是老的RS对象依然保留,只是控制的pod为0,保留的目的是为了版本回滚,后面详细介绍。

 其过程示意图如下:

    需要注意的是,新的Pod创建成功后,才会删除老的的Pod,所以在整个过程中,保证了新老Pod的可用副本数为3,确保不会影响业务的容量,而Pod副本数最多为4个。

     Deployment是通过一定的算法确保整个升级过程,其中有两个参数可以调整设置。

  • spec.strategy.rollingUpdate.maxUnavailable,最大不可用,用于指定在Deployment在更新的过程中不可用状态的Pod数据上限,可以是绝对值,也可以是百分比(基准为副本期望值),不过这个值要反过来算,如1.6版本后,该值默认为25%,那么可用Pod就为75%(向上取整)。比如副本数为3,3*75%=2.25,取整后为3,也就是升级期间,新老Pod的可用实例数至少有3个。
  • spec.strategy.rollingUpdate.maxSurge,最大峰值,用于指定在Deployment更新Pod的过程中
    Pod总数超过Pod期望副本数部分的最大值。可以是绝对值,也可以是百分比(基准为期望值,向上取整),1.6版本后,该值默认为25%,比如副本数为3,3*25%=0.75,取整后为1,也就是升级期间,新老Pod的总数不能超4(3+1)。

我们图示下整个过程(副本为3,maxUnavailable和maxSurge为默认值25%,即maxUnavailable=0,maxSurge=1)。 

3、灰度

    实际工程中,经常需要进行版本灰度,Deployment目前仅支持手动灰度。下面我们将部分版本升级到1.19.3。

kubectl set image deployment/nginx-deployment nginx=nginx:1.19.3

采用如下指令kubectl get rs -w 进行监控升级pod数

[root@k8s-master yaml]# kubectl get rs -w
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-588b64cc48   3         3         3       24m
nginx-deployment-86644697c5   1         1         1       12s
nginx-deployment-588b64cc48   2         3         3       24m

nginx-deployment-86644697c5 为新RS,nginx-deployment-588b64cc48 为老RS,当前已经升级了一个新版本pod。此时,我们手动停止升级,保持1个新版本pod,2个老版本pod进行灰度。指令如下:kubectl rollout pause deployment/<deployment name>

[root@k8s-master yaml]# kubectl rollout pause deployment/nginx-deployment
deployment.apps/nginx-deployment paused

当灰度完成后,手动再恢复升级,将余下的Pod也升级到新版本。指令:kubectl rollout resume deployment/<deployment name>

[root@k8s-master yaml]# kubectl rollout resume deployment/nginx-deployment
deployment.apps/nginx-deployment resumed

监控升级过程,完成剩余2个pod的升级。

[root@k8s-master yaml]# kubectl get rs -w
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-86644697c5   1         1         1       32s
nginx-deployment-588b64cc48   2         3         3       24m
nginx-deployment-86644697c5   2         1         1       32s
nginx-deployment-588b64cc48   2         3         3       24m
nginx-deployment-588b64cc48   2         2         2       24m
nginx-deployment-86644697c5   2         1         1       33s
nginx-deployment-86644697c5   2         2         1       33s
nginx-deployment-86644697c5   2         2         2       34s
nginx-deployment-588b64cc48   1         2         2       24m
nginx-deployment-86644697c5   3         2         2       34s
nginx-deployment-588b64cc48   1         2         2       24m
nginx-deployment-588b64cc48   1         1         1       24m
nginx-deployment-86644697c5   3         2         2       34s
nginx-deployment-86644697c5   3         3         2       34s
nginx-deployment-86644697c5   3         3         3       35s
nginx-deployment-588b64cc48   0         1         1       24m
nginx-deployment-588b64cc48   0         1         1       24m
nginx-deployment-588b64cc48   0         0         0       24m

    升级过程前面已经介绍,可以对照实例列表自行分析下。这种手动灰度升级,缺点很明显,没办法精确控制灰度Pod的个数。实际生产中,一般采用多个deployment分别控制不同的版本升级

4、回滚

     当升级失败后,需要回滚到某个正常版本。下面我们演示回滚的过程,首先升级到一个不存在的版本(1.91),模拟升级失败,然后再回滚到正常版本。

 升级一个失败版本。

kubectl set image deployment/nginx-deployment nginx=nginx:1.91

查看下rs列表

[root@k8s-master ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-588b64cc48   0         0         0       21h
nginx-deployment-76c486cd68   1         1         0       3m18s
nginx-deployment-86644697c5   3         3         3       21h

创建了新的RS(nginx-deployment-76c486cd68)进行升级,但是一直停留在1个副本。

继续看下pod状态

[root@k8s-master ~]# kubectl get pod -l app=nginx-deploy
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-76c486cd68-p2rxc   0/1     ImagePullBackOff   0          6m14s
nginx-deployment-86644697c5-g6fzd   1/1     Running            0          21h
nginx-deployment-86644697c5-g8m5c   1/1     Running            0          21h
nginx-deployment-86644697c5-v9vcs   1/1     Running            0          21h

新创建的pod(nginx-deployment-76c486cd68-p2rxc),拉取镜像失败,导致升级卡住了。

接下来,需要进行版本回滚,首先查看下有哪些历史版本可以回滚

[root@k8s-master ~]# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>
4         <none>

包括当前版本,一共有4个版本,我们继续查看下版本的详细信息,指令如下:kubectl rollout history deployment/<deployment name> --revision=<version>

[root@k8s-master ~]# kubectl rollout history deployment/nginx-deployment --revision=3
deployment.apps/nginx-deployment with revision #3
Pod Template:
  Labels:       app=nginx-deploy
        pod-template-hash=86644697c5
  Containers:
   nginx:
    Image:      nginx:1.19.3
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

可以看到,3版本对应的就是1.19.1。 我们需要回滚到这个版本,可以使用

kubectl rollout undo deployment/nginx-deployment默认回滚到上一个版本,

也可以使用kubectl rollout undo deployment/nginx-deployment --to-revision=3回滚到指定版本

[root@k8s-master ~]# kubectl rollout undo deployment/nginx-deployment --to-revision=3
deployment.apps/nginx-deployment rolled back

再看下rs列表

[root@k8s-master ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-588b64cc48   0         0         0       21h
nginx-deployment-76c486cd68   0         0         0       9m45s
nginx-deployment-86644697c5   3         3         3       21h

恢复到1.19.3版本的RS上(升级后,还需要保留老RS对象,目的就在于此)。继续看下pod列表

[root@k8s-master ~]# kubectl get pod -l app=nginx-deploy
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-86644697c5-g6fzd   1/1     Running   0          21h
nginx-deployment-86644697c5-g8m5c   1/1     Running   0          21h
nginx-deployment-86644697c5-v9vcs   1/1     Running   0          21h

刚才新创建的错误的pod已经删除了,回滚成功。

5、扩缩容

        Deployment是通过RS对象控制Pod,所以天然继承了RS的扩缩容的能力。这里我们使用更简便的指令方式实现扩缩容,指令如下:kubectl scale deploy <deploymentname> --replicas=<num>

[root@k8s-master ~]# kubectl scale deploy nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled

再查看下Pod的列表

[root@k8s-master ~]# kubectl get pod -l app=nginx-deploy
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-86644697c5-96q8l   1/1     Running   0          7s
nginx-deployment-86644697c5-g6fzd   1/1     Running   0          37h
nginx-deployment-86644697c5-g8m5c   1/1     Running   0          37h
nginx-deployment-86644697c5-v9vcs   1/1     Running   0          37h

 正确地扩容到4个Pod副本。

五、总结

    本章节介绍了弹性扩缩容相关的控制器RC,RS以及Deployment。

      RS与RC的功能一致,推荐使用RS,通过设置副本数,控制目标Pod实例的个数,在异常情况,自动增删Pod实例,确保副本数与目标值一致。

     Deployment是更高阶的控制器,通过RS来控制Pod,除了基本的扩缩容功能,还实现了版本升级,灰度,回滚等功能。

 附:

K8S初级入门系列之一-概述

K8S初级入门系列之二-集群搭建

K8S初级入门系列之三-Pod的基本概念和操作

K8S初级入门系列之四-Namespace/ConfigMap/Secret

K8S初级入门系列之五-Pod的高级特性

K8S初级入门系列之六-控制器(RC/RS/Deployment)

K8S初级入门系列之七-控制器(Job/CronJob/Daemonset)

K8S初级入门系列之八-网络

K8S初级入门系列之九-共享存储

K8S初级入门系列之十-控制器(StatefulSet)

K8S初级入门系列之十一-安全

K8S初级入门系列之十二-计算资源管理

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

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

相关文章

(汽车MCU)FS32K148UJT0VLLT、FS32K148HAT0MLLT、FS32K148UJT0VLUT基于32位Cortex-M4F内核 架构图

S32K 32位汽车通用微控制器 (MCU) 是一系列符合AEC-Q100标准、基于32位ARM Cortex-M4F内核的可扩展MCU&#xff0c;适用于通用汽车和高可靠性工业应用。这些系列提供具有可扩展性的软硬件兼容系列&#xff0c;有多种性能、存储器和特性可供选择。这些MCU提供ISO、CAN FD、CSEc硬…

如何使用curl下载github代码

首先通过chrome打开想要下载的源文件 如图&#xff0c;有那个下载图标时表示不需要鉴权即可下载&#xff0c;一般仓库都会开放只读权限&#xff0c;所以很大概率都有 比如我想下载这个crc32.c文件 那么我就需要知道它在哪个IP中&#xff0c;按下F12打开网络&#xff0c;点击下载…

qt学习——QMainWindow、基本控件

初识qt **QMainWindow——菜单栏和工具栏****状态栏、铆接部件、核心部件****资源文件得添加****模态和非模态对话框创建****消息对话框****其它标准对话框****登录窗口布局****控件按钮组****QListWidget控件****QTreeWidget树控件****QTableWidget控件****其他常用控件介绍**…

踩坑_vertical-align

目录 问题&#xff1a;vertical-align属性语法父元素的基线怎么找呢&#xff1f;特殊元素的基线行盒 解决 问题&#xff1a; 今天在做一个需求时遇到了如下问题&#xff1a; 代码 <style>*{margin:0;padding:0;}#app{width: 300px;height: 117px;background: #FFFFFF;bo…

验证回文串(力扣)双指针 JAVA

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#xf…

访客报警定位管理系统:提升安全管理水平的创新解决方案

在当前日益复杂的安全环境下&#xff0c;保障人员安全、提高安全响应能力和管理效率成为了各行各业的首要任务。 作为一种先进的安全管理解决方案&#xff0c;访客报警定位管理系统凭借其独特的优势和广泛的应用场景&#xff0c;正逐渐成为各行业安全管理的重要工具。 那么&a…

web前端设计师的主要职责说明(合集)

web前端设计师的主要职责说明1 职责&#xff1a; 1. 根据UI设计师提供的设计图&#xff0c;实现一流的Web界面&#xff0c;优化代码并保持在各浏览器下良好的兼容性; 2. Web前端表现层及与后端交互的架构设计和开发; 3. JavaScript程序模块开发&#xff0c;通用类库、框架编…

树莓派 使用 docker安装showdoc

最近在使用showdoc时感觉挺方便的&#xff0c;但是在树莓派上拉取showdoc对应的镜像时特别慢&#xff0c;熬了一天半发现镜像倒在了最后一步&#xff0c;重试了好几次都没有拉去下来。后来仔细阅读了官网操作文档再加一点小运气今天成功给安装成功了。 showdoc的安装环境&…

【本地电脑搭建Web服务器并用cpolar发布至公网

本地电脑搭建Web服务器并用cpolar发布至公网访问 随着互联网的快速发展&#xff0c;网络也成为我们生活中不可缺少的必要条件&#xff0c;为了能在互联网世界中有自己的一片天地&#xff0c;建立一个属于自己的网页就成为很多人的选择。但互联网行业作为资本密集的行业&#x…

企业网络安全合规框架体系

云安全联盟大中华区发布报告《企业网络安全合规框架体系》&#xff08;以下简称报告&#xff09;&#xff0c;该报告对典型业务场景给出了参考实例&#xff0c;供广大甲方单位、集成商、咨询机构参考。 近些年&#xff0c;随着国内网络安全领域相关法律、法规、政策文件、标准规…

Seata部署(Centos和Docker)

一、简介 Seata 是一款开源的分布式事务框架。致力于在微服务架构下提供高性能和简单易用的分布式事务服 务。在 Seata 开源之前&#xff0c;Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的⻆ 色&#xff0c;帮助经济体平稳的度过历年的双11&#xff0c…

Unity+chatgpt+webgl实现声音录制+语音识别

一、前言 AI二次元女友这个项目持续更新&#xff0c;在window端的语音识别和语音合成的功能&#xff0c;在上一篇博文里已经详细说明了微软Azure语音服务的代码实现。也是为了实现一次代码&#xff0c;多端复用这样的诉求&#xff0c;所以全部的代码实现都改成了web api的方式…

openSUSE leap 15.3安装mysql-community-server

openSUSE Software 下载"https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" wget "https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" 双击"mysql-community-server.ymp" 添…

Flutter Windows通过嵌入Native窗口实现渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频&#xff08;本章&#xff09; 文章目录 Flutter视频渲染系列前言…

FPGA XDMA 中断模式实现 PCIE3.0 QT上位机图片传输 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案图像产生、发送、缓存XDMA简介XDMA中断模式图像读取、输出、显示QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采…

【深度学习之YOLO8】环境部署

目录 一、确定版本CUDA toolkit、cuDNN版本Python、PyTorch版本 二、安装Python下载环境变量验证安装 三、安装Anaconda安装环境变量验证安装创建conda虚拟环境常用命令 四、安装CUDA toolkit下载环境变量验证安装 五、配置cuDNN下载 六、安装PyTorch(torchtorchversiontorchau…

JavaWeb课程设计项目实战(05)——项目编码实践2

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在本节教程中&#xff0c;我们完成项目的登录功能。 User 请在bean包中创建User类&#xff0c;代码如下&#xff1a; package com.cn.bean; /*** 本文作者&#xff1a;谷…

离线安装mysql8

一、先前往官网下载mysql8 下载地址&#xff1a; https://dev.mysql.com/downloads/ 选择Linux 二、删除Linux中的mysql&#xff08;如果有的话&#xff09;&#xff0c;上传安装包 1、先查看mysql是否存在&#xff0c;命令如下&#xff1a; rpm -qa|grep -i mysql 如果使用…

集成了Eureka的应用启动失败,端口号变为8080

问题 报错&#xff1a;集成了Eureka的应用启动失败&#xff0c;端口号变为8080。 原来运行的项目&#xff0c;突然报错&#xff0c;端口号变为8080&#xff1a; Tomcat initialized with port(s): 8080 (http)并且&#xff0c;还有如下的错误提示&#xff1a; RedirectingE…

keil5编辑器主题配色美化使用(附六款暗黑主题)

一、通过配置文件修改主题 1、在软件安装目下备份以下三个文件&#xff0c;更换主题只需要替换global.prop arm.propglobal.propglobal.prop.def 2、替换配置文件 将已经准备好的配色文件复制到\UV4下替换 https://download.csdn.net/download/qq_43445867/88064961 Theme1…