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

一、前言

     K8S集群中着这各类资源,比如计算资源,API资源等,其中最重要的是计算资源,包括CPU,缓存,存储等。管理这些资源就是要在资源创建时进行约束和限制,在运行时监控这些资源的指标,确保资源在高于或低于既定范围内,能自动伸缩,有序调度,使得整个集群健康可控。

   本章重点讲述K8S如何进行计算资源的管理。

二、request和limit

      我们之前在创建Pod时,都没有对容器的使用的CPU和Memory进行约束,容器对于这些计算资源的使用可以"随心所欲",但是K8S集群中每个节点的资源是有限的,一旦超额使用,有可能导致节点上其他Pod异常,乃至节点,甚至集群崩溃。

      K8S对于Pod中每个容器通过设置Requet和Limit来进行限制。Requests表示容器申请时的最小需求量,Limits表示容器运行的最大限制量。其关系如下图所示,limit资源限制量要高于request资源限制量。

      这里的资源包括 CPU和Memory,CPU的资源单位一般为m(毫核,1000毫核=1个核),Memory的资源单位为Mi,Gi等(1Mi=1024*1024B)。

 1、Requests

     Requests是申请时的最小值限制值,节点上的剩余资源需要满足Pod的Requests要求,才能被调度上来。如下图所示: 

      节点1的CPU和Memory可以满足Pod的Requests,节点2剩余的CPU满足Pod的Requests要求,但是Memory却不满足,所以该Pod可以被调度到节点1上,但无法调度到节点2上。

        Requests的资源值是为K8S管理调度而服务的,一旦节点的所有Pod的Requests资源和,超过节点的总资源量,将不再有Pod调度到该节点,即使这些Pod在实际运行中,消耗的资源比申请时的要少。我们来看下面的实例。

        一个节点资源总数,CPU为2个核,Memory为3Gi,其上已调度两个Pod运行,此时有个PodC需要调度,能否调度到该节点,其资源分析:

request资源使用资源
CPUMemoryCPUMemory
Pod A11.50.51
Pod B0.50.50.10.3
当前总量1.520.61.3
Pod C1111
调度后总量2.5>23=31.6<22.3<3

      答案是否定的,虽然从使用资源上,Pod C是可以调度到该节点后,但是调度时看的是Requests资源量,而非实际使用量。接下来,我们看下Requests的两个资源值定义.

(1)spec.container[].resources.requests.cpu

     request的CPU是设置在container上的,一方面是服务于K8S的管理调度(如上面所说),另一方面,作为参数传给容器,用于定义时间比例。

      在容器运行中,CPU的分配是按照时间分配的,而并不是实际的CPU个数。比如某个容器定义了200m,而该节点有2个核,如果其他的容器不负载,那么该容器是可以使用2核CPU的。

      在多个容器产生CPU竞争时,CPU的时间是如何划分的呢?比如某个节点下有两个容器,分别申请200m,400m的CPU资源,那么就按照1:2的比例将CPU资源分配给这两个容器使用。

(2)spec.container[].resources.requests.memory

     这个参数值只提供给Kubernetes调度器作为调度和管理的依据,不会作为任何参数传

递给 Docker,也不会对运行时内存分配产生影响
       下面我们就来实践一个案例。首先我们看下node的资源
[root@k8s-master yaml]# kubectl describe node k8s-node1
...
Allocatable:cpu:                2ephemeral-storage:  37986740981hugepages-1Gi:      0hugepages-2Mi:      0memory:             3911712Kipods:               110
....
Resource           Requests    Limits--------           --------    ------cpu                350m (17%)  0 (0%)memory             90Mi (2%)   0 (0%)ephemeral-storage  0 (0%)      0 (0%)hugepages-1Gi      0 (0%)      0 (0%)hugepages-2Mi      0 (0%)      0 (0%)

       k8s-node1节点一共2核4Mi(近似),已经用去了350m核,90Mi(注意,这是个Requests额度)。所以理论上还能申请的只有1650m核,以及3910Mi。

       我们创建一个pod,使其request资源数超过剩余资源数(cpu为2000Mi),其yaml文件如下:

[root@k8s-master yaml]# cat request-nginx-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: request-nginx-podlabels: app: nginx-pod 
spec:containers:- name: nginximage: nginx:1.8resources:requests:memory: "500Mi"cpu: "2000m"

我们执行下这个文件,并创建Pod

[root@k8s-master yaml]# kubectl apply -f request-nginx-pod.yaml 
pod/request-nginx-pod created
[root@k8s-master yaml]# kubectl get pods
NAME                                      READY   STATUS                   RESTARTS            AGE
request-nginx-pod                         0/1     Pending                  0                   8s
[root@k8s-master yaml]# kubectl describe pod request-nginx-pod 
Events:Type     Reason            Age                From               Message----     ------            ----               ----               -------Warning  FailedScheduling  55s (x2 over 77s)  default-scheduler  0/2 nodes are available: 1 Insufficient cpu, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.

      可以看到,两个node都无法满足,k8s-node1是因为CPU不满足要求(1 Insufficient cpu),而k8s-master是因为主节点,不满足调度容忍度要求。

     我们修改下CPU的Requests值为500m核

[root@k8s-master yaml]# cat request-nginx-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: request-nginx-podlabels: app: request-nginx-pod 
spec:containers:- name: nginximage: nginx:1.8resources:requests:memory: "500Mi"cpu: "500m"

再次执行后,正确调度并运行。

[root@k8s-master yaml]# kubectl get pod
NAME                                      READY   STATUS                   RESTARTS            AGE
request-nginx-pod                         1/1     Running                  0                   8m34s
此时我们在看下节点的已使用额度。
[root@k8s-master yaml]# kubectl describe node k8s-node1
...
Allocated resources:(Total limits may be over 100 percent, i.e., overcommitted.)Resource           Requests     Limits--------           --------     ------cpu                850m (42%)   0 (0%)memory             590Mi (15%)  0 (0%)
...

此时的已用资源已经加上了刚才pod申请的资源。

2、limits

Pod要想调度到节点上,节点的资源必须满足Requests要求。但是Pod运行起来后,其耗用的资源量,有可能小于request定义值,也有可能大于。如果小于情况下,对于节点运行没有影响,最坏是引起资源的浪费,但是大于的情况下,就有可能由于某个Pod的资源过多,导致节点崩溃。

     为了确保节点运行正常,K8S提供了 limits配置,limits可以认为是动态量最大值限制。与Requests类似,可以设置cpu和memory两个值。

(1)spec.container[].resources.limits.cpu   

       这里cpu最终会转化为容器的–cpu-period参数(一个周期内能运行的时间),它会与–cpu-period(一个周期时间)一起,决定在一个周期内,最多分配给该容器的运行时间。

(2)spec.container[].resources.limits.memory

     该值会转化为容器的--memory参数,为内存的限制值,由于内存是不可压缩资源,一旦超标,就会导致容器kill或者重启,但是,不一定是当前的超标容器,这需要看容器的QoS等级。

3、Qos等级

     在一个超卖的系统中,QoS等级决定着哪个容器第一个被杀掉,这样释放出的资源可以提供给高优先级的Pod使用。那如何判断谁的优先级高呢,K8S将容器划分为3个QoS等级,从高到低,分别为Guaranteed(完全可靠的)、Burstable(弹性波动、较可靠的)和BestEffort(尽力而为、不太可靠的).

(1)Guaranteed

      Guaranteed这个等级是指, Pod中所有容器的资源都都定义了Limits和Requests,且所有容器的Limits值都和Requests值相等,需要注意的是,容器中仅定义Limits,没有定义Requests,那么Requests默认等于Limits。也是属于Guaranteed级别,如下面的例子

[root@k8s-master yaml]# cat guaranteed-ngnix-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: guaranteed-nginx-podlabels: app: guaranteed-nginx-pod 
spec:containers:- name: nginximage: nginx:1.8resources:requests:memory: "50Mi"cpu: "50m"limits:memory: "50Mi"cpu: "50m"

(2)BestEffort

如果Pod中所有容器都未定义配置资源,即Request和Limits都未定义,那么该Pod就是BestEffort。前面章节中我们定义Pod都属于这类。
[root@k8s-master yaml]# cat bestEffort-ngnix-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: bestEffort-nginx-podlabels: app: bestEffort-nginx-pod 
spec:containers:- name: nginximage: nginx:1.8

(3)Burstable

     除了以上两种状态,其他的都属于Burstable,这类的配置情况比较多,比如一部分容器都配置了Requests和Limits值,其Requests小于Limits值;一部分容器仅配置了Request值,另一部分容器仅配置了Limits值等等。如下面的例子:

[root@k8s-master yaml]# cat burstable-ngnix-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: burstable-nginx-podlabels: app: burstable-nginx-pod 
spec:containers:- name: nginximage: nginx:1.8resources:requests:memory: "30Mi"cpu: "30m"limits:memory: "50Mi"cpu: "50m"

(4)Qos的工作特点

      Qos主要是针对不可压缩资源,也就是内存,当内存资源紧缺的情况下,会按照优先级从低到高,也就是BestEffort->Burstable->Guaranteed进行Pod的回收。

     对于同一级别的Pod,计算内存实际使用量与内存申请量比例,比例高的会优先kill(与内存实际使用量绝对值没有关系)。如下图所示:

 三、LimitRange

      以上介绍,我们了解了Requests和Limits的作用,但是需要为每个Pod中的容器配置,其工作是相当繁琐的,一方面,默认的情况下,容器是没有配置的,对于重要容器的Qos无法得到保证,另一方面,容器资源配置没有限制,理论上可以配置整个节点的资源。为了解决这些问题,K8S提供了LimitRange准入控制器,以命名空间为维度,进行全局的限制。我们来创建一个LimitRange对象。

[root@k8s-master yaml]# cat limitrang-dev.yaml 
apiVersion: v1
kind: LimitRange
metadata:name: limitrang-devnamespace: dev
spec:limits:- type: Pod  # 对于Pod的资源限制定义min:   # Pod中所有容器的Requests值的总和下限cpu: "100m"memory: "50Mi"max:  # Pod中所有容器的Limits值的总和上限cpu: "4"memory: "4Gi"maxLimitRequestRatio: #Pod中所有容器的Limits值与Requests值比例上限cpu: 10memory: 20 - type: Container # 对于Container的资源限制定义default: # 容器没有指定limits值的默认值cpu: "500m"memory: "500Mi" defaultRequest: # 容器没有指定Requests值的默认值cpu: "100m"memory: "50Mi" max: # 容器中的Limits的上限值cpu: "1"memory: "1Gi"min: # 容器中的Requests的下限值cpu: "50m"memory: "30Mi"maxLimitRequestRatio: #容器的Limits值与Requests值比例上限cpu: 10memory: 20

     相关参数的意义,参见注释。limitRange可以对Pod和Container进行资源限制,Max是对limits值上限的限制,Min是对Requests值的下限限制,maxLimitRequestRatio是对Limits与Requests比例值的最大值的限制。除此之外,对于容器,还增加了default和defaultRequest属性,如果没有定义,则使用默认值。

  执行该文件,创建 limitRange对象。

[root@k8s-master yaml]# 
[root@k8s-master yaml]# kubectl apply -f limitrang-dev.yaml 
limitrange/limitrang-dev created
[root@k8s-master yaml]# kubectl get limits --namespace=dev
NAME            CREATED AT
limitrang-dev   2023-07-02T04:35:15Z

   下面我们分别来测试几种场景,看下limitRange是否能按照配置的进行准入限制。

1、不配置Requests和Llimits值

   此种情况下,看下能否按照默认值进行配置,创建Pod的yaml文件,内容如下:

[root@k8s-master yaml]# cat limitrange-default-nginx-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: limitrange-default-nginx-podlabels: app: limitrange-default-nginx-podnamespace: dev 
spec:containers:- name: nginximage: nginx:1.8

创建完成后,看下Pod的详情

[root@k8s-master yaml]# kubectl describe pod  limitrange-default-nginx-pod --namespace=dev
...
Containers:nginx:Container ID:   docker://5a6e415f45125b8d824f73f081dc3ead845b21487537552b2b0cc23e015ffdcaImage:          nginx:1.8Image ID:       docker-pullable://nginx@sha256:c97ee70c4048fe79765f7c2ec0931957c2898f47400128f4f3640d0ae5d60d10Port:           <none>Host Port:      <none>State:          RunningStarted:      Sun, 02 Jul 2023 12:59:17 +0800Ready:          TrueRestart Count:  0Limits:cpu:     500mmemory:  500MiRequests:cpu:        100mmemory:     50MiEnvironment:  <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5ckfr (ro)
....

   可以看到,正确的写入了limitRange的默认值。

2、创建超过限制资源配置的Pod

  创建Pod,其yaml文件内容如下:

[root@k8s-master yaml]# cat limitrange-nok-nginx-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: limitrange-nok-nginx-podlabels: app: limitrange-nok-nginx-podnamespace: dev 
spec:containers:- name: nginximage: nginx:1.8resources:requests:memory: "30Mi"cpu: "30m"limits:memory: "50Mi"cpu: "50m"

执行该文件,创建Pod

[root@k8s-master yaml]# kubectl apply -f limitrange-nok-nginx-pod.yaml 
Error from server (Forbidden): error when creating "limitrange-nok-nginx-pod.yaml": pods "limitrange-nok-nginx-pod" is forbidden: [minimum cpu usage per Pod is 100m, but request is 30m, minimum memory usage per Pod is 50Mi, but request is 31457280, minimum cpu usage per Container is 50m, but request is 30m]

      可以看到,该Pod中只有一个容器,所以即违反了Pod总量最小值要求,又违反了容器对于cpu的最低要求,创建失败。

3、创建一个正常的Pod

创建Pod,其yaml内容如下:

[root@k8s-master yaml]# cat limitrange-ok-nginx-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: limitrange-ok-nginx-podlabels: app: limitrange-ok-nginx-podnamespace: dev 
spec:containers:- name: nginximage: nginx:1.8resources:requests:memory: "50Mi"cpu: "100m"limits:memory: "500Mi"cpu: "500m"

执行该文件,创建Pod

[root@k8s-master yaml]# kubectl apply -f limitrange-ok-nginx-pod.yaml 
pod/limitrange-ok-nginx-pod created
[root@k8s-master yaml]# kubectl describe pod limitrange-ok-nginx-pod --namespace=dev
...Restart Count:  0Limits:cpu:     500mmemory:  500MiRequests:cpu:        100mmemory:     50Mi
...

可以看到,Pod创建成功。

四、ResourceQuota

     通过limitRange可以实现在命名空间下,对于每个Pod和以及Pod下每个容器的资源限制,但是无法限制所有Pod的资源总额,在实际工程中,在同一集群中,给予不同命名空间(不同业务)的总资源是需要约束的,否则容器出现资源被某类业务独占,其他业务无法申请的情况。limitRange与ResourceQuota的关系如下图所示:

 创建ResourceQuota对象,其yaml如下:

[root@k8s-master yaml]# cat resourcequota-dev.yaml 
apiVersion: v1 
kind: ResourceQuota
metadata:name: resourcequota-resource-devnamespace: dev 
spec: hard: requests.cpu: 200m requests.memory: 200Mi limits.cpu: 400m limits.memory: 400Mi

这里定义了在namespace:dev下,Requests以及Limits的cpu和memory总和。

我们先删除dev命名空间下所有的pod,再执行该文件。

[root@k8s-master yaml]# kubectl apply -f resourcequota-dev.yaml 
resourcequota/resourcequota-resource-dev created
[root@k8s-master yaml]# kubectl get resourcequota --namespace=dev 
NAME                         AGE   REQUEST                                          LIMIT
resourcequota-resource-dev   41s   requests.cpu: 0/200m, requests.memory: 0/200Mi   limits.cpu: 0/400m, limits.memory: 0/400Mi

我们再来创建 前一章节的limitrange-ok-nginx-pod,看下能否创建成功

[root@k8s-master yaml]# kubectl apply -f limitrange-ok-nginx-pod.yaml 
Error from server (Forbidden): error when creating "limitrange-ok-nginx-pod.yaml": pods "limitrange-ok-nginx-pod" is forbidden: exceeded quota: resourcequota-resource-dev, requested: limits.cpu=500m,limits.memory=500Mi, used: limits.cpu=0,limits.memory=0, limited: limits.cpu=400m,limits.memory=400Mi

        因为在resourcequota中定义了limits的cpu和memory总和分别为400m和400Mi,但是在limitrange-ok-nginx-pod中配置limit资源分别为500m和500Mi,这样就超过了总和的限制,导致创建失败。

ResourceQuota除了限制计算资源总和,还可以限制对象资源的个数,主要包括:

  • Pod
  • ReplicationController
  • Secret
  • ConfigMap
  • Persistent Volumn Clain
  • Service

接下来,我们在创建一个限制对象资源总和的ResourceQuota的例子,其yaml内容如下:

[root@k8s-master yaml]# cat resourcequota-object-dev.yaml
apiVersion: v1 
kind: ResourceQuota
metadata:name: resourcequota-object-devnamespace: dev 
spec: hard:pods: 2services: 5

大家感兴趣,可以自行完成对象资源的验证。

五、总结

     本篇主要介绍了K8S对于计算资源的管理,主要是针对CPU和Memory资源。

     Requests和Limits作为资源管理最基本两个设置,Requests是容器申请时最小限制,主要用于K8S在Pod调度时,节点的剩余资源能否满足Pod的要求。Limits是容器运行时的最大限制,主要控制Pod运行时,对于资源超额使用的限制,一旦超过Limits定义的量,就有可能引起Pod的kill或者重启。

    K8S将Pod划分为三个QoS等级,优先级从高到低分别为Guaranteed、Burstable和BestEffort。一旦资源超卖,就会从低到高选择Pod进行kill,将资源保障给高优先级的Pod。

     LimitRange是以命名空间的维度,对Pod进行统一配置限制值和默认值,从而避免逐个配置Pod的繁琐。

  ResourceQuota是以命名空间的维度,对于资源总额进行限制。

 附:

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.mzph.cn/news/10786.shtml

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

相关文章

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLA…

idea中创建请求基本操作

文章目录 说明效果创建GET请求没有参数带有参数带有环境变量带有动态参数 说明 首先通过###三个井号键来分开每个请求体&#xff0c;然后请求url和header参数是紧紧挨着的&#xff0c;请求参数不管是POST的body传参还是GET的parameter传参&#xff0c;都是要换行的&#xff0c;…

OSI模型简介及socket,tcp,http三者之间的区别和原理

1.OSI模型简介&#xff08;七层网络模型&#xff09; OSI 模型(Open System Interconnection model)&#xff1a;一个由国际标准化组织提出的概念模型&#xff0c;试图提供一个使各种不同的计算机和网络在世界范围内实现互联的标准框架。 它将计算机网络体系结构划分为七层,每…

苹果safari浏览器播放不了video标签视频

今天遇到了个神奇的问题&#xff0c;视频文件在pc端和安卓手机上播放都没问题&#xff0c;但是在ios上就是播放不了&#xff0c;大概代码如下&#xff1a; 前端代码&#xff1a; <video id"video" width"350" height"500" controls><s…

EMP-SSL: TOWARDS SELF-SUPERVISED LEARNING IN ONETRAINING EPOCH

Recently, self-supervised learning (SSL) has achieved tremendous success in learning image representation. Despite the empirical success, most self-supervised learning methods are rather “inefficient” learners, typically taking hundreds of training epoch…

TCP状态转换图

TCP状态转换图 了解TCP状态转换图可以帮助开发人员查找问题. 说明: 上图中粗线表示主动方, 虚线表示被动方, 细线部分表示一些特殊情况, 了解即可, 不必深入研究. 对于建立连接的过程客户端属于主动方, 服务端属于被动接受方(图的上半部分) 而对于关闭(图的下半部分), 服务端…

政策加持智能家居市场,涂鸦赋能客户打造“以人为本”智能生活新方式

7月18日&#xff0c;商务部等13部门联合发布了《关于促进家居消费若干措施的通知》&#xff08;以下简称《通知》&#xff09;&#xff0c;《通知》指出&#xff0c;创新培育智能消费&#xff0c;支持企业运用物联网、云计算、人工智能等技术&#xff0c;着重加快智能家电、智能…

无涯教程-jQuery - jQuery.get( url, data, callback, type )方法函数

jQuery.get(url&#xff0c;[data]&#xff0c;[callback]&#xff0c;[type])方法使用GET HTTP请求从服务器加载数据。 该方法返回XMLHttpRequest对象。 jQuery.get( url, [data], [callback], [type] ) - 语法 $.get( url, [data], [callback], [type] ) 这是此方法使用的…

【数据结构】实验二:顺序表

实验二 顺序表 一、实验目的与要求 1&#xff09;熟悉顺序表的类型定义&#xff1b; 2&#xff09;熟悉顺序表的基本操作&#xff1b; 3&#xff09;灵活应用顺序表解决具体应用问题。 二、实验内容 1&#xff09;在一个整数序列a1,a2,…,an中&#xff0c;若存在一个数&…

【Linux网络】 网络套接字(三)socket编程_TCP网络程序

目录 TCP网络程序服务端创建套接字并绑定服务端监听服务端获取连接服务器处理请求 客户端客户端创建套接字客户端连接服务器客户端发起请求测试 服务器存在的问题多进程版的TCP网络程序多线程版的TCP网络程序线程池版的TCP网络程序 TCP网络程序总结图 TCP网络程序 服务端 创建…

Dubbo

Dubbo 简介Dubbo的快速入门Dubbo的基本架构安装DubboAdmin入门案例Dubbo的最佳实践 Dubbo的高级特性启动检查多版本超时与重试负载均衡SpringCloud整合Dubbo案例 简介 Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。 致力于提高性能和透明化的RPC远程服务调用方…

Jenkins+Docker+Docker-Compose自动部署,SpringCloud架构公共包一个任务配置

前言 Jenkins和docker的安装&#xff0c;随便百度吧&#xff0c;实际场景中我们很多微服务的架构&#xff0c;都是有公共包&#xff0c;肯定是希望一个任务能够把公共包的配置加进去&#xff0c;一并构建&#xff0c;ok&#xff0c;直接上干货。 Jenkins 全局环境安装 pwd e…

DSA之图(4):图的应用

文章目录 0 图的应用1 生成树1.1 无向图的生成树1.2 最小生成树1.2.1 构造最小生成树1.2.2 Prim算法构造最小生成树1.2.3 Kruskal算法构造最小生成树1.2.4 两种算法的比较 1.3 最短路径1.3.1 两点间最短路径1.3.2 某源点到其他各点最短路径1.3.3 Dijkstra1.3.4 Floyd 1.4 拓扑排…

机器学习:Bert and its family

Bert 先用无监督的语料去训练通用模型&#xff0c;然后再针对小任务进行专项训练学习。 ELMoBertERNIEGroverBert&PALS Outline Pre-train Model 首先介绍预训练模型&#xff0c;预训练模型的作用是将一些token表示成一个vector 比如&#xff1a; Word2vecGlove 但是对于…

微服务契约测试框架-Pact

契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试&#xff0c;通过契约进行解耦&#xff0c;变成 Consumer 与 Provider 端两个各自独立的、异步的单元测试。 契约测试的优点&#xff1a; 契约测试与单元测试以及其它测试之间没有重复&#xff0c…

Google Earth Engine谷歌地球引擎提取多波段长期反射率数据后绘制折线图并导出为Excel

本文介绍在谷歌地球引擎GEE中&#xff0c;提取多年遥感影像多个不同波段的反射率数据&#xff0c;在GEE内绘制各波段的长时间序列走势曲线图&#xff0c;并将各波段的反射率数据与其对应的成像日期一起导出为.csv文件的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engi…

图为科技T501赋能工业机器人 革新传统工业流程

工业机器人已成为一个国家制造技术与科技水平的重要衡量标准&#xff0c;在2019年&#xff0c;中国工业机器人的组装量与产量均位居了全球首位。 当前&#xff0c;工业机器人被广泛用于电子、物流、化工等多个领域之中&#xff0c;是一种通过电子科技和机械关节制作出来的智能机…

浏览器端代理proxy 解决跨域

一.环境:使用expresshttp-proxy-middleware 直接上代码 // include dependencies const express require( express);//node内置的path模块导入 const path require("path")const { createProxyMiddleware } require( http-proxy-middleware); // 需要代理后端服…

行为型设计模式之策略模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

【万字长文】SpringBoot整合SpringSecurity+JWT+Redis完整教程(提供Gitee源码)

前言&#xff1a;最近在学习SpringSecurity的过程中&#xff0c;参考了很多网上的教程&#xff0c;同时也参考了一些目前主流的开源框架&#xff0c;于是结合自己的思路写了一个SpringBoot整合SpringSecurityJWTRedis完整的项目&#xff0c;从0到1写完感觉还是收获到不少的&…