03_pod详解
03_pod详解
pod是什么
pod是kubernetes创建或部署的最小单位,一个pod封装一个或者多个容器(container),存储资源volume一个独立的网络ip以及管理容器运行方式的策略选项
pod使用的两种方式
- pod中运行一个容器,可视为pod封装单个容器。
- kubernetes是直接管理pod而不是容器,pod是k8s最小的单位
- pod中运行多个耦合在一起工作,需要共享资源的容器,通常情况下一个主容器和几个辅助容器。
- 一个web服务容器,从固定一个目录对外提供文件服务,而辅助容器周期性的从外部下载文件存到这个固定目录下
创建Pod
kubernetes中资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON
https://support.huaweicloud.com/devg-cci/cci_05_1001.html
如下示例描述了一个名为nginx的Pod,这个Pod中包含一个名为container-0的容器,使用nginx:alpine镜像,使用的资源为100m core CPU、200Mi内存。
apiVersion: v1 # Kubernetes的API Version
kind: Pod # Kubernetes的资源类型
metadata:name: nginx # Pod的名称
spec: # Pod的具体规格(specification)containers:- image: nginx:alpine # 使用的镜像为 nginx:alpinename: container-0 # 容器的名称resources: # 申请容器所需的资源limits:cpu: 100mmemory: 200Mirequests:cpu: 100mmemory: 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表示使用文件方式创建。
pod状态查看
可以看到此处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 get pod nginx -o json
pod详情查看
[root@k8s-master-10 ~]#kubectl describe pod nginx常用来查看资源创建事件
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 92s default-scheduler Successfully assigned default/nginx to k8s-node-12Normal Pulled 92s kubelet Container image "nginx:alpine" already present on machineNormal Created 92s kubelet Created container container-0Normal Started 92s kubelet Started container container-0
删除pod时,Kubernetes终止Pod中所有容器。 Kubernetes向进程发送SIGTERM信号并等待一定的秒数(默认为30)让容器正常关闭。
如果它没有在这个时间内关闭,Kubernetes会发送一个SIGKILL信号杀死该进程。
pod停止删除
Pod的停止与删除有多种方法,比如按名称删除,如下所示。
一次性删除多个pod。
[root@k8s-master-10 ~]#kubectl delete pod nginx yuchao-nginx
pod "nginx" deleted
pod "yuchao-nginx" deleted
清理当前namespace下所有的pod,默认就是default
[root@k8s-master-10 ~]#kubectl describe pod dep-nginx-779c7fd666-cvg8v |grep -i ^namespace
Namespace: default# --all参数,危险命令!
[root@k8s-master-10 ~]#kubectl delete pod --all
pod "dep-nginx-779c7fd666-cvg8v" deleted
标签选择器删除pod
kubectl delete pod -l name=www.yuchaoit.cn
容器的启动命令
容器就是启动主进程,但有些时候需要做一些准备工作
比如MySQL类的数据库,可能需要一些数据库配置、初始化的工作,这些工作要在最终的MySQL服务器运行之前做完。
这些操作,可以在制作镜像时通过在Dockerfile文件中设置ENTRYPOINT或CMD来完成,如下所示的Dockerfile中设置了**ENTRYPOINT [“curl”, “yzk.yzkik.xyz”]**命令,其将会在容器启动时执行。
实际使用时,只需配置Pod的containers.command参数,该参数是list类型,第一个参数为执行命令,后面均为命令的参数。
apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: chaoge-linux # 单独开一个ns环境
spec:containers:- image: nginx:alpinename: container-0resources:limits:cpu: 100mmemory: 200Mirequests:cpu: 100mmemory: 200Micommand: # 启动命令- curl- "www.yuchaoit.cn"# imagePullSecrets:# - name: default-secret
创建namespace下的pod
[root@k8s-master-10 ~]#kubectl create ns chaoge-linux
namespace/chaoge-linux created[root@k8s-master-10 ~]#kubectl create -f cmd-pod.yaml
pod/mynginx created
[root@k8s-master-10 ~]#
查看ns下的pod
[root@k8s-master-10 ~]#kubectl get pods -n chaoge-linux
NAME READY STATUS RESTARTS AGE
mynginx 0/1 CrashLoopBackOff 4 2m12s
[root@k8s-master-10 ~]#发现咋挂了?
查看pod事件
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 2m37s default-scheduler Successfully assigned chaoge-linux/mynginx to k8s-node-12Normal Pulled 61s (x5 over 2m37s) kubelet Container image "nginx:alpine" already present on machineNormal Created 61s (x5 over 2m37s) kubelet Created container container-0Normal Started 61s (x5 over 2m36s) kubelet Started container container-0Warning BackOff 60s (x10 over 2m35s) kubelet Back-off restarting failed container[root@k8s-master-10 ~]#kubectl describe pod mynginx -n chaoge-linux
查看pod日志
[root@k8s-master-10 ~]#kubectl -n chaoge-linux logs mynginx |grep
[root@k8s-master-10 ~]## 因为我们修改了容器启动执行命令,并非是启动nginx了,删除该pod即可。[root@k8s-master-10 ~]#kubectl -n chaoge-linux delete pod mynginx
pod "mynginx" deleted