
# Pod
#### 什么是Pod
Pod是Kubernetes创建或部署的最小单位。一个Pod封装一个或多个容器（container）、存储资源（volume）、一个独立的网络IP以及管理控制容器运行方式的策略选项。
Pod使用主要分为两种方式：
- Pod中运行一个容器。这是Kubernetes最常见的用法，您可以将Pod视为单个封装的容器，但是Kubernetes是直接管理Pod而不是容器。
- Pod中运行多个需要耦合在一起工作、需要共享资源的容器。通常这种场景下是应用包含一个主容器和几个辅助容器（SideCar Container），如[图1]所示，例如主容器为一个web服务器，从一个固定目录下对外提供文件服务，而辅助的容器周期性的从外部下载文件存到这个固定目录下。
  图1Pod   
  ![](https://support.huaweicloud.com/devg-cci/zh-cn_image_0198421040.png) 
实际使用中很少直接创建Pod，而是使用Kubernetes中称为Controller的抽象层来管理Pod实例，例如Deployment和Job。Controller可以创建和管理多个Pod，提供副本管理、滚动升级和自愈能力。通常，Controller会使用Pod Template来创建相应的Pod。
#### 容器的规格
云容器实例支持使用GPU（必须在GPU类型[命名空间](https://support.huaweicloud.com/devg-cci/cci_05_0023.html)下）或不使用GPU。
具体的规格信息请参考[约束与限制](https://support.huaweicloud.com/productdesc-cci/cci_03_0007.html)中的"Pod规格"。
#### 创建Pod
kubernetes资源可以使用YAML描述（如果您对YAML格式不了解，可以参考[YAML语法](https://support.huaweicloud.com/devg-cci/cci_05_1001.html)），也可以使用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                   # 0.5核
        memory: 1024Mi
      requests:
        cpu: 500m                   # 0.5核
        memory: 1024Mi
  imagePullSecrets:                 # 拉取镜像使用的证书，必须为imagepull-secret
  - name: imagepull-secret
```
如上面YAML的注释，YAML描述文件主要为如下部分：
- **metadata**：一些名称/标签/namespace等信息
- **spec**：Pod实际的配置信息，包括使用什么镜像，volume等
如果去查询Kubernetes的资源，您会看到还有一个**status**字段，status描述kubernetes资源的实际状态，创建时不需要配置。这个示例是一个最小集，其他参数定义后面会逐步介绍。
Pod定义好后就可以使用kubectl创建，如果上面YAML文件名称为nginx.yaml，则创建命令如下所示，-f 表示使用文件方式创建。
```
$ kubectl create -f nginx.yaml -n $namespace_name
pod/nginx created
```
![](https://support.huaweicloud.com/devg-cci/public_sys-resources/note_3.0-zh-cn.png)
容器运行的操作系统内核版本由4.18版本升级至5.10版本。
#### 使用GPU
云容器实例支持使用GPU（必须在GPU类型[命名空间](https://support.huaweicloud.com/devg-cci/cci_05_0023.html)下），申请GPU资源的方法非常简单，只需要在容器定制中申请GPU字段即可。
您需要设置Pod的metadata.annotations中添加cri.cci.io/gpu-driver字段，指定使用哪个版本显卡驱动，取值如下：
- gpu-460.106
- gpu-418.126
如下示例创建一个容器规格为NVIDIA V100 16G x 1，CPU 4核，内存32GiB的Pod。
```
apiVersion: v1
kind: Pod
metadata:
  name: gpu-test
  annotations:
    cri.cci.io/gpu-driver: gpu-418.126           # 指定GPU显卡的驱动版本
spec:
  containers:
  - image: tensorflow:latest
    name: container-0
    resources:
      limits:
        cpu: 4000m                   # 4核
        memory: 32Gi
        nvidia.com/gpu-tesla-v100-16GB: 1         # 申请GPU资源，支持 1、2、4、8，代表几块显卡
      requests:
        cpu: 4000m                   # 4核
        memory: 32Gi
        nvidia.com/gpu-tesla-v100-16GB: 1
  imagePullSecrets:
  - name: imagepull-secret
```
GPU加速型Pod提供了两种规格的显卡，其含义如下：
- nvidia.com/gpu-tesla-v100-16GB：表示NVIDIA Tesla V100 16G显卡。
- nvidia.com/gpu-tesla-v100-32GB：表示NVIDIA Tesla V100 32G显卡。
- nvidia.com/gpu-tesla-t4：表示NVIDIA Tesla T4显卡。
#### 容器镜像
容器镜像是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的配置参数（如匿名卷、环境变量、用户等）。镜像不包含任何动态数据，其内容在构建之后也不会被改变。
[容器镜像服务](https://www.huaweicloud.com/product/swr.html)从镜像中心同步了部分常用镜像，使得您可以在内部网络中直接使用"镜像名称:版本号"，如上述示例中的nginx:alpine，您可以在容器镜像服务控制台中查询同步了哪些镜像。
#### 查询Pod详情
Pod创建完成后，可以使用kubectl get pods命令查询Pod的状态，如下所示。
```
$ kubectl get pods -n $namespace_name
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 -n $namespace_name
```
您还可以使用kubectl describe命令查看Pod的详情。
```
$ kubectl describe pod nginx -n $namespace_name
```
#### 删除Pod
删除pod时，Kubernetes终止Pod中所有容器。 Kubernetes向进程发送SIGTERM信号并等待一定的秒数（默认为30）让容器正常关闭。 如果它没有在这个时间内关闭，Kubernetes会发送一个SIGKILL信号杀死该进程。
Pod的停止与删除有多种方法，比如按名称删除，如下所示。
```
$ kubectl delete po nginx -n $namespace_name
pod "nginx" deleted
```
同时删除多个Pod。
```
$ kubectl delete po pod1 pod2 -n $namespace_name
```
删除所有Pod。
```
$ kubectl delete po --all -n $namespace_name
pod "nginx" deleted
```
根据Label删除Pod，[Label](https://support.huaweicloud.com/devg-cci/cci_05_0025.html)详细内容将会在下一个章节介绍。
```
$ kubectl delete po -l app=nginx -n $namespace_name
pod "nginx" deleted
```
