(三)k8s实战-资源调度

一、Label 和 Selector

1、标签(Label)

有两种设置方式:配置文件、kubectl命令

1)配置文件
在各类资源的 metadata.labels 中进行配置

2)kubectl

1)临时创建 label
kubectl label po <资源名称> app=hello	2)修改已经存在的标签
kubectl label po <资源名称> app=hello2 --overwrite3)查看 label
# selector 按照 label 单值查找节点
kubectl get po -A -l app=hello# 查看所有节点的 labels
kubectl get po --show-labels

2、选择器(Selector)

有两种设置方式:配置文件、kubectl命令

1)配置文件
在各对象的配置 spec.selector 或其他可以写 selector 的属性中编写

2)kubectl

# 匹配单个值,查找 app=hello 的 pod
kubectl get po -A -l app=hello# 匹配多个值
kubectl get po -A -l 'k8s-app in (metrics-server, kubernetes-dashboard)'# 查找 version!=1 and app=nginx 的 pod 信息
kubectl get po -l version!=1,app=nginx# 不等值 + 语句
kubectl get po -A -l version!=1,'app in (busybox, nginx)'

二、Deployment

Deployment:用于管理无状态应用

1、配置文件样例

apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息labels: # 标签app: nginx-deploy # 具体的 key: value 配置形式name: nginx-deploy # deployment 的名字namespace: default # 所在的命名空间
spec:replicas: 1 # 期望副本数revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数selector: # 选择器,用于找到匹配的 RSmatchLabels: # 按照标签匹配app: nginx-deploy # 匹配的标签key/valuestrategy: # 更新策略rollingUpdate: # 滚动更新配置maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate # 更新类型,采用滚动更新template: # pod 模板metadata: # pod 的元信息labels: # pod 的标签app: nginx-deployspec: # pod 期望信息containers: # pod 的容器- image: nginx:1.7.9 # 镜像imagePullPolicy: IfNotPresent # 拉取策略name: nginx # 容器名称restartPolicy: Always # 重启策略terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间

2、创建

1.创建一个 deployment
kubectl create deploy nginx-deploy --image=nginx:1.7.9或执行
kubectl create -f xxx.yaml --record
# --record 会在 annotation 中记录当前命令创建或升级了资源,后续可以查看做过哪些变动操作(回滚版本中可以看到变动描述)。2.查看部署信息
kubectl get deployments3.查看 rs
kubectl get rs4.查看 pod 以及展示标签,可以看到是关联的那个 rs
kubectl get pods --show-labels

3、滚动更新

# 修改deploy的yaml配置(修改后就会滚动更新)
kubectl edit deployment/nginx-deploy
# 查看滚动更新的过程
kubectl rollout status deploy <deployment_name>

案例:

#只有修改了 deployment 配置文件中的 template 中的属性后,才会触发更新操作1.修改 nginx 版本号
kubectl set image deployment/nginx-deploy nginx=nginx:1.9.1
或者通过 kubectl edit deployment/nginx-deploy 进行修改2.查看滚动更新的过程
kubectl rollout status deploy <deployment_name>3.查看部署描述,最后展示发生的事件列表也可以看到滚动更新过程
kubectl describe deploy <deployment_name>4.通过 kubectl get deployments 获取部署信息,UP-TO-DATE 表示已经有多少副本达到了配置中要求的数目5.通过 kubectl get rs 可以看到增加了一个新的 rs6.通过 kubectl get pods 可以看到所有 pod 关联的 rs 变成了新的

假设当前有 5 个 nginx:1.7.9 版本,你想将版本更新为 1.9.1,当更新成功第三个以后,你马上又将期望更新的版本改为 1.9.2,那么此时会立马删除之前的三个,并且立马开启更新 1.9.2 的任务

4、回滚

有时候你可能想回退一个Deployment,例如,当Deployment不稳定时,比如一直crash looping。

默认情况下,kubernetes会在系统中保存前两次的Deployment的rollout历史记录,以便你可以随时会退(你可以修改revisionHistoryLimit来更改保存的revision数)。

# 查看 revison 的列表
kubectl rollout history deployment/nginx-deploy
# 查看指定revison的详细信息
kubectl rollout history deployment/nginx-deploy --revision=2
# 回退到上一个版本
kubectl rollout undo deployment/nginx-deploy
# 回退到指定的 revision
kubectl rollout undo deployment/nginx-deploy --to-revision=2

案例:

更新 deployment 时参数不小心写错,如 nginx:1.9.1 写成了 nginx:1.91
kubectl set image deployment/nginx-deploy nginx=nginx:1.91监控滚动升级状态,由于镜像名称错误,下载镜像失败,因此更新过程会卡住
kubectl rollout status deployments nginx-deploy结束监听后,获取 rs 信息,我们可以看到新增的 rs 副本数是 2 个
kubectl get rs通过 kubectl get pods 获取 pods 信息,我们可以看到关联到新的 rs 的 pod,状态处于 ImagePullBackOff 状态为了修复这个问题,我们需要找到需要回退的 revision 进行回退
通过 kubectl rollout history deployment/nginx-deploy 可以获取 revison 的列表通过 kubectl rollout history deployment/nginx-deploy --revision=2 可以查看详细信息确认要回退的版本后,可以通过 kubectl rollout undo deployment/nginx-deploy 可以回退到上一个版本也可以回退到指定的 revision
kubectl rollout undo deployment/nginx-deploy --to-revision=2再次通过 kubectl get deployment 和 kubectl describe deployment 可以看到,我们的版本已经回退到对应的 revison 上了# 可以通过设置 .spec.revisonHistoryLimit 来指定 deployment 保留多少 revison,如果设置为 0,则不允许 deployment 回退了。

5、扩容缩容

# 通过 kube scale 命令可以进行自动扩容/缩容,以及通过 kube edit 编辑 replcas 也可以实现扩容/缩容
kubectl scale --replicas=6 deploy nginx-deploy#扩容与缩容只是直接创建副本数,没有更新 pod template 因此不会创建新的 rs

6、暂停与恢复

由于每次对 pod template 中的信息发生修改后,都会触发更新 deployment 操作,那么此时如果频繁修改信息,就会产生多次更新,而实际上只需要执行最后一次更新即可,当出现此类情况时我们就可以暂停 deployment 的 rollout

# 暂停滚动更新
kubectl rollout pause deployment <name>
# 恢复滚动更新
kubectl rollout resume deploy <name>

案例:

通过 kubectl rollout pause deployment <name> 就可以实现暂停,直到你下次恢复后才会继续进行滚动更新尝试对容器进行修改,然后查看是否发生更新操作了
kubectl set image deploy <name> nginx=nginx:1.17.9
kubectl get po 通过以上操作可以看到实际并没有发生修改,此时我们再次进行修改一些属性,如限制 nginx 容器的最大cpu为 0.2 核,最大内存为 128M,最小内存为 64M,最小 cpu 为 0.1 核
kubectl set resources deploy <deploy_name> -c <container_name> --limits=cpu=200m,memory=128Mi --requests=cpu100m,memory=64Mi通过格式化输出 kubectl get deploy <name> -oyaml,可以看到配置确实发生了修改,再通过 kubectl get po 可以看到 pod 没有被更新那么此时我们再恢复 rollout,通过命令 kubectl rollout resume deploy <name>恢复后,我们再次查看 rs 和 po 信息,我们可以看到就开始进行滚动更新操作了
kubectl get rs
kubectl get po

三、StatefulSet

StatefulSet:用于管理有状态应用

1、配置文件

---
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet # statefuelSet类型的资源
metadata: name: web # StatefulSet的名字
spec:serviceName: "nginx" # 使用哪个service来管理dnsreplicas: 2selector:matchLabels:app: nginx # 配置选择器template:metadata:labels:app: nginxspec:containers:- name: nginximage: arm64v8/nginx:latestports: # 容器内部需要暴露的端口- containerPort: 80 # 暴露的端口name: web # 端口配置的名字
#        volumeMounts: # 加载数据卷
#        - name: www # 指定加载哪个数据卷
#          mountPath: /usr/share/nginx/html # 加载到容器的哪个目录
#  volumeClaimTemplates: # 存储卷模板
#  - metadata: # 存储卷的元数据
#      name: www # 存储卷的名称
#      annotations: # 存储卷的注解
#        volume.alpha.kubernetes.io/storage-class: anything
#    spec: # 存储卷的规约
#      accessModes: [ "ReadWriteOnce" ] # 访问模式
#      resources:
#        requests:
#          storage: 1Gi # 需要1G的存储资源

2、创建

kubectl create -f web.yaml# 查看 service(svc) 和 statefulset(sts)
kubectl get service nginx
kubectl get statefulset web# 查看 PVC 信息
kubectl get pvc# 查看创建的 pod,这些 pod 是有序的
kubectl get pods -l app=nginx# 查看这些 pod 的 dns
# 运行一个 pod,基础镜像为 busybox 工具包,利用里面的 nslookup 可以看到 dns 信息
kubectl run -it --image arm64v8/busybox dns-test --restart=Never --rm /bin/sh
nslookup web-0.nginx

3、扩容缩容

# 方式一:kubectl命令
$ kubectl scale statefulset web --replicas=5# 方式二:打补丁修改yaml
$ kubectl patch statefulset web -p '{"spec":{"replicas":3}}'

4、镜像更新

镜像更新(目前还不支持直接更新 image,需要 patch 来间接实现)

kubectl patch sts web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"arm64v8/nginx:1.9.1"}]'

两种更新策略:
RollingUpdate滚动更新、OnDelete删除更新

1)更新策略:RollingUpdate 滚动更新
StatefulSet 也可以采用滚动更新策略,同样是修改 pod template 属性后会触发更新,但是由于 pod 是有序的,在 StatefulSet 中更新时是基于 pod 的顺序倒序更新的

灰度发布:
利用滚动更新中的 partition 属性,可以实现简易的灰度发布的效果 例如我们有 5 个 pod,如果当前
partition 设置为 3,那么此时滚动更新时,只会更新那些 序号 >= 3 的 pod 利用该机制,我们可以通过控制
partition 的值,来决定只更新其中一部分 pod,确认没有问题后再主键增大更新的 pod 数量,最终实现全部 pod 更新

  updateStrategy:rollingUpdate:partition: 0type: RollingUpdate

2)更新策略:OnDelete 删除更新
只有在 pod 被删除时会进行更新操作

  updateStrategy:type: OnDelete

5、删除

需要删除 StatefulSet 、 Headless Service 和 PVC


# 1)级联删除:删除 statefulset 时会同时删除 pods
kubectl delete statefulset web# 或 非级联删除:删除 statefulset 时不会删除 pods,删除 sts 后,pods 就没人管了,此时再删除 pod 不会重建的
kubectl deelte sts web --cascade=false# 2)删除 service
kubectl delete service nginx# 3)StatefulSet删除后PVC还会保留着,数据不再使用的话也需要删除
kubectl delete pvc www-web-0 www-web-1

四、DaemonSet

1、配置文件

apiVersion: apps/v1
kind: DaemonSet # 创建DaemonSet资源
metadata:name: fluentd # 名字
spec:template:metadata:labels:app: loggingid: fluentdname: fluentd # pod的名字spec:nodeSelector: # 节点选择器type: microservices #匹配的节点labelcontainers:- name: fluentd-esimage: agilestacks/fluentd-elasticsearch:v1.3.0env: # 环境变量配置- name: FLUENTD_ARGS # 环境变量的keyvalue: -qq # 环境变量的valuevolumeMounts: # 加载数据卷,避免数据丢失- name: containers # 数据卷的名字mountPath: /var/lib/docker/containers # 将数据卷挂载到容器内的哪个目录- name: varlog mountPath: /varlogvolumes: # 定义数据卷- hostPath: # 数据卷类型,主机路径的模式,也就是与node共享目录path: /var/lib/docker/containers # node中的共享目录name: containers # 定义的数据卷名称- hostPath:path: /var/logname: varlogupdateStrategy:type: OnDelete # 建议使用OnDelete,删除后更新

2、指定 Node 节点

DaemonSet 会忽略 Node 的 unschedulable 状态,有两种方式来指定 Pod 只运行在指定的 Node 节点上:

  • nodeSelector:只调度到匹配指定 label 的 Node 上
  • nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作
  • podAffinity:调度到满足条件的 Pod 所在的 Node 上

1)nodeSelector

先为 Node 打上标签

kubectl label nodes k8s-node1 svc_type=microsvc

然后再 daemonset 配置中设置 nodeSelector

spec:template:spec:nodeSelector:svc_type: microsvc

2)nodeAffinity
nodeAffinity 目前支持两种:requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution,分别代表必须满足条件和优选条件。

比如下面的例子代表调度到包含标签 wolfcode.cn/framework-name 并且值为 spring 或 springboot 的 Node 上,并且优选还带有标签 another-node-label-key=another-node-label-value 的Node。

apiVersion: v1
kind: Pod
metadata:name: with-node-affinity
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: wolfcode.cn/framework-nameoperator: Invalues:- spring- springbootpreferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: another-node-label-keyoperator: Invalues:- another-node-label-valuecontainers:- name: with-node-affinityimage: pauseyyf/pause

3)podAffinity
podAffinity 基于 Pod 的标签来选择 Node,仅调度到满足条件Pod 所在的 Node 上,支持 podAffinity 和 podAntiAffinity。这个功能比较绕,以下面的例子为例:
如果一个 “Node 所在空间中包含至少一个带有 auth=oauth2 标签且运行中的 Pod”,那么可以调度到该 Node
不调度到 “包含至少一个带有 auth=jwt 标签且运行中 Pod”的 Node 上

apiVersion: v1
kind: Pod
metadata:name: with-pod-affinity
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: authoperator: Invalues:- oauth2topologyKey: failure-domain.beta.kubernetes.io/zonepodAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: authoperator: Invalues:- jwttopologyKey: kubernetes.io/hostnamecontainers:- name: with-pod-affinityimage: pauseyyf/pause

3、滚动更新

不建议使用 RollingUpdate,建议使用 OnDelete 模式,这样避免频繁更新 ds

五、HPA 自动扩/缩容

通过监测pod的cpu、内存使用率自定义 metrics 指标进行自动的扩容或缩容 pod 的数量。
可用于Deployment和StatefulSet,通常用于Deployment,不适用于无法扩/缩容的对象,如 DaemonSet
控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况

1、创建一个 HPA

实现 cpu 或内存的监控,首先有个前提条件是该对象必须配置了 resources.requests.cpu 或 resources.requests.memory 才可以,可以配置当 cpu/memory 达到上述配置的百分比后进行扩容或缩容

# 1)准备一个有做资源限制的 deploymentresources:limits:cpu: 200mmemory: 128Mirequests:cpu: 100mmemory: 128Mi# 2)执行命令  
kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5# 3)查看HPA信息
kubectl get hpa

2、测试案例

1)找到对应服务的 service,编写循环测试脚本提升内存与 cpu 负载
while true; do wget -q -O- http://ip:port > /dev/null ; done
可以通过多台机器执行上述命令,增加负载

2)当超过负载后可以查看 pods 的扩容情况 kubectl get pods
查看 pods 资源使用情况 kubectl top pods

3)扩容测试完成后,再关闭循环执行的指令,让 cpu 占用率降下来,然后过 5 分钟后查看自动缩容情况

如果无法直接使用kubectl top pods命令,需要安装指标服务组件
开启指标服务:
1)下载 metrics-server 组件配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
2)修改镜像地址为国内的地址
sed -i ‘s/k8s.gcr.io/metrics-server/registry.cn-hangzhou.aliyuncs.com/google_containers/g’ metrics-server-components.yaml
3)修改metrics-server-components.yaml的 tls 配置,不验证 tls
在 containers 的 args 参数中增加 --kubelet-insecure-tls 参数
4)安装组件
kubectl apply -f metrics-server-components.yaml
5)查看 pod 状态
kubectl get pods --all-namespaces | grep metrics

3、自定义 metrics

控制管理器开启–horizontal-pod-autoscaler-use-rest-clients
控制管理器的–apiserver指向API Server Aggregator
在API Server Aggregator中注册自定义的metrics API

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

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

相关文章

前端vscode必备插件(强烈推荐)

目录 一、前言 二、工具推荐 1.《Chinese (Simplified) (简体中文) Language》 2.《ESLint》 3.《Git History》 4.vscode-icons 5.Path Intellisense 6.《Vetur》 7.《GitLens — Git supercharged》 8.《Image preview》 9.Debugger for Chrome 10.Prettier 11…

微服务中间件--Ribbon负载均衡

Ribbon负载均衡 a.Ribbon负载均衡原理b.Ribbon负载均衡策略 (IRule)c.Ribbon的饥饿加载 a.Ribbon负载均衡原理 1.发起请求http://userservice/user/1&#xff0c;Ribbon拦截该请求 2.Ribbon通过EurekaServer拉取userservice 3.EurekaServer返回服务列表给Ribbon做负载均衡 …

【云驻共创】华为云之手把手教你搭建IoT物联网应用充电桩实时监控大屏

文章目录 前言1.什么是充电桩2.什么是IOT3.什么是端、边、云、应用协同4.什么是Astro轻应用 一、玩转lOT动态实时大屏&#xff08;线下实际操作&#xff09;1.Astro轻应用说明1.1 场景说明1.2 资费说明1.3 整体流程 2.操作步骤2.1 开通设备接入服务2.2 创建产品2.3 注册设备2.4…

上海交大ACM班总教头团队重磅新作,带你动手学机器学习(文末赠书4本)

目录 0 写在前面1 什么是机器学习&#xff1f;2 ACM 班总教头&#xff1a;俞勇3 动手学习机器学习赠书活动 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

stm32之5.长按按键(使用时钟源)调整跑马灯速度

------------------------------ 源码 #include <stm32f4xx.h> #include "led.h" #include "delay.h" #include "my_str.h" #include "beep.h" #include "key.h" int main(void) { key_init(); Led_init();…

redis高级----------主从复制

redis的四种模式&#xff1a;单例模式&#xff1b;主从模式&#xff1b;哨兵模式&#xff0c;集群模式 一、主从模式 单例模式虽然操作简单&#xff0c;但是不具备高可用 缺点&#xff1a; 单点的宕机引来的服务的灾难、数据丢失单点服务器内存瓶颈&#xff0c;无法无限纵向扩…

7-42 整型关键字的散列映射

题目链接&#xff1a;这里 题目大意&#xff1a;就是写一个线性探测的散列 然鹅&#xff0c;我不会写(?)我一共错了两个地方 有冲突的情况下&#xff0c;就是线性探查然后往后找&#xff0c;但是我之前写的是t&#xff0c;应该是t (t1)%p;…在有重复关键字的时候&#xff0c…

运行flutter doctor命令窗口直接闪退

在cmd中输入flutter doctor后闪退了。 使用高速摄像机可以看到报错信息。 报错信息的意思是git的文件夹不能删掉&#xff0c;请保留flutter中git文件。

数据结构——栈和队列OJ题

栈和队列小提升&#xff01; 前言一、用队列实现栈队列接口实现&#xff08;1&#xff09;栈的接口定义&#xff08;2&#xff09;栈的初始化&#xff08;3&#xff09;入栈函数的定义&#xff08;4&#xff09;出栈函数的定义&#xff08;5&#xff09;查找栈顶元素&#xff0…

vue3 计算两个表单得到第三个表单数据

<el-formref"ruleFormRef"label-width"150px"label-suffix":":rules"rules":disabled"drawerProps.isView":model"drawerProps.rowData"><el-form-item label"云平台名称" prop"cloudId&…

硬件知识积累 LED的介绍与选型 (简单电路)

1. LED 的介绍 1.1 LED 是什么 LED :是一种能发光的半导体电子元件。发光二极管&#xff08;LED&#xff09;于20世纪60年代问世。在20世纪80年代之前&#xff0c;LED主要作为指示灯使用&#xff0c;从其光色来看&#xff0c;只有红光、橙光、黄光和绿光等几种。这一时期属于…

游乐场vr设备虚拟游乐园vr项目沉浸体验馆

在景区建设一个VR游乐场项目可以为游客提供一种新颖、刺激和沉浸式的游乐体验。提高游客的体验类型&#xff0c;以及景区的类目&#xff0c;从而可以吸引更多的人来体验。 1、市场调研&#xff1a;在决定建设VR游乐场项目之前&#xff0c;需要进行市场调研&#xff0c;了解当地…

基于Spark+django的国漫推荐系统--计算机毕业设计项目

近年来&#xff0c;随着互联网的蓬勃发展&#xff0c;企事业单位对信息的管理提出了更高的要求。以传统的管理方式已无法满足现代人们的需求。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;随着各行业的不断发展&#xff0c;基…

【LUBAN】【功能验证】至简投屏功能之Android有线连接方式测试

1、概述 至简投屏功能之Android有线连接方式支持至简自带应用至加的投屏功能和谷歌官方的Android auto功能。 支持的功能范围列举如下&#xff1a; 1、屏幕投屏&#xff08;支持自动旋转屏&#xff09;2、音视频播放&#xff08;抖音、百度地图等&#xff09;3、车机反控手机…

里式替换原则(LSP)

目录 简介: 作用: 过程: 总结: 简介: 里式替换原则&#xff08;Liskov Substitution Principle&#xff0c;简称LSP&#xff09;的提出者是美国计算机科学家Barbara Liskov。Barbara Liskov是一位计算机科学家&#xff0c;麻省理工学院教授&#xff0c;也是美国第一个计算机…

港联证券|油价上涨对股票影响大吗?利好还是利空?

石油是现代国家国民经济的血脉&#xff0c;直接影响国民经济的发展。那么&#xff0c;油价上涨对股票影响大吗&#xff1f;利好仍是利空&#xff1f;为大家准备了相关内容&#xff0c;以供参阅。 香港港联证券有限公司&#xff08;百度一下港联证券&#xff09;成立于2021年1月…

还是搞不懂Anaconda是什么?读这一篇文章就够了

文章目录 1 Anaconda介绍2 conda介绍3 安装Anaconda4 Anaconda的使用配置Anaconda源 5 创建虚拟环境并使用5.1 创建虚拟环境5.2 查看所有环境5.3 激活环境5.4 安装包5.4.1 conda方式5.4.2 pip方式5.4.3 从Anaconda.org安装包 5.5 查看该环境的所有包5.6 测试是否安装成功 6 退出…

Vue+Axios搭建二次元动态登录页面(mp4视频格式)

最近想做一个前端登录页面&#xff0c;背景好看的&#xff0c;格式中规中矩的&#xff0c;这么难&#xff1f;我自己创一个吧&#xff01; 效果图如下&#xff1a; 源码可以参考我的github&#xff0c;复制源码即可用&#xff1a;gym02/loginPage_Vue: 使用VueAxios搭建的动态…

Cadence软件屏幕显示问题

问题 就是今天打开Cadence软件想导出网表看一下&#xff0c;发现没有显示确定按钮什么的&#xff0c;那个窗口也是无语&#xff0c;不能移动&#xff0c;缩放也只能左右缩放&#xff0c;还不能缩小什么的&#xff0c;真的醉了&#xff0c;后面就是调整窗口的分辨率。 因为我最…