pod:kubernetes中的最小调度对象-九游平台
容器组(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。
创建pod
kubernetes中资源可以使用yaml描述(如果您对yaml格式不了解,可以参考),也可以使用json,如下示例描述了一个名为nginx的pod,这个pod中包含一个名为container-0的容器,使用nginx:alpine镜像,使用的资源为100m cpu、200mi内存。
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: cpu: 100m memory: 200mi requests: cpu: 100m memory: 200mi imagepullsecrets: # 拉取镜像使用的证书,在cce上必须为default-secret - name: default-secret
如上面yaml的注释,yaml描述文件主要为如下部分:
- metadata:一些名称/标签/namespace等信息。
- spec:pod实际的配置信息,包括使用什么镜像,volume等。
如果去查询kubernetes的资源,您会看到还有一个status字段,status描述kubernetes资源的实际状态,创建时不需要配置。这个示例是一个最小集,其他参数定义后面会逐步介绍。
pod定义好后就可以使用kubectl创建,如果上面yaml文件名称为nginx.yaml,则创建命令如下所示,-f表示使用文件方式创建。
$ kubectl create -f nginx.yaml pod/nginx created
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时,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,详细内容将会在下一个章节介绍。
$ kubectl delete po -l app=nginx pod "nginx" deleted
使用环境变量
环境变量是容器运行环境中设定的一个变量。
环境变量为应用提供极大的灵活性,您可以在应用程序中使用环境变量,在创建容器时为环境变量赋值,容器运行时读取环境变量的值,从而做到灵活的配置,而不是每次都重新编写应用程序制作镜像。
环境变量的使用方法如下所示,配置spec.containers.env字段即可。
apiversion: v1 kind: pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 resources: limits: cpu: 100m memory: 200mi requests: cpu: 100m memory: 200mi env: # 环境变量 - name: env_key value: env_value imagepullsecrets: - name: default-secret
执行如下命令查看容器中的环境变量,可以看到env_key这个环境变量,其值为env_value。
$ kubectl exec -it nginx -- env
path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
hostname=nginx
term=xterm
env_key=env_value
环境变量还可以引用configmap和secret,具体使用方法请参见在环境变量中引用configmap和在环境变量中引用secret。
容器启动命令
启动容器就是启动主进程,但有些时候,启动主进程前,需要一些准备工作。比如mysql类的数据库,可能需要一些数据库配置、初始化的工作,这些工作要在最终的mysql服务器运行之前做完。这些操作,可以在制作镜像时通过在dockerfile文件中设置entrypoint或cmd来完成,如下所示的dockerfile中设置了entrypoint ["top", "-b"]命令,其将会在容器启动时执行。
from ubuntu entrypoint ["top", "-b"]
实际使用时,只需配置pod的containers.command参数,该参数是list类型,第一个参数为执行命令,后面均为命令的参数。
apiversion: v1 kind: pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 resources: limits: cpu: 100m memory: 200mi requests: cpu: 100m memory: 200mi command: # 启动命令 - top - "-b" imagepullsecrets: - name: default-secret
容器的生命周期
kubernetes提供了,在容器的生命周期的特定阶段执行调用,比如容器在停止前希望执行某项操作,就可以注册相应的钩子函数。目前提供的生命周期钩子函数如下所示。
- 启动后处理(poststart):容器启动后触发。
- 停止前处理(prestop):容器停止前触发。
实际使用时,只需配置pod的lifecycle.poststart或lifecycle.prestop参数,如下所示。
apiversion: v1 kind: pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 resources: limits: cpu: 100m memory: 200mi requests: cpu: 100m memory: 200mi lifecycle: poststart: # 启动后处理 exec: command: - "/poststart.sh" prestop: # 停止前处理 exec: command: - "/prestop.sh" imagepullsecrets: - name: default-secret
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨