前言
在 Kubernetes中,Pod(容器组是最小的部署单元。它可以包含一个或多个紧密关联的容器,这些容器共享相同的网络命名空间、存储卷和其他资源。Pod 是 Kubernetes 中的原子调度单位,Kubernetes 将 Pod 调度到集群中的节点上,并负责管理它们的生命周期。
特点
- 多个容器:Pod 中可以包含一个或多个容器,这些容器共享相同的网络命名空间和 IP 地址,它们可以轻松地进行通信和资源共享。
- 共享资源:Pod 中的容器共享相同的存储卷和网络命名空间,它们可以直接相互通信,无需通过网络通信。
- 原子性:Pod 是 Kubernetes 中的最小调度单位,Kubernetes 将 Pod 视为一个整体,不会将其拆分到不同的节点上。
- 生命周期管理:Kubernetes 负责管理 Pod 的生命周期,包括创建、启动、停止、重启等操作,以确保 Pod 中的容器始终保持运行状态。
注:同Pod中的容器共享IP地址和端口空间,并且可以通过localhost相互访问。他们还可以使用标准的进程间通信(如SystemV信号量或POSIX共享内存)相互通信,不同Pod中的容器具有不同的IP地址,无需特殊配置即可通过IPC进行通信。
无状态的Pod:Deployments创建的pod是无状态的,就是pod部分挂了对整体没有影响。 无状态的pod(单个对整体无影响)
有状态的Pod:StatefulSet创建的pod有关联的,一个挂了影响整体。(单个对整体有影响)
init Pod: 容器是 Kubernetes 中一种特殊类型的容器,它们在 Pod 中的其他容器启动之前运行。Init 容器通常用于在主应用程序容器启动之前执行初始化任务,如数据预处理、配置准备、数据加载等。一旦所有 Init 容器成功完成其任务,Kubernetes 将继续启动主应用程序容器。Init 容器与普通容器的区别在于它们的生命周期。Init 容器的生命周期仅限于在其他容器启动之前运行,而不会被重新启动或重新调度。(有部分资源对象只能在init容器中设置)Init 容器与普通容器的区别在于它们的生命周期。Init 容器的生命周期仅限于在其他容器启动之前运行,而不会被重新启动或重新调度。
Pod的状态
- Pending:挂起,我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件。已经创建了但是没有适合它运行的节点叫做挂起,调度没有完成。
- Running:运行状态。
- Failed:表示失败。
- Succeeded:表示成功状态。
- Unknown:未知状态,所谓pod是什么状态是apiserver和运行在pod节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了,就会看Unknown
pod重启策略
kubectl explain pods.spec.restartPolicy 定义
Always:只要容器挂了就重启
OnFailure:只有容器状态为错误的时候才重启
Never:从不重启容器
默认重启策略就是Always
Pod的网络
每一个Pod会被分配唯一的IP地址,Pod中的每个容器共享网络名称空间,包括IP地址和网络端口,内部使用Localhost相互通信,当Pod和Pod
之间相互通信时必须使用共享网络资源。
Pod的存储
Pod可以指定一组共享存储卷。 POD中的所有容器都可以访问共享卷,允许这些容器共享数据。 卷也允许Pod中的持久数据在需要重新启动的情况下存活。
Pod与控制器
控制器可以管理一个或多个Pod,确保它们按照所定义的状态进行运行。例如,Deployment 控制器可以管理一组 Pod 的副本,并负责在需要时进行扩展、更新、缩减或更新。控制器还负责监视 Pod 的健康状态,并在 Pod 失效或出现问题时进行自愈操作,以确保应用程序的高可用性和稳定性。常见控制器包括 ReplicaSet、Deployment、StatefulSet 等
Pod的模版(重要)
在 Kubernetes 中,Pod 模板是指定义 Pod 规范的模板,它描述了 Pod 中容器的属性、配置和资源需求。Pod 模板通常用于创建和部署多个相似的 Pod 实例,可以通过控制器(如 Deployment、StatefulSet、ReplicaSet 等)来使用。
1、Pod和api对象
kubectl explain pods 查看Pod的资源对象
apiVersion定义了此对象表示的版本化模式。服务器应将已识别的模式转换为最新的内部值,并可能拒绝无法识别的值。
参考信息:https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#resources
2、Pod的关键字段
kind:在Kubernetes中,Kind 是资源的类型,用于指定Kubernetes API中的不同资源对象。在YAML文件中,Kind 字段指定了要创建或操作的资源类型。就是表示我们要创建什么资源,如Pod、deployment、statefulset、pod、service、ingress等
metadata:在Kubernetes中,metadata字段用于存储资源对象的元数据,例如名称、命名空间、标签等。这些元数据提供了关于资源的基本信息,以便 Kubernetes 可以正确地管理和操作这些资源。
spec:在Kubernetes中,metadata 字段用于存储资源对象的元数据,例如名称、命名空间、标签等。这些元数据提供了关于资源的基本信息,以便 Kubernetes 可以正确地管理和操作这些资源。
简单的YAML解析
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
labels:
web: nginx-web
spec:
hostname: nginx-host
nodeName: node01
containers:
- name: nginx-test
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: nginx-post
containerPort: 80
hostPort: 8080
restartPolicy: Always
#container中的restartPolicy只能在ini容器中设置
matadata.name:
[root@master yaml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 29m
matadata.labels字段:
[root@master yaml]# kubectl get pods nginx --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 30m web=nginx-web
spec.nodeName:
[root@master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 32m 10.244.1.28 node01 <none> <none>
spec.containers.name:
[root@master yaml]# kubectl exec -it nginx -- cat /etc/hostname
nginx-host
其他属性需要使用:kubectl describe pod my-pod 命令查看。