Kubernetes-在Kubernetes中部署Tensorflow集群

【k8s实战】 在离线项目混部 通过kubeflow(tf-operator)部署TensorFlow机器学习任务+prometheus/grafana监控资源使用全过程(最新 图文) 目录在离线混合部署概念最新版kubeflow部署TensorFlow部署二级目录三级目录 在离线混合部署概念 先举一个例子,众所周知的天猫双十一当天的流量非常之大,那么就需要成百上千台服务器构成一个超大集群来提供计算能力,但是双十一过去之后,集群资源就面临着浪费的局面。假设业务分为在线和离线两种模式:在线任务需要资源相对较少,但要求响应时间短;离线任务则不需要对任务进行迅速响应,但是计算量相对较大、占用资源多。那么我们应该怎么在K8S集群上完成这两种业务的部署、并且使得CPU利用率始终维持在一个比较高的水平 阅读详情

知识准备

1、kubernetes中的基本概念如deployment,statefulset,rc,svc,pod等;

2、tensorflow分布式集群。

Tensorflow架构简介

使用Tensorflow进行训练分为单机模式和分布式集群模式

单机模式的比较简单(略)

分布式模式主要包括如下几个角色:

     ps服务器:进行参数处理

     worker服务器:进行梯度计算(GPU Server)

     tensorboard服务器:运行tensorboard展示计算图

     client服务器:运行训练程序

分布式模式下,ps和worker服务器会暴露grpc端口,client服务器通过grpc远程执行训练

Demo代码如下:

ps和worker启动

...
...
def main(unused_args):
  # Create Protobuf ServerDef
  server_def = tf.train.ServerDef(protocol="grpc")

  # Cluster info
  server_def.cluster = tf.train.ClusterSpec({
    "worker": [
        "worker-1:2222",
        "worker-2:2222",
        "worker-3:2222",
        "worker-4:2222"
    ],
    "ps":[
        "ps-1:2222",
        "ps-2:2222"
    ]})

  # Job name
  if not FLAGS.job_name:
    raise ValueError("Empty job_name")
  server_def.job_name = FLAGS.job_name

  # Task index
  if FLAGS.task_id < 0:
    raise ValueError("Invalid task_id: %d" % FLAGS.task_id)
  server_def.task_index = FLAGS.task_id

  # Create GRPC Server instance
  server = tf.train.Server(server_def)

  # join() is blocking, unlike start()
  server.join()


if __name__ == "__main__":
  tf.app.run()

Kubernetes上部署分布式Tensorflow

实现思路

1、ps/worker服务分别对应一个statefulset,ps/worker的个数则是statefulset的副本数,比如要创建3个ps服务器,就创建1个包括3个副本的的statefulset,ps/worker中需要安装tensorflow并启动grpc服务;

==> 为什么使用statefulset,因为分布式集群需要记录集群的cluster_spec,也就是ps和worker节点的grpc_url(包括主机名、端口),通过deployment/rc创建的pod主机名称是随机的,pod重建后主机名会变化,因此没办法记录,而statefulset创建的pod是不会变化的,即使Pod被重新调度创建,比如创建一个副本数为3,名称为ps的statefulset,则pod的名称固定为ps-1,ps-2,ps-3,这样根据名称和个数就知道了grpc url

2、client服务对应一个job,并创建一个svc用于暴露服务通过外部访问(主要是访问jupyter和sshd),client中需要安装tensorflow,jupyter,sshd

==> 为什么使用Job,因为client服务中主要是执行训练脚本,使用job资源,则训练脚本执行完成后Pod会自动删除

3、tensorboard服务对应一个replicaset,并创建一个svc用于包括服务通过外部访问tensorboard,tensorboard中需要安装tfboard并启动服务;

4、创建一个pvc,各个服务的Pod使用pvc共享数据

举例说明:

在Kubernetes中创建一个名为tf-dis-task的tensorflow集群,该集群包括2个ps server和3个worker server

以下资源是创建好之后该集群对应的所有资源

[root@k8s-node1 example]# kubectl --namespace=admin get all --selector=taskname=tf-dis-task
NAME                             READY   STATUS    RESTARTS   AGE
pod/tf-dis-task-ps-0             1/1     Running   0          12m
pod/tf-dis-task-ps-1             1/1     Running   0          12m
pod/tf-dis-task-session-v7j7f    1/1     Running   0          16m
pod/tf-dis-task-tf-board-tbq69   2/2     Running   0          16m
pod/tf-dis-task-worker-0         1/1     Running   0          17m
pod/tf-dis-task-worker-1         1/1     Running   0          17m
pod/tf-dis-task-worker-2         1/1     Running   0          17m

NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/tf-dis-task-session       NodePort    10.10.11.19    <none>        8888:32500/TCP   16m
service/tf-dis-task-session-ssh   NodePort    10.10.240.74   <none>        22:32051/TCP     16m
service/tf-dis-task-tf-board      NodePort    10.10.185.71   <none>        2080:32200/TCP   16m

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/tf-dis-task-tf-board   1         1         1       16m

NAME                                  READY   AGE
statefulset.apps/tf-dis-task-ps       2/2     12m
statefulset.apps/tf-dis-task-worker   3/3     17m

NAME                            COMPLETIONS   DURATION   AGE
job.batch/tf-dis-task-session   0/1           16m        16m

详细说明

1. 分别创建一个ps和worker的statefulset,对应名称是tf-dis-task-ps和tf-dis-task-worker,对应的pod名称分别为tf-dis-task-ps-0,tf-dis-task-ps-1,tf-dis-task-worker-0,tf-dis-task-worker-1,tf-dis-task-worker-2

这样集群的cluster_spec为:

"worker": [
    "tf-dis-task-worker-0.tf-dis-task-worker:2222",
    "tf-dis-task-worker-1.tf-dis-task-worker:2222",
    "tf-dis-task-worker-2.tf-dis-task-worker:2222"
],
"ps":[
    "tf-dis-task-ps-0.tf-dis-task-ps:2222",
    "tf-dis-task-ps-1.tf-dis-task-ps:2222"
]

在statefuleset中设置环境变量

ps|tf-dis-task-ps-0.tf-dis-task-ps:2222;tf-dis-task-ps-1.tf-dis-task-ps:2222,worker|tf-dis-task-worker-0.tf-dis-task-worker:2222;tf-dis-task-worker-1.tf-dis-task-worker:2222;tf-dis-task-worker-2.tf-dis-task-worker:2222

2. 创建一个client的job,名称为tf-dis-task-session,同时对应创建2个service,分别是tf-dis-task-session,tf-dis-task-session-ssh,分别暴露jupyter的端口(8888)和sshd的端口(22),这个就可以通过宿主机访问容器的jupyter和ssh了

3. 创建一个tensorboard的replicaset,名称为tf-dis-task-tf-board,同时对应创建一个service,名称为tf-dis-task-tf-board,暴露tensorboard的端口

4. ps和worker的statefulset设置环境变量,分别如下:

# PS的环境变量
[root@k8s-node1 example]# kubectl --namespace=admin get statefulsets.apps tf-dis-task-ps -oyaml
...
...
- env:
  - name: TASK_NAME
    value: tf-dis-task
  - name: CLUSTER_SPEC
    value: ps|tf-dis-task-ps-0.tf-dis-task-ps:2222;tf-dis-task-ps-1.tf-dis-task-ps:2222,worker|tf-dis-task-worker-0.tf-dis-task-worker:2222;tf-dis-task-worker-1.tf-dis-task-worker:2222;tf-dis-task-worker-2.tf-dis-task-worker:2222
  - name: RESOURCE_TYPE
    value: compute
  - name: RESOURCE_NAME
    value: ps

# Worker的环境变量
[root@k8s-node1 example]# kubectl --namespace=admin get statefulsets.apps tf-dis-task-worker -oyaml
...
...
- env:
  - name: TASK_NAME
    value: tf-dis-task
  - name: CLUSTER_SPEC
    value: ps|tf-dis-task-ps-0.tf-dis-task-ps:2222;tf-dis-task-ps-1.tf-dis-task-ps:2222,worker|tf-dis-task-worker-0.tf-dis-task-worker:2222;tf-dis-task-worker-1.tf-dis-task-worker:2222;tf-dis-task-worker-2.tf-dis-task-worker:2222
  - name: RESOURCE_TYPE
    value: compute
  - name: RESOURCE_NAME
    value: worker

5. ps和worker的容器启动方式为启动grpc server,startup脚本如下(部分内容)

...
...
function run_tensorflow_cluster() {
    # 根据hostname获取index
    TASK_INDEX=$(hostname | awk -F'-' '{print $NF}')
    SCRIPT_DIR=$( cd ${0%/*} && pwd -P )
    # grpc_tensorflow_server.py就是启动grpc server,内容略
    exec python ${SCRIPT_DIR}/grpc_tensorflow_server.py --cluster_spec=$CLUSTER_SPEC --job_name=$RESOURCE_NAME --task_id=$TASK_INDEX
}

...

case $RESOURCE_TYPE in
    "compute"     ) run_tensorflow_cluster ;;
    "tensorboard" ) run_tensorboard ;;
    "session"     ) run_tensorflow_session ;;
esac

6. client和tensorboard的容器则是分别启动jupyter和tensorboard,内容略

7. 通过以上方式可以ps/worker/client/tfboard可以使用一个镜像,通过RESOUCE_TYPE来区分启动方式

资源调度

kubernetes中的node节点包括如下几个场景

1、Node节点只有CPU;

2、Node节点既有CPU也有GPU;

3、部分Node节点运行其他服务,不想运行tensorflow

4、GPU Node节点的gpu型号不一致

5、部分Node节点只想给某个用户或者某个集群单独使用,不希望其他集群的服务调度

调度的整体方案:

1. 设置nodetype=tensorflow,tensorflow集群只会调度在nodetype=tensorflow的节点

2. 设置cputype,gputype,ps/client/tfboard调度的时候选择cputype,worker调度的时候则根据具体的选择,可以选择cpu或者gpu,gpu可以选择具体型号的gpu

3. 设置pooltype(shared/unshared),节点是否是共享,如果是共享则所有集群的服务都可以调度到节点

4. 设置privatename,该标签只在unshared的情况下使用,如果是独占,则设置privatename=username或者taskname

[root@k8s-node1 example]# kubectl get node --label-columns=nodetype,cputype,gputype,pooltype
NAME        STATUS   ROLES         AGE   VERSION   NODETYPE     CPUTYPE                 GPUTYPE                      POOLTYPE
k8s-node1   Ready    master,node   9d    v1.13.4   tensorflow   intel-xeon-e5-2620-v4   nvidia-geforce-gtx-1080-ti   shared
k8s-node2   Ready    node          9d    v1.13.4   tensorflow   intel-xeon-e5-2620-v4   nvidia-geforce-gtx-1080-ti   shared

存在的问题

1. tensorflow的cpu和gpu镜像不同,但是只有worker需要gpu,因此无法使用同一个镜像,如果是gpu训练的话,则只有worker使用gpu镜像,其他服务还是使用cpu镜像

2. 分布式模式下,各个gprc server启动时会根据cluster_spec信息尝试连接其他的server,这个是有一个超时时间的,对于k8s中的statefulset资源在创建Pod的时候是按顺序启动的,也就是只有tf-dis-task-ps-0创建成功后再去创建tf-dis-task-ps-1/2/...,这个就会有个问题就是在ps/worker比较多的情况下(我们一个项目中有个集群有12个ps,20个worker),task-ps-0最开始创建后开始尝试连接其他server,但是需要很长时间task-ps-11才会创建,在task-ps-11创建成功之前,task-ps-0已经连接超时导致启动失败,该项目中解决方式是整体修改集群创建的方案,每个ps/worker都创建一个rc及一个service,也就是2个ps和3个worker的集群会创建5个副本数为1的rc,名称分别为task-ps-0,task-ps-1,task-worker-0,task-worker-1,task-worker-2,及5个对应同名称的svc,传入到容器中的CLUSTER_SPEC环境变量也直接是svc的名称,这样所有的ps/worker都可以并发创建,并且pod的重新调度也不会导致grpc url的改变

源码参考:https://github.com/Aaron-DH/tensorflow_on_k8s

k8s在centos上分布式部署 kubernetes,kubeadm部署 阅读详情

相关推荐

TensorFlow 模型部署到 Kubernetes Python 指南

当你用 TensorFlow 训练出一个准确率 99% 的图像分类模型后,如何让它真正“服务用户”?如何将模型转化为可对外提供推理服务的“程序”?如何让这个程序在高并发、易扩展、自动容错的环境中运行?本文将聚焦这两个问题,覆盖从模型导出到 Kubernetes 集群部署的全流程,不涉及模型训练细节(假设你已有训练好的模型)。用“奶茶店”比喻解释核心概念TensorFlow 模型导出的 Python 代码示例Docker 镜像构建的完整流程Kubernetes 部署 YAML 配置详解。

AI Python 编程之道的博客 803

Kubernetes部署tensorflow模型

在模型构建、训练、调整、测试后我们对自己的模型部署成服务时候,我们需要稳定访问避免死锁, 本文是使用kubernetes部署tensorflow服务的一个流程 TensorFlow on Kubernetes 如我们上面所介绍的,在单机环境下是无法训练大型的神经网络的。在谷歌的内部,Google Brain以及TensorFlow都跑在谷歌内部的集群管理系统Borg上。我在谷歌电商时,我们使用的商...

yunxinan的专栏 1161

Rust 编译工具链配置指南:从 link.exe 缺失到完美解决

本文详细解析了Windows下Rust编译时常见的'link.exe not found'错误,提供了MSVC和MinGW-w64两种工具链的完整配置指南。从Visual Studio组件安装到环境变量设置,再到疑难排查技巧,帮助开发者彻底解决Rust编译工具链配置问题,提升开发效率。

earth的博客 318

TensorFlow的分布式训练和K8S

原文地址:炼丹师的工程修养之四: TensorFlow的分布式训练和K8S - 知乎 1、分布式训练的基本原理 无论是TensorFlow还是其他的几种机器学习框架,分布式训练的基本原理是相同的。大致可以从以下五个不同的角度来分类。 并行模式 架构模式 同步范式 物理架构 通信技术 1.1 并行模式 通俗的讲,分布式计算就是通过分布式的多台机器,把原来的巨大的,复杂的问题拆成多个小的、简单的问题来解决。对于机器学习的训练任务,原来的“大”问题主要表现在两个方面。一是模型太大,我们需要把模..

chenxy02的博客 2630

Abaqus SIGTERM/SIGINT中断问题深度解析与实战解决方案

本文深度解析Abaqus仿真计算中因SIGTERM或SIGINT信号导致作业意外终止的常见问题。核心原因常为许可证管理器因网络通信延迟误判进程空闲而强制断开,或系统资源监控工具的误杀。文章提供了从命令行参数调优(如使用int、ask_delete=OFF)、计算环境隔离到编写自动化容错脚本的完整实战解决方案,帮助用户彻底规避此类中断,确保长时间仿真任务的稳定运行。

weixin_29279101的博客 409

开源onlyoffice编译完整过坑版

onlyoffice 编译过坑完整版;

sHImart 4551

10分钟部署TensorFlow集群:gh_mirrors/ec/ecosystem Kubernetes实践指南

gh_mirrors/ec/ecosystem是一个专注于TensorFlow与其他开源框架集成的项目,通过它可以轻松在Kubernetes环境中部署分布式TensorFlow集群,实现高效的模型训练与服务扩展。 ## 📋 准备工作:部署前的必要条件 在开始部署TensorFlow集群前,请确保你的环境满足以下要求: - **Kubernetes版本**:1.3及以上,且已启用DNS插件(可

gitblog_00492的博客 950

Python异步协程爬虫优化:解决aiohttp中ServerDisconnectedError的高效策略

本文深入探讨了在Python异步协程爬虫中使用aiohttp时,如何高效解决常见的ServerDisconnectedError问题。核心策略包括全局复用ClientSession、精细配置TCPConnector连接池、实施请求重试与速率限制,从而构建稳定、高效的异步爬虫架构,有效避免服务器断开连接错误。

pz890123的博客 857

如何将TensorFlow镜像部署到Kubernetes集群

将TensorFlow模型通过SavedModel格式封装,构建Docker镜像并部署至Kubernetes集群,实现高可用、弹性伸缩的生产级AI服务。详解健康探针、资源限制、服务发现与监控告警等关键配置,覆盖从模型上线到运维全链路的最佳实践。

weixin_28809949的博客 708

5G Multicast/Broadcast Services(MBS) (七) MBS广播DRX

当处于RRC_IDLE或RRC_INACTIVE或RRC_CONNECTED 状态时,如果为 G-RNTI 配置了broadcast DRX,则允许MAC entity使用broadcast DRX 操作不连续地监听此G-RNTI的PDCCH;此 G-RNTI 的 drx-onDurationTimerPTM 或 drx-InactivityTimerPTM 正在运行的时间,也就是。long DRX周期drx-LongCycle-PTM和drx-StartOffset-PTM定义DRX周期开始的子帧。

asd199086的博客 391

突破边缘AI算力瓶颈:YOLOv12模型剪枝与知识蒸馏联合优化全攻略

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

m0_71589036的博客 219

如何在Kubernetes中部署TensorFlow训练集群?

通过Kubernetes构建高效、可复现的TensorFlow分布式训练环境,解决AI研发中的资源调度与环境一致性难题。利用容器化实现GPU资源隔离、多节点协同训练,并结合持久化存储、网络优化与监控体系,支撑生产级MLOps流程落地。

weixin_35756130的博客 644

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1658

在阿里云上轻松部署Kubernetes GPU集群,遇见TensorFlow

摘要: Kubernetes在版本1.6后正式加入了Nvidia GPU的调度功能,支持在Kubernetes上运行运行和管理基于GPU的应用。而在2017年9月12日,阿里云发布了新的异构计算类型GN5,基于P100 nvidia GPU, 提供灵活强悍的异构计算模型,从基础设施到部署环境全面升级,可有效提升矩阵运算、视频识别、机器学习、搜索排序等处理计算效率。当Kubernetes和GPU

dicyt的博客 1516

17、激光切割焦点位置和入射角对切割质量的影响研究

本研究通过响应面方法(RSM)结合Box-Behnken设计,系统分析了激光功率、切割速度和气体压力对SS 304不锈钢激光切割质量的影响,重点探讨了三种不同喷嘴在不同聚焦条件下的切缝比和条纹深度变化规律。实验结果表明,激光功率、切割速度和气体压力对切割质量具有显著影响,且不同喷嘴因焦点位置差异表现出不同的响应趋势。通过回归建模与优化,确定了最小激光功率、适中切割速度和最大气体压力为最优参数组合,可实现最小切缝比和较优条纹深度。研究为实际激光切割工艺提供了科学的参数选择依据和操作流程建议,有效提升了切割精度

mm9012的博客 124

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Kubernetes和TensorFlow集群搭建

原创 未名小宇宙 2018-01-20 22:48:35 @引用自今日头条莫问出处 莫问归途本文演示在Kubernetes集群上搭建TensorFlow集群。集群如下:(请不要问node1哪去了,因为TA罢工了)一、安装Docker安装:yum install docker启动:systemctl enable dockersystemctl start docker验证:二、安装ET...

diyujun6099的博客 470

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Simple TensorFlow Serving Kubernetes部署:企业级模型服务的集群管理终极指南 [特殊字符]

Simple TensorFlow Serving是一个通用且易于使用的机器学习模型服务框架,为企业级AI应用提供了高效的部署解决方案。本文将详细介绍如何在Kubernetes集群中部署Simple TensorFlow Serving,实现生产级机器学习模型服务的弹性扩展和高可用性管理。 ## 为什么选择Simple TensorFlow Serving? 🤔 Simple TensorF

gitblog_00402的博客 778

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

tf_efficientnetv2_m.in21k 架构深度拆解:EfficientNetV2 复合缩放策略与 80.8M 参数设计原理

`tf_efficientnetv2_m.in21k` 是 [timm](https://link.gitcode.com/i/1c9de8c530886ce98a88333a7d325cf3) 库中的一款 **EfficientNetV2 图像分类预训练模型**,由论文作者用 TensorFlow 在 ImageNet-21k 上训练、再移植为 PyTorch 权重。它以 **80.8M 参数量

gitblog_00550的博客 859

保姆级教程:在K8s集群中为TensorFlow/PyTorch部署RDMA高性能网络(含Mellanox驱动安装避坑)

本文提供了一份详细的K8s集群中为TensorFlow/PyTorch部署RDMA高性能网络的保姆级教程,涵盖Mellanox驱动安装避坑、系统参数调优及Kubernetes集成方案。通过RDMA技术显著提升AI训练效率,适用于分布式深度学习场景,帮助开发者构建超低延迟、高吞吐量的网络环境。

weixin_30394669的博客 343

TensorFlow-v2.15云原生部署:Docker+K8s整合实战教程

本文介绍了在星图GPU平台上自动化部署TensorFlow-v2.15镜像的云原生实践。该平台简化了从Docker容器化到Kubernetes集群编排的完整流程,使开发者能够快速构建高可用、可扩展的AI模型服务,典型应用于在线图片分类或商品推荐等实时推理场景。

weixin_36173034的博客 324

K8S调用GPU资源配置指南

 该文档用于描述使用Kubernetes调用GPU资源的配置过程。文档会较为详细的描述在配置过程中遇到的问题和解决方式,并且会详细描述每个步骤的验证结果,该文档对于Kubernetes的使用以及GPU资源的理解有一定的辅助意义。在行文时主要描述了TensorFlow框架调用GPU、也有Pytorch调用GPU支持的过程,文档适用于运维人员、开发人员。 配置过程的主要目标是实现通过yaml文件实现对于底层GPU资源的调度。为达到此目的,需要实现如下的目标: Docker 使用容器创建虚拟环境,以便将 Tens

不当初 1万+

30分钟上手Horovod容器化:从单机到K8s的分布式训练部署指南

你还在为分布式训练环境配置烦恼吗?CUDA版本冲突、MPI通信故障、多节点网络配置等问题是否消耗了你大量时间?本文将通过Docker和Kubernetes容器化方案,帮助你在30分钟内搭建稳定的Horovod分布式训练环境,覆盖单机、多节点及K8s集群部署场景。读完本文你将掌握: - 3种官方Docker镜像的选型与定制方法 - 单机/多节点容器部署的关键配置 - Kubernetes环境下的He...

gitblog_00549的博客 1210

TensorFlow-v2.15云原生部署实战:Docker+K8s手把手教程,5步搞定模型上线

本文介绍了如何在星图GPU平台上自动化部署TensorFlow-v2.15镜像,快速构建云原生AI服务。通过Docker容器化与Kubernetes编排,该方案能将训练好的模型(如图像分类模型)打包为标准化服务,实现高可用、弹性伸缩的在线推理,极大简化了从开发到生产的部署流程。

weixin_42551310的博客 196

tensorflow与kubernetes/docker结合使用实践

tensorflow与kubernetes/docker结合使用实践 tensorflow tensorflow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从图象的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至

limx59的专栏 2852
上一篇: Kubernetes-Pod资源调度
下一篇: Kubernetes-基于Flannel的网络原理
Aaron.com
博客等级 码龄17年 25粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值