VPA

参考链接:https://www.kubecost.com/kubernetes-autoscaling/kubernetes-vpa/

官网链接:https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler

VPA简介

  • kubernetes(VPA Vertical Pod Autoscaler)垂直 Pod 自动扩缩容, VPA 会基于 Pod 的资源使用情况自动为集群设置资源占用的限制,从而让集群将 Pod 调度到有足够资源的最佳节点上。 VPA 也会保持最初容器定义中资源 request 和 limit 的占比。它会 根据容器资源使用率自动设置 pod 的 CPU 和内存的 requests ,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的 可用的节点 。它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。
  • Vertical Pod Autoscaler (VPA):垂直 Pod 自动扩缩容, 用户无需为其 pods 中的容器设置最新的资源 request 。配置后,它将根据使用情况自动设置 request ,从而允许在节点上进行适当的调度,以便为每个 pod 提供适当的资源量
  • HPA 通过添加或删除pod进行扩展,从而水平扩展容量。然而,VPA 通过增加或减少现有 pod 容器内的 CPU 和内存资源来进行扩展,从而垂直扩展容量。下表更详细地解释了 Kubernetes VPA 和 HPA 之间的区别
所需的容量调整 水平缩放 (HPA) 垂直缩放 (VPA)
更多资源 Add more pods 增加现有 pod 容器的 CPU 或内存资源
更少的资源 Remove pods 减少现有 pod 容器的 CPU 或内存资源

VPA组件

VPA Recommender

  • 监视资源利用率并计算目标值
  • 查看指标历史记录、OOM 事件和 VPA 部署规范并建议公平请求。根据定义的限制请求比例提高/降低限制

VPA Updater

  • 驱逐那些需要新资源限制的 pod
  • 如果定义了“updateMode: Auto”,则实现 Recommender 推荐的任何内容

VPA Admission Controller

  • 每当 VPA 更新程序驱逐并重新启动 pod 时,在新 pod 启动之前更改 CPU 和内存设置(使用 webhook)
  • 当 Vertical Pod Autoscaler 设置为 updateMode 为“Auto”时,如果需要更改 pod 的资源请求,则驱逐 pod。由于 Kubernetes 的设计,修改正在运行的 Pod 的资源请求的唯一方法是重新创建 Pod

VPA工作流程

  1. 用户配置 VPA
  2. VPA Recommender 从指标服务器读取 VPA 配置和资源利用率指标
  3. VPA Recommender 提供 pod 资源推荐
  4. VPA 更新程序读取 pod 资源建议
  5. VPA 更新程序启动 pod 终止
  6. 部署意识到 pod 已终止,并将重新创建 pod 以匹配其副本配置
  7. 当 Pod 处于重新创建过程中时,VPA 准入控制器获取 Pod 资源推荐。由于 Kubernetes 不支持动态更改正在运行的 pod 的资源限制,因此 VPA 无法使用新的限制更新现有 pod。它终止使用过时限制的 pod。当 pod 的控制器从 Kubernetes API 服务请求替换时,VPA 准入控制器将更新的资源请求和限制值注入到新的 pod 的规范中
  8. 最后,VPA 准入控制器将建议覆盖到 pod。在我们的示例中,VPA 准入控制器向 pod 添加了一个“250m”的 CPU

​ 我们也可以在推荐模式下运行 VPA。在这种模式下,VPA Recommender 将使用其建议值更新工作负载的 Vertical Pod Autoscaler 资源的状态字段,但不会终止 pod 或更改 pod API 请求

VPA 的局限性

VPA 在许多应用程序中都很有用,但要记住几个重要的限制

  • 不要将 Vertical Pod Autoscaler 与 Horizontal Pod Autoscaler 一起使用,后者基于相同的资源指标(例如 CPU 和 MEMORY 使用率)进行缩放。这是因为当指标 (CPU/MEMORY) 达到其定义的阈值时,VPA 和 HPA 将同时发生缩放事件,这可能会产生未知的副作用并可能导致问题
  • VPA 可能会推荐比集群中可用的资源更多的资源,从而导致 pod 未分配给节点(由于资源不足),因此永远不会运行。为了克服这个限制,最好将LimitRange 设置为最大可用资源。这将确保 pod 不会要求超过 LimitRange 定义的资源
  • VPA 不会驱逐不在控制器下运行的 pod。对于这样的 pods Auto模式目前相当于Initial

VPA部署

anjia0532使用方法链接:https://github.com/anjia0532/gcr.io_mirror

# 镜像无法拉取解决
# 原始镜像image: k8s.gcr.io/autoscaling/vpa-updater:0.10.0image: k8s.gcr.io/autoscaling/vpa-recommender:0.10.0image: k8s.gcr.io/autoscaling/vpa-admission-controller:0.10.0# 拉取镜像docker pull anjia0532/google-containers.autoscaling.vpa-updater:0.10.0docker pull anjia0532/google-containers.autoscaling.vpa-recommender:0.10.0docker pull anjia0532/google-containers.autoscaling.vpa-admission-controller:0.10.0# 修改tagdocker tag anjia0532/google-containers.autoscaling.vpa-admission-controller:0.10.0 k8s.gcr.io/autoscaling/vpa-admission-controller:0.10.0docker tag anjia0532/google-containers.autoscaling.vpa-recommender:0.10.0 k8s.gcr.io/autoscaling/vpa-recommender:0.10.0docker tag anjia0532/google-containers.autoscaling.vpa-updater:0.10.0 k8s.gcr.io/autoscaling/vpa-updater:0.10.0# 删除下载的docker rmi anjia0532/google-containers.autoscaling.vpa-updater:0.10.0docker rmi anjia0532/google-containers.autoscaling.vpa-recommender:0.10.0docker rmi anjia0532/google-containers.autoscaling.vpa-admission-controller:0.10.0# 查看镜像
[root@k8s-master-1 hack]# docker image ls | grep vpa
k8s.gcr.io/autoscaling/vpa-admission-controller       0.10.0     0c437f333c80   2 months ago    45MB
k8s.gcr.io/autoscaling/vpa-updater                    0.10.0     f7996212cdf9   2 months ago    47.2MB
k8s.gcr.io/autoscaling/vpa-recommender                0.10.0     05040f9c0dfd   2 months ago    46.1MB# 将image拉取策略从Always改为IfNotPresent,防止每次重新部署的时候都会拉取镜像,让其使用本地镜像
[root@k8s-master-1 deploy]# pwd
/root/cluster/vpa/autoscaler/vertical-pod-autoscaler/deploy
[root@k8s-master-1 deploy]# grep "image" admission-controller-deployment.yaml image: k8s.gcr.io/autoscaling/vpa-admission-controller:0.10.0imagePullPolicy: IfNotPresent
[root@k8s-master-1 deploy]# grep image recommender-deployment.yaml image: k8s.gcr.io/autoscaling/vpa-recommender:0.10.0imagePullPolicy: IfNotPresent
[root@k8s-master-1 deploy]# grep image updater-deployment.yaml image: k8s.gcr.io/autoscaling/vpa-updater:0.10.0imagePullPolicy: IfNotPresent
# 下载安装包git clone https://github.com/kubernetes/autoscaler.git# 并在目录中运行以下命令vertical-pod-autoscaler
[root@k8s-master-1 hack]# ./vpa-up.sh
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalercheckpoints.autoscaling.k8s.io created
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalers.autoscaling.k8s.io created
clusterrole.rbac.authorization.k8s.io/system:metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:vpa-actor created
clusterrole.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
clusterrole.rbac.authorization.k8s.io/system:evictioner created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-actor created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
clusterrole.rbac.authorization.k8s.io/system:vpa-target-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-target-reader-binding created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-evictionter-binding created
serviceaccount/vpa-admission-controller created
clusterrole.rbac.authorization.k8s.io/system:vpa-admission-controller created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-admission-controller created
clusterrole.rbac.authorization.k8s.io/system:vpa-status-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-status-reader-binding created
serviceaccount/vpa-updater created
deployment.apps/vpa-updater created
serviceaccount/vpa-recommender created
deployment.apps/vpa-recommender created
Generating certs for the VPA Admission Controller in /tmp/vpa-certs.
Generating RSA private key, 2048 bit long modulus (2 primes)
..............................................................+++++
.....................................+++++
e is 65537 (0x010001)
Generating RSA private key, 2048 bit long modulus (2 primes)
..............+++++
........+++++
e is 65537 (0x010001)
Signature ok
subject=CN = vpa-webhook.kube-system.svc
Getting CA Private Key
Uploading certs to the cluster.
secret/vpa-tls-certs created
Deleting /tmp/vpa-certs.
deployment.apps/vpa-admission-controller created
service/vpa-webhook created# 关闭命令./hack/vpa-down.sh# 注意:如果您在此步骤中看到以下错误,请将 openssl 升级到 1.1.1 或更高版本(需要支持 -addext 选项)或在0.8 发布分支上使用 ./hack/vpa-up.sh unknown option -addext# 查看部署的yaml文件内容./hack/vpa-process-yamls.sh print# 查看运行情况
[root@k8s-master-1 hack]# kubectl get pods -A | grep vpa
kube-system     vpa-admission-controller-657857bfb7-s72df   1/1     Running     0          32s
kube-system     vpa-recommender-77dccb87b8-nx9gd            1/1     Running     0          32s
kube-system     vpa-updater-5f574b5d57-vsjpv                1/1     Running     0          34s

VPA实例

​ 安装后,系统已准备好为您的 pod 推荐和设置资源请求。为了使用它,您需要为要自动计算资源需求的每个控制器插入一个Vertical Pod Autoscaler资源。这将是最常见的Deployment。VPA有三种运行模式

  • "Auto":VPA 在创建 pod 时分配资源请求,并使用首选更新机制在现有 pod 上更新它们。目前这相当于"Recreate"(见下文)。一旦 pod 请求的免重启(“就地”)更新可用,它可能会被该"Auto"模式用作首选的更新机制。注意: VPA 的此功能是实验性的,可能会导致您的应用程序停机,当目前运行的pod的资源达不到VPA的推荐值,就会执行pod驱逐,重新部署新的足够资源的服务
  • "Recreate":VPA 在创建 Pod 时分配资源请求,并在现有 Pod 上更新它们,当请求的资源与新建议有很大差异时(尊重 Pod 中断预算,如果定义)。这种模式应该很少使用,只有当您需要确保在资源请求发生变化时重新启动 Pod 时。否则,更喜欢这种"Auto"模式,一旦它们可用,就可以利用重新启动免费更新。注意: VPA 的此功能是实验性的,可能会导致您的应用程序停机
  • "Initial":VPA 仅在创建 pod 时分配资源请求,以后不会更改它们
  • "Off":VPA 不会自动更改 Pod 的资源需求。这些建议是经过计算的,并且可以在 VPA 对象中进行检查。这种模式仅获取资源推荐 值,但是不更新Pod

updateMode: Off

# 测试yaml内容如下
[root@k8s-master-1 VPA]# cat vpa-off.yaml
apiVersion: v1
kind: Namespace
metadata:name: vpa
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: vpa
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentresources:requests:cpu: 100mmemory: 150Mi
---
apiVersion: v1
kind: Service
metadata:name: nginxnamespace: vpa
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 45425selector:app: nginx
---
apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:name: nginx-vpanamespace: vpa
spec:targetRef:apiVersion: "apps/v1"kind: Deploymentname: nginxupdatePolicy:updateMode: "Off"resourcePolicy:containerPolicies:- containerName: "nginx"minAllowed:cpu: "100m"memory: "150Mi"maxAllowed:cpu: "2000m"memory: "2600Mi"
# 查看pod和SVC
[root@k8s-master-1 VPA]# kubectl get pods -n vpa
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5f598bd784-bsxqp   1/1     Running   0          99s
nginx-5f598bd784-f2dnx   1/1     Running   0          99s
[root@k8s-master-1 VPA]# kubectl get svc -n vpa
NAME    TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.0.68.114   <none>        80:45425/TCP   105s# 查看vpa
[root@k8s-master-1 VPA]# kubectl describe vpa nginx-vpa -n vpa
Name:         nginx-vpa
Namespace:    vpa
Labels:       <none>
Annotations:  <none>
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
Metadata:Creation Timestamp:  2022-04-10T10:23:51ZGeneration:          2Managed Fields:API Version:  autoscaling.k8s.io/v1beta2Fields Type:  FieldsV1fieldsV1:f:metadata:f:annotations:.:f:kubectl.kubernetes.io/last-applied-configuration:f:spec:.:f:resourcePolicy:.:f:containerPolicies:f:targetRef:.:f:apiVersion:f:kind:f:name:f:updatePolicy:.:f:updateMode:Manager:      kubectl-client-side-applyOperation:    UpdateTime:         2022-04-10T10:23:51ZAPI Version:  autoscaling.k8s.io/v1Fields Type:  FieldsV1fieldsV1:f:status:.:f:conditions:f:recommendation:.:f:containerRecommendations:Manager:         recommenderOperation:       UpdateTime:            2022-04-10T10:24:32ZResource Version:  729060UID:               c09b2670-d443-4f44-8c13-87971cc7bf3e
Spec:Resource Policy:Container Policies:Container Name:  nginxMax Allowed:Cpu:     2000mMemory:  2600MiMin Allowed:Cpu:     100mMemory:  150MiTarget Ref:API Version:  apps/v1Kind:         DeploymentName:         nginxUpdate Policy:Update Mode:  Off
Status:Conditions:Last Transition Time:  2022-04-10T10:24:32ZStatus:                TrueType:                  RecommendationProvidedRecommendation:Container Recommendations:Container Name:  nginxLower Bound:                        # 下限值Cpu:     100mMemory:  262144kTarget:                           # 推荐值Cpu:     296mMemory:  262144kUncapped Target:                  # 如果没有为VPA提供最小或最大边界,则表示目标利用率Cpu:     296mMemory:  262144kUpper Bound:                        # 上限值Cpu:     2Memory:  728383116
Events:          <none>
# 上面结果表示,推荐的Pod的CPU 请求为296m,推荐的内存请求为 262144k字节# 压测 nginx
[root@k8s-master-1 VPA]# yum -y install httpd-tools ab
[root@k8s-master-1 VPA]# ab -c 3000 -n 10000000 http://192.168.0.10:45425/# 查看Pod负载
[root@k8s-master-1 ~]# kubectl top pods -n vpa
NAME                    CPU(cores)   MEMORY(bytes)
nginx-c94c9f468-5gf7l   312m         5Mi
nginx-c94c9f468-5tx45   324m         5Mi [root@k8s-master-1 VPA]# kubectl describe vpa nginx-vpa -n vpa
Name:         nginx-vpa
Namespace:    vpa
Labels:       <none>
Annotations:  <none>
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
...............................................................
Spec:
...............................................................Recommendation:Container Recommendations:Container Name:  nginxLower Bound:Cpu:     100mMemory:  262144kTarget:Cpu:     323mMemory:  262144kUncapped Target:Cpu:     323mMemory:  262144kUpper Bound:Cpu:     2Memory:  561361649
Events:          <none># 从以上信息可以看出, VPA对Pod给出了推荐值: Cpu: 323m ,因为我们这里设置了 updateMode: "Off" Off",所以不会更新 Pod

updateMode: On

# 测试yaml,将updateMode:off中的requests 改为 CPU:50m,Memory: 50Mi,同时将updateMode修改为Auto# 查看pod和svc
[root@k8s-master-1 VPA]# kubectl get pods -n vpa
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5dbcbbdfcf-8lqfj   1/1     Running   0          9s
nginx-5dbcbbdfcf-hprgm   1/1     Running   0          9s
[root@k8s-master-1 VPA]# kubectl get svc -n vpa
NAME    TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.0.200.5   <none>        80:45425/TCP   15s# 进行压测,压测到一半时,突然连接断了,说明POD被重新创建了
[root@k8s-master-1 VPA]# ab -c 1000 -n 10000000 http://192.168.0.10:45425/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.0.10 (be patient)
apr_socket_recv: Connection reset by peer (104)
Total of 187078 requests completed# 查看vpa
[root@k8s-master-1 VPA]# kubectl describe vpa nginx-vpa -n vpa | tail -n 20Conditions:Last Transition Time:  2022-04-10T10:41:32ZStatus:                TrueType:                  RecommendationProvidedRecommendation:Container Recommendations:Container Name:  nginxLower Bound:Cpu:     100mMemory:  262144kTarget:Cpu:     350mMemory:  262144kUncapped Target:Cpu:     350mMemory:  262144kUpper Bound:Cpu:     2Memory:  405160855
Events:          <none># 查看event,从输出信息可以看到,vpa 执行了EvictedBy VPA ,自动停掉了 nginx ,然后使用VPA推荐的资源启动了新的 nginx
[root@k8s-master-1 VPA]# kubectl get event -n vpa
LAST SEEN   TYPE     REASON              OBJECT                        MESSAGE
4m17s       Normal   Scheduled           pod/nginx-5dbcbbdfcf-8lqfj    Successfully assigned vpa/nginx-5dbcbbdfcf-8lqfj to k8s-node-1
4m16s       Normal   Pulled              pod/nginx-5dbcbbdfcf-8lqfj    Container image "nginx" already present on machine
4m16s       Normal   Created             pod/nginx-5dbcbbdfcf-8lqfj    Created container nginx
4m16s       Normal   Started             pod/nginx-5dbcbbdfcf-8lqfj    Started container nginx
2m24s       Normal   Killing             pod/nginx-5dbcbbdfcf-8lqfj    Stopping container nginx
2m24s       Normal   EvictedByVPA        pod/nginx-5dbcbbdfcf-8lqfj    Pod was evicted by VPA Updater to apply resource recommendation.
2m24s       Normal   Scheduled           pod/nginx-5dbcbbdfcf-d8pxz    Successfully assigned vpa/nginx-5dbcbbdfcf-d8pxz to k8s-node-1
2m22s       Normal   Pulled              pod/nginx-5dbcbbdfcf-d8pxz    Container image "nginx" already present on machine
2m22s       Normal   Created             pod/nginx-5dbcbbdfcf-d8pxz    Created container nginx
2m22s       Normal   Started             pod/nginx-5dbcbbdfcf-d8pxz    Started container nginx
84s         Normal   Scheduled           pod/nginx-5dbcbbdfcf-f9bfp    Successfully assigned vpa/nginx-5dbcbbdfcf-f9bfp to k8s-node-1
82s         Normal   Pulled              pod/nginx-5dbcbbdfcf-f9bfp    Container image "nginx" already present on machine
82s         Normal   Created             pod/nginx-5dbcbbdfcf-f9bfp    Created container nginx
82s         Normal   Started             pod/nginx-5dbcbbdfcf-f9bfp    Started container nginx
4m17s       Normal   Scheduled           pod/nginx-5dbcbbdfcf-hprgm    Successfully assigned vpa/nginx-5dbcbbdfcf-hprgm to k8s-node-1
4m16s       Normal   Pulled              pod/nginx-5dbcbbdfcf-hprgm    Container image "nginx" already present on machine
4m16s       Normal   Created             pod/nginx-5dbcbbdfcf-hprgm    Created container nginx
4m16s       Normal   Started             pod/nginx-5dbcbbdfcf-hprgm    Started container nginx
84s         Normal   Killing             pod/nginx-5dbcbbdfcf-hprgm    Stopping container nginx
84s         Normal   EvictedByVPA        pod/nginx-5dbcbbdfcf-hprgm    Pod was evicted by VPA Updater to apply resource recommendation. ######## 这里执行了更新操作
4m17s       Normal   SuccessfulCreate    replicaset/nginx-5dbcbbdfcf   Created pod: nginx-5dbcbbdfcf-8lqfj
4m17s       Normal   SuccessfulCreate    replicaset/nginx-5dbcbbdfcf   Created pod: nginx-5dbcbbdfcf-hprgm
2m24s       Normal   SuccessfulCreate    replicaset/nginx-5dbcbbdfcf   Created pod: nginx-5dbcbbdfcf-d8pxz
84s         Normal   SuccessfulCreate    replicaset/nginx-5dbcbbdfcf   Created pod: nginx-5dbcbbdfcf-f9bfp
4m18s       Normal   ScalingReplicaSet   deployment/nginx              Scaled up replica set nginx-5dbcb# 查看pod,可以看到pod的名称发生变化了,可见被重新创建了
[root@k8s-master-1 VPA]# kubectl get pods -n vpa
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5dbcbbdfcf-d8pxz   1/1     Running   0          4m
nginx-5dbcbbdfcf-f9bfp   1/1     Running   0          3m# 查看pod的request,可以重新生成了新的资源限制,随着服务的负载的变化, VPA的推荐值也会不断变化。当目前运行的pod的资源达不到VPA的推荐值,就会执行pod驱逐,重新部署新的足够资源的服务。
[root@k8s-master-1 VPA]# kubectl describe pods nginx-5dbcbbdfcf-d8pxz -n vpa | grep -A 3 -i requestsRequests:cpu:        350mmemory:     262144kEnvironment:  <none>

k8s之vpa浅析(附带案例)相关推荐

  1. Kubernetes(K8s)容器设计模式实践案例 – 分散收集模式

    <Kubernetes与云原生应用>专栏是InfoQ向轻元科技首席架构师王昕约稿的系列 文章.本专栏包含8篇内容,将会从介绍和分析Kubernetes系统以及云原生应用 入手,逐步推出基于 ...

  2. html5+Css总结(附带案例)

    HtmL5 和CSS一些常见总结 前端(通常指的是用户能够看到)网页通常是由三部分组成: 1.html:也是前端网页基本框架结构,类似于骨架一样的作用 2.CSS: 也叫层叠样式表,就是为美化界面而存 ...

  3. 【Linux云计算架构:第四阶段-Linux虚拟化-私有云-docker】第12章—— 搭建 Kubernetes 的 web 管理界面和基于 k8s 搭建+redis 集群案例

    13.1 部署 Kubernetes Dashboard web 界面 13.1.1 创建 dashboard-deployment.yaml deployment 配置文件 13.1.2 创建 da ...

  4. docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例

    Volume数据卷的由来: Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载只读镜像层并在其上添加一个读写层.如果运行中的容器修改了现有的一个已经存在的 ...

  5. ln -s命令 linux_浅谈linux中ln命令,附带案例

    链接类型: 1.硬链接 通过索引节点来进行连接.在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index).多个文件名指向同一索引节点是 ...

  6. vue项目中swiper动态更新后无法轮播问题 附带案例代码

    swiper是很常用的一个组件,我项目中用到的版本是4.1.6.刚开始,我就按照官网的案例写了个demo,当然图片都是静态写死的,确实可以轮播了,但是我项目的需求是要动态修改轮播图的内容.然后我就改成 ...

  7. 移动端js触摸touch详解(附带案例源码)

    移动端触摸滑动原理详解案例,实现过程通过添加DOM标签的触摸事件监听,并计算触摸距离,通过距离坐标计算触摸角度,最后通过触摸角度去判断往哪个方向触摸的. 触摸的事件列表 触摸的4个事件: touchs ...

  8. K8S中deployment和service案例

    文章目录 案例要求: 1.案例一 1 创建deployment,在还原到之前版本 2.案例二: 副本数扩容 3.案例三 多端口实例 4.部署service端,在容器外进行访问 案例要求: 1.创建一个 ...

  9. 单例设计模式(Singleton)附带案例代码仓库

    目录 1 .单例模式的结构 2 .单例模式的实现 2.1.饿汉式(静态变量方式) 2.2.饿汉式(静态代码块方式) 2.3.懒汉式(线程不安全) 2.4.懒汉式(线程安全) 2.5.懒汉式(双重检查锁 ...

最新文章

  1. LSTM情感分类问题再战
  2. ggplot2笔记7:定位(分面和坐标系)
  3. lucene反向索引——倒排表无论是文档号及词频,还是位置信息,都是以跳跃表的结构存在的...
  4. 绕过TracerPid检测
  5. 据说一般人轻易做不了技术支撑…
  6. Faster RCNN算法详解
  7. Android开发之原生定位的方法(GPS,网络定位)
  8. .net应用程序中添加chm帮助文档打开显示此程序无法显示网页问题
  9. LeetCode MySQL 1549. The Most Recent Orders for Each Product
  10. java session 生命周期_Java中httpsession生命周期
  11. JBoss的部署机制
  12. matlab方差 anov,方差分析
  13. 深入浅出理解视频编码H264结构(内涵福利)
  14. 虚拟服务器IP地址创建,虚拟服务器的ip地址
  15. Junos SRX NAT介绍
  16. 【Linux】云服务器的购买与Linux远程连接
  17. 计算机提取公式算等差平均,高中数学统计与概率主线分析.ppt
  18. 如何制作自己的图片数据集-基于tensorflow
  19. 什么是凸多边形和凹多边形
  20. iOS保存视频、图片到相册

热门文章

  1. 【Matlab DVRP】蚁群算法求解带距离的车辆路径规划问题【含源码 1040期】
  2. Hyper-v搭建K8s v1.18.6 单主集群环境(包括dashboard)
  3. 马斯克认错:裁掉他们是我最大的错误,但黑粉们却没能笑太久...
  4. 高质量=高成本?优思学院告诉你并非必然!
  5. crc16的c语言函数 计算ccitt_使用C语言实现CRC校验的方法
  6. 爬取小猪网的短租房信息
  7. Freedom of Choice URAL - 1517
  8. 自行车 快拆应该锁多紧
  9. “立体巴士”梦想,还是幻想
  10. Django 框架学习经验分享