网站首页 文章专栏 02pod.md
02pod.md
创建于:2021-07-04 07:51:04 更新于:2025-05-23 17:47:37 羽瀚尘 564

pod是k8s的最小调度资源。一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。

最简配置

apiVersion: v1
kind: Pod
metadata:
  name: tensorflow-simple
spec:
  containers:
  - name: tensorflow-simple
    image: tensorflow1_18:v2

使用Volume

Volume可以为容器提供持久化存储,比如

apiVersion: v1
kind: Pod
metadata:
  name: tensorflow-simple
spec:
  containers:
  - name: tensorflow-simple
    image: tensorflow1_18:v2
    volumeMounts:
    - name: tensorflow-storage
      mountPath: /data/tensorflow
  volumes:
  - name: tensorflow-storage
    emptyDir: {}

声明端口

apiVersion: v1
kind: Pod
metadata:
  name: tensorflow-simple
spec:
  containers:
  - name: tensorflow-simple
    image: tensorflow1_18:v2
    ports:
    - containerPort: 6081

环境变量

环境变量为容器提供了一些重要的资源,包括容器和Pod的基本信息以及集群中服务的信息等:

Pod的名字、命名空间、IP以及容器的计算资源限制等可以以Downward API的方式获取并存储到环境变量中。

apiVersion: v1
kind: Pod
metadata:
  name: tensorflow-simple
spec:
  containers:
  - name: tensorflow-simple
    image: tensorflow1_18:v2
    ports:
    - containerPort: 6081
    env:
      - name: MY_CPU_REQUEST
        valueFrom:
          resourceFieldRef:
            resource: requests.cpu
      - name: MY_TEST_VALUE
        value: "MY_VALUE"

command

command、args两项实现覆盖Dockerfile中ENTRYPOINT的功能,具体的command命令代替ENTRYPOINT的命令行,args代表集体的参数。

  • 如果command和args均没有写,那么用Dockerfile的配置。
    • 如果command写了,但args没有写,那么Dockerfile默认的配置会被忽略,执行输入的command(不带任何参数,当然command中可自带参数)。
    • 如果command没写,但args写了,那么Dockerfile中配置的ENTRYPOINT的命令行会被执行,并且将args中填写的参数追加到ENTRYPOINT中。
    • 如果command和args都写了,那么Dockerfile的配置被忽略,执行command并追加上args参数。比如: command:/test.sh,p1,p2 args: p3,p4

另:多命令执行使用sh,-c,[command;command,…]的形式,单条命令的参数填写在具体的command里面,例如: command:[sh,-c,echo ‘123’;/test.sh,p1,p2,p3,p4] args: 不填

ImagePullPolicy

apiVersion: v1
kind: Pod
metadata:
  name: tensorflow-simple
spec:
  containers:
  - name: tensorflow-simple
    image: tensorflow1_18:v2
    imagePullPolicy: IfNotPresent

支持三种ImagePullPolicy

  • Always:不管镜像是否存在都会进行一次拉取。
  • Never:不管镜像是否存在都不会进行拉取
  • IfNotPresent:只有镜像不存在时,才会进行镜像拉取。

注意: 默认为IfNotPresent,但:latest标签的镜像默认为Always。 拉取镜像时docker会进行校验,如果镜像中的MD5码没有变,则不会拉取镜像数据。 生产环境中应该尽量避免使用:latest标签,而开发环境中可以借助:latest标签自动拉取最新的镜像。

资源限制

Kubernetes通过cgroups限制容器的CPU和内存等计算资源,包括requests(请求,调度器保证调度到资源充足的Node上)和limits(上限)等:

  • spec.containers[].resources.limits.cpu:CPU上限,可以短暂超过,容器也不会被停止 可以是300m这样的百分比格式,也可以是1这样的核心数格式
  • spec.containers[].resources.limits.memory:内存上限,不可以超过;如果超过,容器可能会被停止或调度到其他资源充足的机器上
  • spec.containers[].resources.requests.cpu:CPU请求,可以超过
  • spec.containers[].resources.requests.memory:内存请求,可以超过;但如果超过,容器可能会在Node内存不足时清理

比如nginx容器请求30%的CPU和56MB的内存,但限制最多只用50%的CPU和128MB的内存:

apiVersion: v1
kind: Pod
metadata:
  name: tensorflow-simple
spec:
  containers:
  - name: tensorflow-simple
    image: tensorflow1_18:v2
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: "300m"
        memory: "128Mi"
      limits:
        cpu: "1" # 限定1个cpu核心
        memory: "512Mi"

注意,CPU的单位是milicpu,500mcpu=0.5cpu;而内存的单位则包括E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki等。

参考: