【云原生】Kubernetes----Metrics-Server组件与HPA资源
目录
引言
一、概述
(一)Metrics-Server简介
(二)Metrics-Server的工作原理
(三)HPA与Metrics-Server的作用
(四)HPA与Metrics-Server的关系
(五)HPA与Metrics-Server的重要性
二、部署metrics-server组件
(一)镜像获取
1.本地上传镜像包
2.GitHub下载
3.国内云下载
(二)安装metrics-server组件
1.获取yaml文件
2.修改文件内容
3.创建资源
4.验证是否安装成功
三、部署HPA
(一)创建deployment
(二)创建HPA资源
(三)进行压测
四、命名空间的资源限制
(一)创建命名空间
(二)对资源数量的限制
(三)对资源配额的限制
引言
在Kubernetes集群中,为了确保资源的有效利用和应用的高可用性,我们通常需要监控集群中各个Pod的资源使用情况,并根据这些信息进行相应的调整。Horizontal Pod Autoscaler (HPA) 就是这样一种机制,它可以根据Pod的资源使用情况自动调整Pod的副本数量。而Metrics-Server,作为Kubernetes的一个核心组件,为HPA提供了关键的度量数据支持。本文将详细解析Metrics-Server与HPA之间的关系、工作原理以及它们在实际应用中的重要性
一、概述
(一)Metrics-Server简介
Metrics-Server是Kubernetes的一个附加组件,用于收集集群中各个资源的度量数据,如CPU、内存等。这些数据通过Kubernetes API Server暴露给外部用户或组件,以供它们进行决策或分析。在Kubernetes 1.8版本之前,通常使用Heapster作为度量数据的收集者,但自1.8版本起,Heapster被废弃,Metrics-Server成为了推荐的替代方案
(二)Metrics-Server的工作原理
Metrics-Server的工作原理相对简单,它定期从Kubernetes集群中的各个节点上收集度量数据,并将这些数据聚合后存储在内存中。然后,当外部用户或组件(如HPA)需要查询这些度量数据时,Metrics-Server会通过Kubernetes API Server提供相应的API接口进行响应。由于Metrics-Server只存储最近一段时间的度量数据(默认为1分钟),因此它不会成为集群的存储瓶颈

cAdvisor: 用于收集、聚合和公开 Kubelet 中包含的容器指标的守护程序。
kubelet: 用于管理容器资源的节点代理。 可以使用 /metrics/resource 和 /stats kubelet API 端点访问资源指标。
节点层面资源指标: kubelet 提供的 API,用于发现和检索可通过 /metrics/resource 端点获得的每个节点的汇总统计信息。
metrics-server: 集群插件组件,用于收集和聚合从每个 kubelet 中提取的资源指标。 API 服务器提供 Metrics API 以供 HPA、VPA 和 kubectl top 命令使用。Metrics Server 是 Metrics API 的参考实现。
(三)HPA与Metrics-Server的作用
Metrics-Server组件的作用:获取集群中的pod、节点等负载信息
HPA资源的作用:通过Metrics-Server获取的负载信息,自动伸缩的创建或者删除pod
(四)HPA与Metrics-Server的关系
HPA是Kubernetes的一个自动扩展控制器,它可以根据Pod的资源使用情况自动调整Pod的副本数量。而Metrics-Server为HPA提供了关键的度量数据支持。当HPA需要决定是否需要扩展或缩减Pod的副本数量时,它会通过Kubernetes API Server查询Metrics-Server收集的度量数据,然后根据这些数据进行决策。
例如,如果某个Deployment的Pod的CPU利用率超过了设定的阈值,HPA就会增加该Deployment的Pod副本数量;反之,如果CPU利用率过低,HPA就会减少Pod副本数量
(五)HPA与Metrics-Server的重要性
Metrics-Server和HPA在Kubernetes集群中扮演着至关重要的角色。Metrics-Server通过收集集群中各个资源的度量数据,为外部用户或组件提供了丰富的信息支持;而HPA则利用这些信息实现了Pod的自动扩展和缩减,从而确保了集群资源的有效利用和应用的高可用性。
在实际应用中,Metrics-Server和HPA可以帮助我们解决以下问题:
资源浪费:通过自动扩展和缩减Pod的副本数量,可以避免因资源分配不均或过度分配而导致的资源浪费。
应用性能:当应用面临高并发或高负载时,HPA可以迅速增加Pod副本数量以满足需求,从而确保应用的性能和稳定性。
运维效率:Metrics-Server和HPA的自动化特性可以大大减轻运维人员的工作压力,提高运维效率
更多详细信息访问:资源指标管道 | Kubernetes
二、部署metrics-server组件
(一)镜像获取
镜像获取的方式有多种
1.本地上传镜像包
使用docker load -i 镜像包名称 指令获取镜像
[root@node01 opt]#ls metrics-server.tar
metrics-server.tar
[root@node01 opt]#docker load -i metrics-server.tar
0b97b1c81a32: Loading layer [==================================================>] 1.416MB/1.416MB
87ea89a1eabb: Loading layer [==================================================>] 39.61MB/39.61MB
Loaded image: k8s.gcr.io/metrics-server-amd64:v0.3.2
2.GitHub下载
https://github.com/kubernetes-sigs/metrics-server/releases/
3.国内云下载
docker pull registry.aliyuncs.com/google_containers/metrics-server:v0.6.3
在所有节点上部署镜像
[root@node01 opt]#docker images |grep metrics-server
registry.aliyuncs.com/google_containers/metrics-server v0.6.3 817bbe3f2e51 14 months ago 68.9MB
k8s.gcr.io/metrics-server-amd64 v0.3.2 46aec181fcb3 5 years ago 40.8MB
(二)安装metrics-server组件
安装metrics-server组件,就是给k8s集群安装top指令。
1.获取yaml文件
[root@master01 metrics]#wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/high-availability-1.21+.yaml
[root@master01 metrics]#ls
high-availability-1.21+.yaml
2.修改文件内容
[root@master01 metrics]#vim high-availability-1.21+.yaml
......
136 requiredDuringSchedulingIgnoredDuringExecution:
137 - labelSelector:
138 matchLabels:
139 k8s: metrics-server
#修改硬策略的标签,由于本机的coredns实例的标签键位k8s-app,需要修改为不一致的,或者注释pod反亲和
......
142 topologyKey: kubernetes.io/hostname
143 containers:
144 - args:
145 - --kubelet-insecure-tls #启动允许使用不安全的TLS证书
146 - --cert-dir=/tmp
147 - --secure-port=10250
148 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
149 - --kubelet-use-node-status-port
150 - --metric-resolution=15s
151 image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.3#修改镜像为阿里云的镜像......
197 ---
198 apiVersion: policy/v1beta1 #1.20版本以前的K8s集群修改PodDisruptionBudget资源的版本为v1beta
199 kind: PodDisruptionBudget
200 metadata:
201 labels:
202 k8s-app: metrics-server
3.创建资源
[root@master01 metrics]#kubectl apply -f high-availability-1.21+.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
poddisruptionbudget.policy/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
4.验证是否安装成功
//查看资源信息
[root@master01 metrics]#kubectl get pod -n kube-system |grep metrics-server
metrics-server-98c7c894d-skwjb 1/1 Running 0 3m55s
metrics-server-98c7c894d-xq8qr 1/1 Running 0 3m55s
[root@master01 metrics]#kubectl get deployment metrics-server -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 2/2 2 2 4m3s//使用top命令查看node节点的top值
[root@master01 metrics]#kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master01 227m 5% 2078Mi 56%
node01 100m 2% 965Mi 26%
node02 114m 2% 580Mi 15% //查看pod资源的top值
[root@master01 metrics]#kubectl top pod -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
helm-test harbor-nginx-7db9b84fc4-p5tpl 1m 3Mi
kube-flannel kube-flannel-ds-8sgt8 10m 18Mi
kube-flannel kube-flannel-ds-nplmm 7m 21Mi
kube-flannel kube-flannel-ds-xwklx 7m 20Mi
kube-system coredns-74ff55c5b-dwzdp 4m 15Mi
kube-system coredns-74ff55c5b-ws8c8 3m 15Mi
kube-system etcd-master01 22m 336Mi
kube-system kube-apiserver-master01 85m 398Mi
kube-system kube-controller-manager-master01 14m 51Mi
kube-system kube-proxy-psdnv 4m 23Mi
kube-system kube-proxy-zmh82 1m 15Mi
kube-system kube-proxy-zwnx2 1m 22Mi
kube-system kube-scheduler-master01 4m 18Mi
kube-system metrics-server-98c7c894d-fsb4n 6m 20Mi
kube-system metrics-server-98c7c894d-nqph6 11m 14Mi
三、部署HPA
(一)创建deployment
创建deployment控制器,用来生成pod,进行压测
[root@master01 metrics]#cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: dm-hpalabels:app: centos
spec:replicas: 1 #设置副本数量为1个selector:matchLabels:app: centostemplate:metadata:labels:app: centosspec:containers:- name: centosimage: centos:7command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 36000"]
#下载stress压测工具,并设置睡眠时间为36000sresources:requests:cpu: "50m"limits:cpu: "150m"
#设置现在CPU资源
创建资源
[root@master01 metrics]#kubectl apply -f deployment.yaml
deployment.apps/dm-hpa created
[root@master01 metrics]#kubectl get pod
NAME READY STATUS RESTARTS AGE
dm-hpa-556f64fc9-9fcff 1/1 Running 0 14s
(二)创建HPA资源
[root@master01 metrics]#cat hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: hpa-tools
spec:maxReplicas: 10minReplicas: 2scaleTargetRef:apiVersion: apps/vl kind: Deploymentname: dm-hpatargetCPUUtilizationPercentage: 50------------------------------------------------------------------------------maxReplicas:10 #指定pod最大的数量是10(自动扩容的上限)
minReplicas:2 #指定pod最小的pod数量是2(自动缩容的下限)
scaleTargetRef #指定弹性伸缩引用的目标
apiVersion: apps/vl #目标资源的api
kind: Deployment #目标资源的类型是Deployment
name:dm-hpa #目标资源的名称
targetCPUUtilizationPercentage: 50 #使用cpu阈值(使用到达多少,开始扩容、缩容)
创建HPA资源
[root@master01 metrics]#kubectl apply -f hpa.yaml
horizontalpodautoscaler.autoscaling/hpa-tools created
[root@master01 metrics]#kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-tools Deployment/dm-hpa 0%/50% 2 10 10 8s
[root@master01 metrics]#kubectl get pod
NAME READY STATUS RESTARTS AGE
dm-hpa-556f64fc9-9fcff 1/1 Running 0 6m34s
dm-hpa-556f64fc9-vzs6p 0/1 ContainerCreating 0 1s
[root@master01 metrics]#kubectl get pod
NAME READY STATUS RESTARTS AGE
dm-hpa-556f64fc9-9fcff 1/1 Running 0 6m38s
dm-hpa-556f64fc9-vzs6p 1/1 Running 0 5s
#由于设置的最小阈值为2所以它会自动创建pod,满足最小阈值的需求
(三)进行压测
进入pod使用stress压测工具进行压测
[root@master01 metrics]#kubectl exec -it dm-hpa-556f64fc9-9fcff sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
sh-4.2# stress --cpu 4
stress: info: [97] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
动态检测HPA
[root@master01 pod]#kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-tools Deployment/dm-hpa 1%/50% 2 10 2 14m
hpa-tools Deployment/dm-hpa 0%/50% 2 10 2 15m
hpa-tools Deployment/dm-hpa 1%/50% 2 10 2 16m
hpa-tools Deployment/dm-hpa 130%/50% 2 10 2 17m
查看Pod资源
[root@master01 pod]#kubectl get pod
NAME READY STATUS RESTARTS AGE
dm-hpa-556f64fc9-2zxgf 1/1 Running 0 39s
dm-hpa-556f64fc9-6jsz2 1/1 Running 0 9s
dm-hpa-556f64fc9-9fcff 1/1 Running 0 24m
dm-hpa-556f64fc9-9gt96 1/1 Running 0 39s
dm-hpa-556f64fc9-9jlm7 1/1 Running 0 9s
dm-hpa-556f64fc9-c6jgk 1/1 Running 0 24s
dm-hpa-556f64fc9-cd8xb 1/1 Running 0 9s
dm-hpa-556f64fc9-fzz5q 1/1 Running 0 9s
dm-hpa-556f64fc9-pc74k 1/1 Running 0 24s
dm-hpa-556f64fc9-vzs6p 1/1 Running 0 17m
#达到最大阈值10
pod生成后,CPU负载也会平摊随之下降
[root@master01 pod]#kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-tools Deployment/dm-hpa 0%/50% 2 10 2 30m
hpa-tools Deployment/dm-hpa 50%/50% 2 10 2 30m
hpa-tools Deployment/dm-hpa 149%/50% 2 10 2 30m
hpa-tools Deployment/dm-hpa 150%/50% 2 10 4 31m
hpa-tools Deployment/dm-hpa 134%/50% 2 10 7 31m
hpa-tools Deployment/dm-hpa 106%/50% 2 10 10 31m
hpa-tools Deployment/dm-hpa 92%/50% 2 10 10 32m
hpa-tools Deployment/dm-hpa 68%/50% 2 10 10 36m
hpa-tools Deployment/dm-hpa 57%/50% 2 10 10 37m
hpa-tools Deployment/dm-hpa 52%/50% 2 10 10 37m
hpa-tools Deployment/dm-hpa 33%/50% 2 10 10 37m
hpa-tools Deployment/dm-hpa 31%/50% 2 10 10 37m
......
当结束压测时,CPU资源会释放,同时Pod实例也会释放
[root@master01 pod]#kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-tools Deployment/dm-hpa 0%/50% 2 10 10 22m
----------------------------------------------------------------------------------------
[root@master01 pod]#kubectl get pod
NAME READY STATUS RESTARTS AGE
dm-hpa-556f64fc9-9fcff 1/1 Running 0 34m
dm-hpa-556f64fc9-vzs6p 1/1 Running 0 27m
-----------------------------------------------------------------------------------------
#Pod缩容的时间可能在5-6分钟左右,
#HPA 扩容的时候,负载节点数量上升速度会比较快;但回收的时候,负载节点数量下降速度会比较慢。
#原因是防止在业务高峰期时因为网络波动等原因的场景下
#果回收策略比较积极的话,K8S集群可能会认为访问流量变小而快速收缩负载节点数量
#而仅剩的负载节点又承受不了高负载的压力导致崩溃,从而影响业务
四、命名空间的资源限制
Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup。
默认情况下,Pod 运行没有 CPU 和内存的限额。这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样, 消耗足够多的 CPU 和内存。一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过 resources 的 requests 和 limits 来实现。requests 为创建 Pod 时初始要分配的资源,limits 为 Pod 最高请求的资源值。
(一)创建命名空间
[root@master01 metrics]#kubectl create ns test
namespace/test created
[root@master01 metrics]#kubectl get ns test
NAME STATUS AGE
test Active 8s
(二)对资源数量的限制
创建deployment资源
[root@master01 metrics]#vim deployment.yaml
[root@master01 metrics]#cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: centos-testnamespace: testlabels:app: centos1
spec:replicas: 6 #指定要运行的Pod副本数为6个selector:matchLabels:app: centos1template:metadata:labels:app: centos1spec:containers:- name: centos1image: centos:7command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 36000"]resources:limits:cpu: "1000m"memory: "512Mi"
---
apiVersion: v1
kind: ResourceQuota #资源配额的类型
metadata:name: ns-resourcenamespace: test #资源配额适用的命名空间
spec:hard: #定义硬限制,即不能超过的资源配额pods: "5" #命名空间中可以存在的Pod的最大数量为5个services: "3" #命名空间中可以存在的Service的最大数量为3个services.nodeports: "2" #命名空间中可以存在的具有NodePort的Service的最大数量为2个
创建资源
[root@master01 metrics]#kubectl apply -f deployment.yaml
deployment.apps/centos-test created
resourcequota/ns-resource created
[root@master01 metrics]#kubectl get all -n test
NAME READY STATUS RESTARTS AGE
pod/centos-test-845c47f786-44bl8 1/1 Running 0 3s
pod/centos-test-845c47f786-55jhp 1/1 Running 0 3s
pod/centos-test-845c47f786-6lmvv 1/1 Running 0 3s
pod/centos-test-845c47f786-gckv2 1/1 Running 0 3s
pod/centos-test-845c47f786-kwbl7 1/1 Running 0 3s
pod/centos-test-845c47f786-r9jsk 1/1 Running 0 3sNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/centos-test 6/6 6 6 3sNAME DESIRED CURRENT READY AGE
replicaset.apps/centos-test-845c47f786 6 6 6 3s
[root@master01 metrics]#kubectl run nginx --image=nginx:1.18.0 -n test
Error from server (Forbidden): pods "nginx" is forbidden: exceeded quota: ns-resource, requested: pods=1, used: pods=6, limited: pods=
------------------------------------------------------------------------------------------
#ResourceQuota 是用来限制命名空间内资源使用的配额,并且当超出限制时,
#它主要影响的是未来的资源请求,比如新的Pod的创建请求#在指定的命名空间中的ResourceQuota已经被达到或超过时,Kubernetes API服务器会拒绝Pod的创建请求,并返回一个错误。
#但是,对于已经存在的Pod,ResourceQuota 并不会自动删除或终止它们
(三)对资源配额的限制
如果Pod没有设置requests和limits,则会使用当前命名空间的最大资源;如果命名空间也没设置,则会使用集群的最大资源。
K8S 会根据 limits 限制 Pod 使用资源,当内存超过 limits 时 cgruops 会触发 OOM。
这里就需要创建 LimitRange 资源来设置 Pod 或其中的 Container 能够使用资源的最大默认值
[root@master01 metrics]#vim limit.yaml
[root@master01 metrics]#cat limit.yaml
apiVersion: v1
kind: LimitRange #表示使用limitrange来进行资源控制
metadata:name: test2-limitnamespace: testspec:limits:- default: #default: 即 limit 的值memory: 512Micpu: "1"defaultRequest: #defaultRequest: 即 request 的值memory: 256Micpu: "0.5"type: Container #类型支持 Container、Pod、PVC相关文章:
【云原生】Kubernetes----Metrics-Server组件与HPA资源
目录 引言 一、概述 (一)Metrics-Server简介 (二)Metrics-Server的工作原理 (三)HPA与Metrics-Server的作用 (四)HPA与Metrics-Server的关系 (五)HPA与…...
模拟原神圣遗物系统-小森设计项目,设计圣遗物(生之花,死之羽,时之沙,空之杯,理之冠)抽象类
分析圣遗物 在圣遗物系统,玩家操控的是圣遗物的部分 因此我们应该 物以类聚 人与群分把每个圣遗物的部分,抽象出来 拿 生之花,死之羽为例 若是抽象 类很好的扩展 添加冒险家的生之花 时候继承生之花 并且名称冒险者- 生之花 当然圣遗物包含…...
仿真模拟--telnet服务两种认证模式(自作)
自己做的笔记,有问题或看不懂请见解一下~ 目录 两个路由器间实现telnet服务(password认证模式) server client 两个路由器间实现telnet服务(aaa认证模式) server client 改名 tab键补齐 不会就扣问号 ? save 两个路由器间实现telnet服务…...
Apple Phone Memory
Apple Phone Memory 苹果手机内存查询,哪些应用程序(app)占用内存: 设置 通用 iPhone储存空间 清理下QQ音乐:...
Kubernetes容器运行时:Containerd vs Docke
容器化技术笔记 Kubernetes容器运行时:Containerd vs Docke - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this arti…...
【java 线程的状态】
介绍 Java 线程在运⾏的⽣命周期中的指定时刻只可能处于下⾯ 6 种不同状态的其中⼀个状态 状态名称说明NEW初始状态,线程被构建,但是还没有调用start()方法RUNNABLE运行状态,Java线程将操作系统中的就绪和运行两种状态统称为"运行中"BLOCKED阻塞状态,表示线程阻塞于…...
php加密验签
签名生成步骤(小程序端/前端): 确定参与签名的参数:选择需要参与签名的请求参数,通常包括请求的时间戳、随机数、请求的数据等。 参数排序与拼接:将所有参与签名的参数按照字母顺序排序,并拼接成…...
【Golang - 90天从新手到大师】Day06 - 数组
系列文章合集 Golang - 90天从新手到大师 数组是golang中最常用的一种数据结构,数组就是同一类型数据的有序集合 定义一个数组 格式: var name [n]type n为数组长度,n>0 且无法修改,type为数组的元素类型如: var a [2]int上面的例子定义了一个长度为2,元素类型为int的数组…...
java的有参构造方法
java的有参构造方法和无参构造方法类似,区别是构造方法名称里后面跟着一个括号,括号里是参数的定义 示例代码如下 class student4{private String name;private int age;public student4(String n,int a) {namen;agea;System.out.println("调用了…...
Vue66-vue-默认插槽
一、默认插槽需求 1-1、原本的写法: 在每个category组件中用v-show来做条件渲染,但是不方便! 1-2、默认插槽 img标签,ul标签,video标签,都是在app组件中完成解析之后,塞到category组件中的&…...
tsf-consul的使用
在腾讯云微服务平台TSF中使用Consul作为服务发现组件,通常需要遵循以下步骤: ### 1. 创建应用 首先,您需要在TSF控制台创建一个应用。在创建应用时,选择合适的业务类型、开发语言、开发框架等信息。对于使用Consul作为服务发现组件的Spring Cloud应用,您需要选择“业务应…...
【perl】基本语法 /备忘录/
分享 perl 语言学习资源 Perl 教程|极客教程 (geek-docs.com) Perl [zh] (runebook.dev) Perl 运算符 | 菜鸟教程 (runoob.com) Perl Documentation - Perldoc Browser Search the CPAN - metacpan.org 当然还有一些经典书籍,不再列举。 1、数字 1.1、数字表…...
mongodb 集群安装
整体架构图: 1. 配置域名 Server1: OS version: CentOS Linux release 8.5.2111 hostnamectl --static set-hostname mongo01 vi /etc/sysconfig/network # Created by anaconda hostnamemong01 echo "192.168.88.20 mong1 mongo01.com mongo…...
绿茶集团重启IPO:流量渐退、业绩波动,还能讲出好故事吗?
近日,绿茶集团有限公司(下称“绿茶集团”)向港交所递交上市申请,花旗、招银国际为其联席保荐人。 回望绿茶集团的上市之路,可谓有诸多坎坷。该公司于2021年3月首度向港交所发起冲击,但却将中文版招股书中的“流动负债总额”错写成…...
Git与SSH
Git Git是一种分布式版本控制系统,最初由Linus Torvalds为管理Linux内核开发而设计并开发。Git可以帮助开发团队协作管理代码,跟踪代码变更历史,并在需要时回溯到特定版本。 分布式版本控制:每个开发者都可以拥有完整的代码仓库…...
我的创作纪念日--码农阿豪
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...
Git 学习笔记(超详细注释,从0到1)
Git学习笔记 1.1 关键词 Fork、pull requests、pull、fetch、push、diff、merge、commit、add、checkout 1.2 原理(看图学习) 1.3 Fork别人仓库到自己仓库中 记住2个地址 1)上游地址(upstream地址):http…...
GitLab项目组相关操作(创建项目组Group、创建项目组的项目、为项目添加成员并赋予权限)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 ——《将…...
英语恶补ing
ing的词组都有停下来做某事的感觉了。 second hand是形容词了。 wouldnt buy这里的would是情态动词,也是助动词 助动词不能单独使用,要搭配实义动词,这样才能构成谓语 情态动词(modals)在英语中有多种作用ÿ…...
DS1339C串行实时时钟-国产兼容RS4C1339
RS4C1339串行实时时钟是一种低功耗的时钟/日期设备,具有两个可编程的一天时间报警器和一个可编程方波输出。地址和数据通过2线双向总线串行传输。时钟/日期提供秒、分钟、小时、天、日期、月份和年份信息。对于少于31天的月份,月末的日期会自动调整&…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
