当前位置:   article > 正文

k8s-控制器

k8s-控制器

概述

控制器是什么

  • 控制器是 k8s 内置的管理工具。可以帮助用户实现 Pod 的自动部署、自维护、扩容、滚动更新等功能的自动化程序

为什么要使用控制器

  •  有大量 Pod 需要维护管理
  • 需要维护 Pod 的健康状态
  • 控制器可以像机器人一样可以替用户完成维护管理的工作

Deployment 控制器

  • 最常用的无状态服务控制器,由 Deployment、ReplicaSet、Pod 组成、支持集群扩容缩容、滚动、更新、自动维护 Pod 可用性及副本数量等功能
  • ReplicaSet 和 Pod 由 Deployment 自动管理,用户无需干预 

创建 Deployment

  1. # 资源对象模板
  2. [root@master ~]# kubectl create deployment (name) --image=(名称:标签) --dry-run=client -o yaml
  3. [root@master ~]# vim mydeploy.yaml
  4. kind: Deployment # 资源对象类型
  5. apiVersion: apps/v1 # 版本
  6. metadata: # 元数据
  7. name: myweb # 名称
  8. spec: # 详细定义
  9. replicas: 2 # 副本数量
  10. selector: # 定义标签选择器
  11. matchLabels: # 支持 matchExpressions 表达式语法
  12. app: httpd # 通过标签来确定那个 Pod 由它来管理
  13. template: # 定义用来创建 Pod 的模板,以下为 Pod 定义
  14. metadata: # Pod 元数据
  15. labels: # 名称由控制器生成
  16. app: httpd # 这里自能定义标签
  17. spec: # Pod 的详细定义
  18. restartPolicy: Always # 重启策略
  19. containers: # 容器定义
  20. - name: apache # 容器名称
  21. image: myos:httpd # 创建容器使用的镜像
  22. [root@master ~]# kubectl apply -f mydeploy.yaml
  23. deployment.apps/myweb created
  24. [root@master ~]# kubectl get deployments.apps
  25. NAME READY UP-TO-DATE AVAILABLE AGE
  26. myweb 2/2 2 2 11s
  27. [root@master ~]# kubectl get replicasets.apps
  28. NAME DESIRED CURRENT READY AGE
  29. myweb-5c75f7c579 2 2 2 24s
  30. [root@master ~]# kubectl get pods
  31. NAME READY STATUS RESTARTS AGE
  32. myweb-5c75f7c579-fcwdw 1/1 Running 0 40s
  33. myweb-5c75f7c579-mv62j 1/1 Running 0 40s

如何访问 Deployment 资源

  • Deployment 管理多个 Pod,可以使用服务对其资源进行访问

ClusterIP 服务

  1. # 创建服务访问集群
  2. [root@master ~]# vim websvc.yaml
  3. ---
  4. kind: Service
  5. apiVersion: v1
  6. metadata:
  7. name: websvc
  8. spec:
  9. type: ClusterIP
  10. clusterIP: 10.245.1.80
  11. selector:
  12. app: httpd
  13. ports:
  14. - protocol: TCP
  15. port: 80
  16. targetPort: 80
  17. [root@master ~]# kubectl apply -f websvc.yaml
  18. [root@master ~]# curl http://10.245.1.80
  19. Welcome to The Apache.

Pod维护管理

  1. # 自维护自治理
  2. [root@master ~]# kubectl get pods -o wide
  3. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  4. myweb-5c75f7c579-fcwdw 1/1 Running 0 36m 10.244.240.166 node-0004 <none> <none>
  5. myweb-5c75f7c579-mv62j 1/1 Running 0 36m 10.244.153.160 node-0005 <none> <none>
  6. # Pod 被删除后,Deploy 会自动创建新的 Pod 来维护集群的完整性
  7. [root@master ~]# kubectl delete pods --all
  8. pod "myweb-5c75f7c579-fcwdw" deleted
  9. pod "myweb-5c75f7c579-mv62j" deleted
  10. [root@master ~]# kubectl get pods -o wide
  11. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  12. myweb-5c75f7c579-645km 1/1 Running 0 5s 10.244.153.161 node-0005 <none> <none>
  13. myweb-5c75f7c579-tfxw2 1/1 Running 0 4s 10.244.243.222 node-0003 <none> <none>

集群扩容缩容

  1. [root@master ~]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. myweb-5c75f7c579-645km 1/1 Running 0 6m19s
  4. myweb-5c75f7c579-tfxw2 1/1 Running 0 6m18s
  5. # 扩容
  6. [root@master ~]# kubectl scale deployment myweb --replicas 10
  7. deployment.apps/myweb scaled
  8. [root@master ~]# kubectl get pods
  9. NAME READY STATUS RESTARTS AGE
  10. myweb-5c75f7c579-645km 1/1 Running 0 7m16s
  11. myweb-5c75f7c579-bwxhf 1/1 Running 0 10s
  12. myweb-5c75f7c579-gbbr9 1/1 Running 0 10s
  13. myweb-5c75f7c579-hc2qv 1/1 Running 0 10s
  14. myweb-5c75f7c579-nh778 1/1 Running 0 10s
  15. myweb-5c75f7c579-pjqhc 1/1 Running 0 10s
  16. myweb-5c75f7c579-tfxw2 1/1 Running 0 7m15s
  17. myweb-5c75f7c579-tj7ct 1/1 Running 0 10s
  18. myweb-5c75f7c579-wzlnt 1/1 Running 0 10s
  19. myweb-5c75f7c579-zknbd 1/1 Running 0 10s
  20. # 缩容
  21. [root@master ~]# kubectl scale deployment myweb --replicas 2
  22. deployment.apps/myweb scaled
  23. [root@master ~]# kubectl get pods
  24. NAME READY STATUS RESTARTS AGE
  25. myweb-5c75f7c579-gbbr9 1/1 Running 0 80s
  26. myweb-5c75f7c579-tfxw2 1/1 Running 0 8m25s

历史版本信息

  1. # 查看历史版本
  2. [root@master ~]# kubectl rollout history deployment myweb
  3. deployment.apps/myweb
  4. REVISION CHANGE-CAUSE
  5. 1 <none>
  6. # 添加注释信息
  7. [root@master ~]# kubectl annotate deployments.apps myweb kubernetes.io/change-cause="httpd.v1"
  8. deployment.apps/myweb annotated
  9. [root@master ~]# kubectl rollout history deployment myweb
  10. deployment.apps/myweb
  11. REVISION CHANGE-CAUSE
  12. 1 httpd.v1

滚动更新

  1. # 修改镜像,滚动更新集群(apache是Deployment资源文件中)
  2. [root@master ~]# kubectl set image deployment myweb apache=myos:nginx
  3. deployment.apps/myweb image updated
  4. # 访问验证服务
  5. [root@master ~]# curl http://10.245.1.80
  6. Nginx is running !
  7. # 查看历史版本信息
  8. [root@master ~]# kubectl rollout history deployment myweb
  9. deployment.apps/myweb
  10. REVISION CHANGE-CAUSE
  11. 1 httpd.v1
  12. 2 httpd.v1
  13. # 给新版本添加注释信息
  14. [root@master ~]# kubectl annotate deployments myweb kubernetes.io/change-cause="nginx.v1"
  15. deployment.apps/myweb annotated
  16. # 查看历史版本信息
  17. [root@master ~]# kubectl rollout history deployment myweb
  18. deployment.apps/myweb
  19. REVISION CHANGE-CAUSE
  20. 1 httpd.v1
  21. 2 nginx.v1

版本回滚

  1. [root@master ~]# curl http://10.245.1.80
  2. Nginx is running !
  3. # 查看历史版本
  4. [root@master ~]# kubectl rollout history deployment myweb
  5. deployment.apps/myweb
  6. REVISION CHANGE-CAUSE
  7. 1 httpd.v1
  8. 2 nginx.v1
  9. # 历史版本与回滚
  10. [root@master ~]# kubectl rollout undo deployment myweb --to-revision 1
  11. deployment.apps/myweb rolled back
  12. # 验证版本回滚
  13. [root@master ~]# curl http://10.245.1.80
  14. Welcome to The Apache.
  15. # 查看历史版本
  16. [root@master ~]# kubectl rollout history deployment myweb
  17. deployment.apps/myweb
  18. REVISION CHANGE-CAUSE
  19. 2 nginx.v1
  20. 3 httpd.v1
  21. # 删除控制器方法1
  22. [root@master ~]# kubectl delete deployments myweb
  23. deployment.apps "myweb" deleted
  24. # 删除控制器方法2
  25. [root@master ~]# kubectl delete -f mydeploy.yaml
  26. deployment.apps "myweb" deleted

DaemonSet控制器

特性

  • 无法自定义副本数量
  • 所创建的 Pod 与 node 节点绑定
  • 每个 node 上都会运行一个 Pod
  • 当有新 Node 加入集群时,会为它新增 Pod 副本,当 Node 从集群移除时,这些 Pod 也会被回收,典型应用:kube-proxy

资源对象案例

  1. [root@master ~]# cp -a mydeploy.yaml myds.yaml
  2. [root@master ~]# vim myds.yaml
  3. ---
  4. kind: DaemonSet # 资源对象类型
  5. apiVersion: apps/v1
  6. metadata:
  7. name: myds # 控制器名称
  8. spec:
  9. # replicas: 2 # 删除副本参数
  10. selector:
  11. matchLabels:
  12. app: httpd
  13. template:
  14. metadata:
  15. labels:
  16. app: httpd
  17. spec:
  18. restartPolicy: Always
  19. containers:
  20. - name: webserver
  21. image: myos:httpd
  22. imagePullPolicy: Always
  23. # 与 node 绑定,每节点都创建容器
  24. [root@master ~]# kubectl apply -f myds.yaml
  25. [root@master ~]# kubectl get pods -o wide
  26. NAME READY STATUS RESTARTS IP NODE
  27. myds-msrcx 1/1 Running 0 10.244.1.11 node-0001
  28. myds-lwq8l 1/1 Running 0 10.244.2.17 node-0002
  29. myds-4wt72 1/1 Running 0 10.244.3.14 node-0003
  30. myds-6k82t 1/1 Running 0 10.244.4.15 node-0004
  31. myds-9c6wc 1/1 Running 0 10.244.5.19 node-0005

污点干扰

  1. # 设置污点,重建 daemonset
  2. [root@master ~]# kubectl taint node node-0001 k=v:NoSchedule
  3. node/node-0001 tainted
  4. [root@master ~]# kubectl delete -f myds.yaml
  5. daemonset.apps "myds" deleted
  6. [root@master ~]# kubectl apply -f myds.yaml
  7. daemonset.apps/myds created
  8. # 有污点不会部署,特殊需求可以设置容忍策略
  9. [root@master ~]# kubectl get pods
  10. NAME READY STATUS RESTARTS AGE
  11. myds-pkdn9 1/1 Running 0 2s
  12. myds-pkp6b 1/1 Running 0 2s
  13. myds-j84cw 1/1 Running 0 2s
  14. myds-5c69p 1/1 Running 0 2s
  15. # 删除污点后会立即部署
  16. [root@master ~]# kubectl taint node node-0001 k=v:NoSchedule-
  17. node/node-0001 untainted
  18. [root@master ~]# kubectl get pods
  19. NAME READY STATUS RESTARTS AGE
  20. myds-2c86p 1/1 Running 0 1s
  21. myds-pkdn9 1/1 Running 0 9s
  22. myds-pkp6b 1/1 Running 0 9s
  23. myds-j84cw 1/1 Running 0 9s
  24. myds-5c69p 1/1 Running 0 9s
  25. # 删除控制器
  26. [root@master ~]# kubectl delete -f myds.yaml
  27. daemonset.apps "myds" deleted

Job/CronJob控制器

  • Job 是一个单任务控制器,负责执行一次任务,保证任务在一个或多个Pod上执行成功
  • CronJob 像是Job的升级版,它是基于时间管理的Job控制器

Job资源对象

restartPolicy 会判断 exit 状态码

状态码为 0 表示正常,其它都表示失败

  1. # 资源对象模板
  2. [root@master ~]# kubectl create job myjob --image=myos:8.5 --dry-run=client -o yaml -- sleep 3
  3. [root@master ~]# vim myjob.yaml
  4. ---
  5. kind: Job
  6. apiVersion: batch/v1
  7. metadata:
  8. name: myjob # 资源对象名称
  9. spec: # Job的详细定义
  10. template: # 以下定义 Pod 模板
  11. spec: # Pod的详细定义
  12. restartPolicy: OnFailure # 只支持[OnFailure,Nerver]
  13. containers: # 容器定义
  14. - name: myjob # 容器名称
  15. image: myos:8.5 # 创建容器使用的镜像
  16. command: ["/bin/bash"] # 自定义任务,可使用脚本
  17. args:
  18. - -c
  19. - |
  20. sleep 3
  21. exit $((RANDOM%2))
  22. [root@master ~]# kubectl apply -f myjob.yaml
  23. # 失败了会重启
  24. [root@master ~]# kubectl get pods -l job-name=myjob -w
  25. NAME READY STATUS RESTARTS AGE
  26. myjob--1-lrtbk 1/1 Running 0 2s
  27. myjob--1-lrtbk 0/1 Error 0 4s
  28. myjob--1-lrtbk 1/1 Running 1 (1s ago) 5s
  29. myjob--1-lrtbk 0/1 Completed 1 9s
  30. # 完成后不会重复执行
  31. [root@master ~]# kubectl get jobs.batch
  32. NAME COMPLETIONS DURATION AGE
  33. myjob 1/1 8s 12s
  34. # 删除Job控制器
  35. [root@master ~]# kubectl delete -f myjob.yaml
  36. job.batch "myjob" deleted

CronJob资源对象

时间定义 schedule:分、时、日、月、周

  1. # 资源对象模板
  2. [root@master ~]# kubectl create cronjob mycj --image=myos:8.5 --schedule='* * * * *' --dry-run=client -o yaml -- sleep 3
  3. [root@master ~]# vim mycj.yaml
  4. ---
  5. kind: CronJob
  6. apiVersion: batch/v1
  7. metadata:
  8. name: mycj
  9. spec:
  10. schedule: "* * * * 1-5"
  11. jobTemplate: # 以下定义 Job 模板
  12. spec:
  13. template:
  14. spec:
  15. restartPolicy: OnFailure
  16. containers:
  17. - name: myjob
  18. image: myos:8.5
  19. command: ["/bin/bash"]
  20. args:
  21. - -c
  22. - |
  23. sleep 3
  24. exit $((RANDOM%2))
  25. [root@master ~]# kubectl apply -f mycj.yaml
  26. cronjob.batch/mycj created
  27. [root@master ~]# kubectl get cronjobs
  28. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  29. mycj */1 * * * 1-5 False 0 <none> 4s
  30. # 按照时间周期,每分钟触发一个任务
  31. [root@master ~]# kubectl get jobs -w
  32. NAME READY STATUS RESTARTS
  33. mycj-27808172--1-w6sbx 0/1 Pending 0
  34. mycj-27808172--1-w6sbx 0/1 ContainerCreating 0
  35. mycj-27808172--1-w6sbx 1/1 Running 0
  36. mycj-27808172--1-w6sbx 0/1 Completed 1
  37. # 保留三次结果,多余的会被删除
  38. [root@master ~]# kubectl get jobs
  39. NAME COMPLETIONS DURATION AGE
  40. mycj-27605367 1/1 31s 3m30s
  41. mycj-27605368 1/1 31s 2m30s
  42. mycj-27605369 1/1 31s 90s
  43. mycj-27605370 0/1 30s 30s
  44. [root@master ~]# kubectl get jobs
  45. NAME COMPLETIONS DURATION AGE
  46. mycj-27605368 1/1 31s 2m33s
  47. mycj-27605369 1/1 31s 93s
  48. mycj-27605370 1/1 31s 33s
  49. # 删除CJ控制器
  50. [root@master ~]# kubectl delete -f mycj.yaml
  51. cronjob.batch "mycj" deleted

StatefulSet控制器

StatefulSet 旨在与有状态的应用及分布式系统一起使用,涉及了 Headless 服务、存储卷、DNS 等相关知识点,是一个宽泛而复杂的话题

图例:

Headless 服务

  • 在配置 StatefulSet 的时候,首先要定义一个 Headless 的服务
  • 在创建 Pod 的时候会自动把 <Pod名称> 注册为域名
  1. # 配置 headless 服务
  2. [root@master ~]# vim mysvc2.yaml
  3. ---
  4. kind: Service
  5. apiVersion: v1
  6. metadata:
  7. name: mysvc2
  8. spec:
  9. type: ClusterIP
  10. clusterIP: None # 设置 IP 为 None
  11. selector:
  12. app: httpd
  13. ports:
  14. - protocol: TCP
  15. port: 80
  16. targetPort: 80
  17. [root@master ~]# kubectl apply -f mysvc2.yaml
  18. service/mysvc2 created
  19. [root@master ~]# kubectl get service mysvc2
  20. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  21. mysvc2 ClusterIP None <none> 80/TCP 61s

StatefulSet资源对象

资源对象文件

  1. [root@master ~]# vim mysts.yaml
  2. ---
  3. kind: StatefulSet # 资源对象类型
  4. apiVersion: apps/v1
  5. metadata:
  6. name: mysts # 控制器名称
  7. spec:
  8. serviceName: mysvc2 # 新增 headless 服务名称
  9. replicas: 3
  10. selector:
  11. matchLabels:
  12. app: httpd
  13. template:
  14. metadata:
  15. labels:
  16. app: httpd
  17. spec:
  18. restartPolicy: Always
  19. containers:
  20. - name: webserver
  21. image: myos:httpd
  22. imagePullPolicy: Always
  23. [root@master ~]# kubectl apply -f mysts.yaml
  24. statefulset.apps/mysts created
  25. [root@master ~]# kubectl get pods
  26. NAME READY STATUS RESTARTS AGE
  27. mysts-0 1/1 Running 0 3s
  28. mysts-1 1/1 Running 0 2s
  29. mysts-2 1/1 Running 0 1s

访问 StatefulSet 资源

  1. # Pod 名称自动注册 DNS 服务
  2. [root@master ~]# host mysts-0.mysvc2.default.svc.cluster.local 10.245.0.10
  3. Using domain server:
  4. Name: 10.245.0.10
  5. Address: 10.245.0.10#53
  6. Aliases:
  7. mysts-0.mysvc2.default.svc.cluster.local has address 10.244.1.81
  8. [root@master ~]# host mysvc2.default.svc.cluster.local 10.245.0.10
  9. Using domain server:
  10. Name: 10.245.0.10
  11. Address: 10.245.0.10#53
  12. Aliases:
  13. mysvc2.default.svc.cluster.local has address 10.244.3.82
  14. mysvc2.default.svc.cluster.local has address 10.244.2.83
  15. mysvc2.default.svc.cluster.local has address 10.244.1.81
  16. # 删除sts控制器
  17. [root@master ~]# kubectl delete -f mysts.yaml -f mysvc2.yaml
  18. statefulset.apps "mysts" deleted
  19. service "mysvc2" deleted

HPA控制器

  • HorizontalPodAutoscaling 简称 HPA,可以在 kubernetes 集群中基于CPU利用率或其它应用程序提供的度量指标实现水平自动伸缩的功能,自动缩放POD的数量
  • 控制器会周期性的获取平均利用率
  • 与目标值相比较后来调整副本数量

图例:

创建 Deployment

  1. # 为 Deploy 控制器添加资源配额
  2. [root@master ~]# vim mydeploy.yaml
  3. ---
  4. kind: Deployment
  5. apiVersion: apps/v1
  6. metadata:
  7. name: myweb
  8. spec:
  9. replicas: 1 # 修改副本数量
  10. selector:
  11. matchLabels:
  12. app: httpd
  13. template:
  14. metadata:
  15. labels:
  16. app: httpd
  17. spec:
  18. restartPolicy: Always
  19. containers:
  20. - name: webserver
  21. image: myos:httpd
  22. imagePullPolicy: Always
  23. resources: # 为该资源设置配额
  24. requests: # HPA 控制器会根据配额使用情况伸缩集群
  25. cpu: 200m # CPU 配额

创建 ClusterIP 服务

  1. [root@master ~]# vim websvc.yaml
  2. ---
  3. kind: Service
  4. apiVersion: v1
  5. metadata:
  6. name: websvc
  7. spec:
  8. type: ClusterIP
  9. clusterIP: 10.245.1.80
  10. selector:
  11. app: httpd
  12. ports:
  13. - protocol: TCP
  14. port: 80
  15. targetPort: 80

创建后端集群

  1. [root@master ~]# kubectl apply -f mydeploy.yaml -f websvc.yaml
  2. deployment.apps/myweb created
  3. service/websvc created
  4. # 验证服务
  5. [root@master ~]# kubectl top pods
  6. NAME CPU(cores) MEMORY(bytes)
  7. myweb-c8c66f894-2cfjv 1m 17Mi
  8. [root@master ~]# curl -s http://10.245.1.80
  9. Welcome to The Apache.

创建 HPA 控制器

  1. [root@master ~]# vim myhpa.yaml
  2. ---
  3. kind: HorizontalPodAutoscaler
  4. apiVersion: autoscaling/v1
  5. metadata:
  6. name: myweb
  7. spec:
  8. minReplicas: 1 # 最少保留的副本数量
  9. maxReplicas: 5 # 最大创建的副本数量
  10. targetCPUUtilizationPercentage: 50 # 警戒值,以百分比计算
  11. scaleTargetRef: # 监控的资源对象
  12. kind: Deployment # 资源对象类型
  13. apiVersion: apps/v1
  14. name: myweb
  15. [root@master ~]# kubectl apply -f myhpa.yaml
  16. horizontalpodautoscaler.autoscaling/myweb created
  17. # 刚刚创建 unknown 是正常现象,最多等待 60s 就可以正常获取数据
  18. [root@master ~]# kubectl get horizontalpodautoscalers.autoscaling
  19. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
  20. myweb Deployment/myweb <unknown>/50% 1 5 0
  21. [root@master ~]# kubectl get horizontalpodautoscalers.autoscaling
  22. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
  23. myweb Deployment/myweb 0%/50% 1 5 1

弹性集群验证测试

持续访问 Web 服务,增加CPU负载,在超过警戒值之后,会触发扩容操作,等待几秒之后发现副本数量增加了

停止访问,让CPU空闲,为了防止集群性能抖动,副本不会立即释放,必须300秒内的平均负载小于警戒值,才开始释放副本,当副本达到最小值时停止释放

测试时可以通过访问php脚本增加CPU的负载

  1. # 终端 1 访问提高负载
  2. [root@master ~]# while sleep 1;do
  3. curl -s "http://10.245.1.80/info.php?id=100000" -o /dev/null
  4. done
  5. # 终端 2 监控 HPA 变化
  6. [root@master ~]# kubectl get hpa -w
  7. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
  8. myweb Deployment/myweb 0%/50% 1 3 1 8m21s
  9. myweb Deployment/myweb 49%/50% 1 3 1 9m
  10. myweb Deployment/myweb 56%/50% 1 3 1 9m15s
  11. myweb Deployment/myweb 56%/50% 1 3 2 9m30s
  12. myweb Deployment/myweb 37%/50% 1 3 2 9m45s
  13. myweb Deployment/myweb 32%/50% 1 3 2 10m
  14. myweb Deployment/myweb 41%/50% 1 3 2 11m
  15. myweb Deployment/myweb 48%/50% 1 3 2 11m
  16. myweb Deployment/myweb 51%/50% 1 3 2 11m
  17. myweb Deployment/myweb 59%/50% 1 3 2 11m
  18. myweb Deployment/myweb 58%/50% 1 3 3 12m
  19. myweb Deployment/myweb 42%/50% 1 3 3 12m
  20. myweb Deployment/myweb 34%/50% 1 3 3 12m
  21. # 如果 300s 内平均负载小于标准值,就会自动缩减集群规模
  22. [root@master ~]# kubectl get hpa -w
  23. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
  24. myweb Deployment/myweb 38%/50% 1 3 3 19m
  25. myweb Deployment/myweb 21%/50% 1 3 3 20m
  26. myweb Deployment/myweb 17%/50% 1 3 3 21m
  27. myweb Deployment/myweb 7%/50% 1 3 3 22m
  28. myweb Deployment/myweb 0%/50% 1 3 3 23m
  29. myweb Deployment/myweb 0%/50% 1 3 2 25m
  30. myweb Deployment/myweb 0%/50% 1 3 1 28m

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/214461
推荐阅读
相关标签
  

闽ICP备14008679号