一、Pod概念

Pod是k8s的最小单位,里面包含一组容器,其中一个为Pause容器,也称为“根容器”。

Pod里面的多个业务容器共享Pause容器的网络和Volume卷。

Pod是短暂的。

每个Pod都有一个唯一的IP地址,称之为Pod IP。在K8S集群中,一个Pod里的容器与另外主机上的Pod容器能够直接通信

二、定义一个Pod

2.1. YAML文件tomcat.yaml

apiVersion: v1
kind: Pod
metadata:
  name: tomcat
  labels:
    name: tomcat
  namespace: cka
spec:
  containers:
  - name: tomcat
    image: kubeguide/tomcat-app:v1
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
    - containerPort: 8080
    env:
    - name: MYSQL_SERVICE_HOST
      value: 'mysql'

2.2. 相关解释

apiVersion: v1					#核心API
kind							#指明资源类型,此处为Pod
metadata						#元数据,用于描述当前资源类型。
metadata.name					#Pod的名称为tomcat
metadata.labels.name			#定义该Pod有一个名为name=tomcat的标签
metadata.namespace				#指定该Pod属于哪个命名空间
spec							#定义Pod里面的容器组
spec.containers					#定义容器组
containers.name					#容器的名字为tomcat
containers.image				#容器使用的镜像为kubeguide/tomcat-app:v1
containers.imagePullPolicy		#IfNotPresent表示如果本地存在就不去镜像仓库拉取,不存在则拉取
containers.resources			#定义容器的资源配额
resources.requests				#定义请求的资源,现只支持CPU和内存,此处申请0.25个CPU和64MiB内存,
								#	该值必须小于或者等于limits设置的值
resources.limits				#资源最多申请0.5个CPU和128MiB内存
containers.ports				#定义端口
ports.containerPort				#容器应用监听的端口为8080
containers.env					#往容器注入环境变量,以KV键值对的形式。此处注入了MYSQL_SERVICE_HOST='mysql'的环境变量

kubectl apply -f tomcat.yaml #创建Pod

2.3. 验证

kubectl get pod --show-labels

Pod的名字为tomcat,且有一个name=tomcat的标签
在这里插入图片描述

kubectl describe pod tomcat

容器名为tomcat,使用的镜像为kubeguide/tomcat-app:v1,监听的端口为8080
在这里插入图片描述
资源限额及环境变量
在这里插入图片描述
表示该镜像已经在本地有了
在这里插入图片描述

kubectl exec -it tomcat  bash			#登陆到Pod的第一个容器,由于这里只有一个业务容器,默认就是tomcat容器

环境变量已成功注入
在这里插入图片描述

kubectl get pod -o wide

Pod IP为10.244.1.9
在这里插入图片描述
在集群任意主机通过curl 10.244.1.9:8080可以访问
在这里插入图片描述

三、静态Pod

3.1.概念

  • 静态Pod是由kubelet进行管理的仅存在于特定Node上的Pod。不能通过API Server进行管理,无法与RC、Deployment或者
    DaemonSet进行关联,并且kubelet无法对它们进行健康检查。

  • 静态Pod总是由kubelet创建,并且总在kubelet所在的Node上运行。

  • kubeadm搭建的K8s集群,静态Pod的默认配置目录为/etc/kubernetes/manifests/,kubelet会定期扫描静态Pod的配置目录,根据目录下的yaml启动或者删除Pod。

可以看到以下这些系统组件均是以静态Pod的形式启动的
在这里插入图片描述
静态Pod的配置目录可以通过/var/lib/kubelet/config.yaml设置,修改staticPodPath的值,然后重启Kubelet即可
在这里插入图片描述

3.2.创建一个静态Pod

在/etc/kubernetes/manifests/创建如下yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: static-pod
  labels:
    name: static-pod
spec:
  containers:
  - name: static-pod
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

静态Pod名字后面会带上当前节点的名字
在这里插入图片描述
用kubectl删除该Pod,kubectl delete pod static-pod-k8smaster,发现并不能删除,那该怎么删除呢?

直接删除静态Pod的yaml文件即可

四、Pod阶段

有如下五种阶段:

Pending:API Server已经创建该Pod,但其容器还没有被完全创建。Pod可能正在调度、pull镜像或启动容器。

Running:Pod被调度到某一个Node上,Pod 中所有的容器都已被创建。至少有一个容器处于运行、启动或重启状态。

Succeeded:Pod中所有的容器都以状态0退出并且不会重启,一般是在部署 job 的时候会出现。

Failed:Pod中所有的容器都已经退出,但至少有一个容器退出状态不为0。

Unknown(未知): 因为某些原因无法取得 Pod 的状态。通常是由于apiServer无法与Pod所在工作节点的 kubelet 通信所致。

五、Pod状态

参考文章:Pod 常见状态

5.1.常见状态

Unschedulable

Pod不能被调度,kube-scheduler 没有匹配到合适的 node 节点。

PodScheduled

Pod 正处于调度中,在 kube-scheduler 刚开始调度的时候,还没有将 Pod 分配到指定的 node,在筛选出合适的节点后就会更新 etcd 数据,将 Pod 分配到指定的 node。

Initialized

所有 pod 中的初始化容器已经完成了。

ImagePullBackOff

Pod 所在的 node 节点下载镜像失败。

5.2.其它状态

1)Error
Pod 启动过程中发生错误。

2)NodeLost
Pod 所在节点失联。

3)Unkown
Pod 所在节点失联或其它未知异常。

4)Waiting
Pod 等待启动。

5)Pending
Pod 等待被调度。

6)Terminating
Pod 正在被销毁。

7)CrashLoopBackOff
Pod 异常,但是kubelet正在重启pod。

8)InvalidImageName
node 节点无法解析镜像名称导致的镜像无法下载。

9)ImageInspectError
无法校验镜像,镜像不完整导致。

10)ErrImageNeverPull
策略禁止拉取镜像,镜像中心权限是私有等。

11)ImagePullBackOff
镜像拉取失败,但是正在重新拉取。

12)RegistryUnavailable
镜像服务器不可用,网络原因或 harbor 宕机。

13)ErrImagePull
镜像拉取出错,超时或下载被强制终止

14)CreateContainerConfigError
不能创建kubelet使用的容器配置

15)CreateContainerError
创建容器失败

16)PreStartContainer
执行 preStart hook 报错,Pod hook(钩子)是由 Kubernetes 管理的 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,比如容器创建完成后里面的服务启动之前可以检查一下依赖的其它服务是否启动,或者容器退出之前可以把容器中的服务先通过命令停止。

17)PostStartHookError
执行 postStart hook 报错。

18)RunContainerError
Pod 运行失败,容器中没有初始化PID为1的守护进程等。

19)ContainersNotInitialized
Pod 没有初始化完毕。

20)ContainersNotReady
Pod 没有准备完毕。

21)ContainerCreating
Pod 正在创建中。

22)PodInitializing
Pod 正在初始化中。

23)DockerDaemonNotReady
node 节点 docker 服务没有启动。

24)NetworkPluginNotReady
网络插件还没有完全启动。

六、kubectl get pod各字段说明

在这里插入图片描述
字段说明

NAME:Pod 名
READY:X/Y:Y代表Pod 中容器的个数,而X代表容器的状态,其值有两个:1或0,1表示容器处于running状态,即正常运行中;0表示容器处于非正常运行状态,即容器状态异常会有报错记录产生。
0/1:表示此Pod中存在1个容器且该容器没有处于正常运行状态。
1/2:表示此Pod中存在2个容器且1个容器已经准备就绪,但还有1个容器没有处于非健康状态。
1/1:表示此Pod中存在1个容器且该容器处于正常运行状态。
STATUS:代表 Pod 的状态
RESTARTS:记录 Pod 重启的次数。
AGE:代表 Pod 已创建了多久

参考书籍:《Kubernetes权威指南第4版从Docker到Kubernetes实践全接触》

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐