文档首页 > > 开发指南> Pod> Pod

Pod

分享
更新时间: 2019/10/18 GMT+08:00

什么是Pod

Pod是Kubernetes创建或部署的最小单位。一个Pod封装一个或多个容器(container)、存储资源(volume)、一个独立的网络IP以及管理控制容器运行方式的策略选项。

Pod使用主要分为两种方式:

  • Pod中运行一个容器。这是Kubernetes最常见的用法,您可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。
  • Pod中运行多个需要耦合在一起工作、需要共享资源的容器。通常这种场景下是应用包含一个主容器和几个辅助容器(SideCar Container),如图1所示,例如主容器为一个web服务器,从一个固定目录下对外提供文件服务,而辅助的容器周期性的从外部下载文件存到这个固定目录下。
    图1 Pod

实际使用中很少直接创建Pod,而是使用Kubernetes中称为Controller的抽象层来管理Pod实例,例如Deployment和Job。Controller可以创建和管理多个Pod,提供副本管理、滚动升级和自愈能力。通常,Controller会使用Pod Template来创建相应的Pod。

容器的规格

云容器实例支持使用GPU(必须在GPU类型命名空间下)或不使用GPU。

当前提供3种类型的Pod,包括通用计算型(通用计算型命名空间下使用)、RDMA加速型和GPU加速性(GPU型命名空间下使用)。

GPU加速型Pod提供NVIDIA Tesla V100 32G显卡、NVIDIA Tesla V100 16G显卡以及NVIDIA Tesla P4 8G显卡,具体的规格有如下所示。
  • NVIDIA Tesla V100 32G显卡:
    • NVIDIA Tesla V100 32G x 1,CPU 4核,内存32GB
    • NVIDIA Tesla V100 32G x 2,CPU 8核,内存64GB
    • NVIDIA Tesla V100 32G x 4,CPU 16核,内存128GB
    • NVIDIA Tesla V100 32G x 8,CPU 32核,内存256GB
  • NVIDIA Tesla V100 16G显卡:
    • NVIDIA Tesla V100 16G x 1,CPU 4核,内存32GB
    • NVIDIA Tesla V100 16G x 2,CPU 8核,内存64GB
    • NVIDIA Tesla V100 16G x 4,CPU 16核,内存128GB
    • NVIDIA Tesla V100 16G x 8,CPU 32核,内存256GB
  • NVIDIA Tesla P4 8G显卡:
    • NVIDIA Tesla P4 8G x 1,CPU 4核,内存32GB
    • NVIDIA Tesla P4 8G x 2,CPU 8核,内存64GB
    • NVIDIA Tesla P4 8G x 3,CPU 16核,内存128GB
    • NVIDIA Tesla P4 8G x 4,CPU 32核,内存256GB
当不使用GPU时,容器规格需满足如下要求:
  • Pod的CPU取值范围为0.25核-32核,另外还可选48核和64核,且单个容器的CPU必须为0.25核的整数倍
  • Pod的内存取值范围为1GB-512GB,且内存必须为1GB的整数倍
  • Pod的CPU/内存配比值必须在1:2到1:8之间
  • 一个Pod内最多支持5个容器,单个容器最小配置是0.25核、0.2GB,最大同容器实例的最大配置

创建Pod

kubernetes种资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON,如下示例描述了一个名为nginx的Pod,这个Pod中包含一个名为container-0的容器,使用nginx:alpine镜像,使用的资源为0.5核CPU、1024M内存。

apiVersion: v1                      # Kubernetes的API Version
kind: Pod                           # Kubernetes的资源类型
metadata:
  name: nginx                       # Pod的名称
spec:                               # Pod的具体规格(specification)
  containers:
  - image: nginx:alpine             # 使用的镜像为 nginx:alpine
    name: container-0               # 容器的名称
    resources:                      # 申请容器所需的资源,云容器实例中limits与requests的值必须相同
      limits:
        cpu: 500m
        memory: 1024Mi
      requests:
        cpu: 500m
        memory: 1024Mi
  imagePullSecrets:                 # 拉取镜像使用的证书,必须为imagepull-secret
  - name: imagepull-secret

如上面YAML的注释,YAML描述文件主要为如下部分:

  • metadata:一些名称/标签/namespace等信息
  • spec:Pod实际的配置信息,包括使用什么镜像,volume等

如果去查询Kubernetes的资源,您会看到还有一个status字段,status描述kubernetes资源的实际状态,创建时不需要配置。这个示例是一个最小集,其他参数定义后面会逐步介绍。

kubernetes资源的参数定义的解释,您可以通过具体资源的API参考查询对应的解释。

Pod定义好后就可以使用kubectl创建,如果上面YAML文件名称为nginx.yaml,则创建命令如下所示,-f 表示使用文件方式创建。

$ kubectl create -f nginx.yaml
pod/nginx created

使用GPU

云容器实例支持使用GPU(必须在GPU类型命名空间下),申请GPU资源的方法非常简单,只需要在容器定制中申请GPU字段即可。

GPU加速型Pod提供NVIDIA Tesla V100 32G显卡、NVIDIA Tesla V100 16G显卡以及NVIDIA Tesla P4 8G显卡,具体的规格有如下所示。
  • NVIDIA Tesla V100 32G显卡:
    • NVIDIA Tesla V100 32G x 1,CPU 4核,内存32GB
    • NVIDIA Tesla V100 32G x 2,CPU 8核,内存64GB
    • NVIDIA Tesla V100 32G x 4,CPU 16核,内存128GB
    • NVIDIA Tesla V100 32G x 8,CPU 32核,内存256GB
  • NVIDIA Tesla V100 16G显卡:
    • NVIDIA Tesla V100 16G x 1,CPU 4核,内存32GB
    • NVIDIA Tesla V100 16G x 2,CPU 8核,内存64GB
    • NVIDIA Tesla V100 16G x 4,CPU 16核,内存128GB
    • NVIDIA Tesla V100 16G x 8,CPU 32核,内存256GB
  • NVIDIA Tesla P4 8G显卡:
    • NVIDIA Tesla P4 8G x 1,CPU 4核,内存32GB
    • NVIDIA Tesla P4 8G x 2,CPU 8核,内存64GB
    • NVIDIA Tesla P4 8G x 3,CPU 16核,内存128GB
    • NVIDIA Tesla P4 8G x 4,CPU 32核,内存256GB
当前支持使用Nvidia GPU的驱动版本为 396.26410.104,您应用程序中使用的CUDA需满足如 表1所示的配套关系。CUDA与驱动的配套关系来源于Nvidia官网,详细信息请参见 CUDA Compatibility
表1 Nvidia GPU驱动与CUDA配套关系

Nvidia GPU驱动版本

CUDA Toolkit版本

396.26

CUDA 9.2 (9.2.88)及以下

410.104

CUDA 10.0 (10.0.130)及以下

您需要设置Pod的metadata.annotations中添加cri.cci.io/gpu-driver字段,指定使用哪个版本显卡驱动,取值如下:

  • gpu-410.104
  • gpu-396.26

如下示例创建一个容器规格为NVIDIA V100 16G x 1,CPU 4核,内存32GB的Pod。

apiVersion: v1
kind: Pod
metadata:
  name: gpu-test
  annotations:
    cri.cci.io/gpu-driver: gpu-410.104           # 指定GPU显卡的驱动版本
spec:
  containers:
  - image: tensorflow:latest
    name: container-0
    resources:
      limits:
        cpu: 4000m
        memory: 32Gi
        nvidia.com/gpu-tesla-v100-16GB: 1         # 申请GPU资源,支持 1、2、4、8,代表几块显卡
      requests:
        cpu: 4000m
        memory: 32Gi
        nvidia.com/gpu-tesla-v100-16GB: 1
  imagePullSecrets:
  - name: imagepull-secret

Docker镜像

上面的例子中,使用的镜像为nginx:alpine和tensorflow:latest,这表示直接使用Dockerhub中公共镜像,华为云容器镜像服务从Dockerhub同步了部分常用镜像,使得您可以在内部网络中直接使用,您可以在容器镜像服务控制台中查询同步了哪些镜像;对于没有同步的Dockerhub镜像,容器需要访问外部网络,从而下载Dockerhub的镜像,这种情况下,您需要做一些网络配置,具体请参见从容器访问公网

除了使用Dockerhub中的镜像,更为常用的一种方式是将您的镜像上传到华为云容器镜像服务

查询Pod详情

Pod创建完成后,可以使用kubectl get pods命令查询Pod的状态,如下所示。

$ kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
nginx          1/1     Running   0          40s

可以看到此处nginx这个Pod的状态为Running,表示正在运行;READY为1/1,表示这个Pod中有1个容器,其中1个容器的状态为Ready。

可以使用kubectl get命令查询具体Pod的配置信息,如下所示,-o yaml表示以YAML格式返回,还可以使用 -o json,以JSON格式返回。

$ kubectl get pod nginx -o yaml

您还可以使用kubectl describe命令查看Pod的详情。

$ kubectl describe pod nginx

删除Pod

删除pod时,Kubernetes终止Pod中所有容器。 Kubernetes向进程发送SIGTERM信号并等待一定的秒数(默认为30)让容器正常关闭。 如果它没有在这个时间内关闭,Kubernetes会发送一个SIGKILL信号杀死该进程。

Pod的停止与删除有多种方法,比如按名称删除,如下所示。

$ kubectl delete po nginx
pod "nginx" deleted

同时删除多个Pod。

$ kubectl delete po pod1 pod2

删除所有Pod。

$ kubectl delete po --all
pod "nginx" deleted

根据Label删除Pod,Label详细内容将会在下一个章节介绍。

$ kubectl delete po -l app=nginx
pod "nginx" deleted
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区