您现在的位置是:首页 >技术杂谈 >【云原生|Kubernetes】03-Pod详解网站首页技术杂谈
【云原生|Kubernetes】03-Pod详解
简介【云原生|Kubernetes】03-Pod详解
【云原生|Kubernetes】03-Pod详解
文章目录
前言
Kubernetes的资源文件有很多如pod,Deployment,DaemonSet,ReplicaSet,Cronjob,job,StatefulSet,ConfigMap,PVC,Seceret。学习kubernetes的核心,就是学习如何对集群上的
Pod、Pod控制器、Service、存储
等各种资源进行操作;后面我们将逐个介绍这些资源类型;本章我们详细说说-Pod
Pod解析
Pod简介
- 在 Kubernetes 中,
Pod
是最小的可部署的单位,它是一个或多个容器的集合,它们共享同一个网络命名空间和存储卷。Pod是Kubernetes中的基本概念,所有的容器化应用都运行在Pod中。
- 共享网络命名空间:Pod中的所有容器共享同一个网络命名空间,它们可以使用相同的IP地址和端口号,从而可以轻松地相互通信。
- 共享存储卷:Pod中的所有容器共享同一个存储卷,它们可以访问存储卷中的相同数据。这使得在多个容器之间共享数据变得非常容易。
- 容器间通信:在同一个Pod中的容器可以使用本地主机通信,从而避免了跨主机网络通信的开销和延迟。
Pod的组成
容器
- 一个Pod中可以包含一个或多个容器,它们共享同一个网络命名空间和存储卷。每个容器都运行在独立的命名空间中,并且具有自己的CPU、内存和文件系统。容器可以是Docker容器或其他容器。
共享的网络命名空间
- 在同一个Pod中的所有容器共享同一个网络命名空间,它们可以使用相同的IP地址和端口号,从而可以轻松地相互通信。这使得在多个容器之间共享数据和服务变得非常容易。
共享的存储卷
- 在同一个Pod中的所有容器共享同一个存储卷,它们可以访问存储卷中的相同数据。这使得在多个容器之间共享数据变得非常容易。
生命周期
Pod有自己的生命周期,它可以被创建、更新和删除。Pod通常作为部署应用程序的最小单元,而不是作为持久化实体。当应用程序需要进行伸缩或更新时,可以创建、更新或删除Pod来满足需求。
共享的环境变量
- 在同一个Pod中的所有容器共享同一个环境变量,它们可以使用相同的环境变量来共享配置信息和其他数据。
初始化容器
- Pod中可以包含一个或多个初始化容器,这些容器在Pod中的其他容器启动之前先启动。初始化容器可以用于预处理数据、检查依赖关系或执行其他任务。
Pod中的几种容器的概念
- Pause容器
- 初始化容器
- 业务容器(主容器和伴随容器)
Pause容器
pause
容器是每个Pod中必须的一个容器,它的主要作用是创建Pod的网络命名空间和存储卷,并且在Pod中的其他容器启动之前先启动它。pause
容器会在Pod中的其他容器启动后继续运行,但是它会一直保持运行状态,直到Pod被删除。
初始化容器
- 初始化容器是一种特殊类型的容器,它们在Pod中的其他容器启动之前先启动。初始化容器可以用于在启动应用程序之前执行一些任务,如预处理数据、检查依赖关系或执行其他任务。初始化容器会在完成它们的任务后退出,然后Pod中的其他容器才会启动。
主容器
- Pod中的主容器是指在Pod中定义的业务容器。它通常是应用程序容器,负责提供主要的服务或功能。主容器的退出状态将作为Pod的退出状态。
伴随容器
- 伴随容器是指在Pod中定义的其他容器,它们通常用于支持主容器的运行,如日志收集、配置管理、数据备份等。伴随容器的退出状态不会影响Pod的退出状态。
容器的启动顺序
- Pause容器---->初始化容器---->业务容器(主容器和伴随容器)
- 容器的启动顺序在Pod中是有序的,但是它们的启动时间是并行的。也就是说,虽然Pause容器、初始化容器、主容器和伴随容器的启动顺序是有序的,但是它们的启动时间是可以并行的,这可以提高容器的启动速度和效率。
容器与pod与node的关系
Pod种类
- 普通Pod(单容器Pod和多容器Pod)
- 静态Pod
- Job Pod
- CronJob Pod
普通Pod
- 单容器Pod是最简单的Pod类型,它包含一个容器和一些共享的资源,如网络和存储卷。单容器Pod通常用于部署一个单独的应用程序或服务。
- 多容器Pod包含多个容器和一些共享的资源,如网络和存储卷。多容器Pod通常用于部署一个包含多个服务或应用程序的应用程序或服务。
pause
容器是每个Pod中必须的一个容器。
静态pod
- 静态Pod是由kubelet进行管理的仅存在于特定Node上的Pod。它们 不能通过API Server进行管理,无法与ReplicationController、Deployment 或者DaemonSet进行关联,并且kubelet无法对它们进行健康检查。静态 Pod总是由kubelet创建的,并且总在kubelet所在的Node上运行。
- 在kubernetes集群中核心组件kube-apiserver,kube-controller-manager,kube-scheduler,etcd就是通过静态Pod部署的。
静态Pod创建方式
- yml的配置文件方式
- http方式
配置文件方式
- 静态Pod的YAML文件路径通常位于kubelet的静态Pod路径中。默认情况下,kubelet会在
/etc/kubernetes/manifests
目录下查找静态Pod的YAML文件,如果找到了,则会立即启动该Pod。
-
修改kubelet的静态Pod默认存储路径
- 查看kubelet服务启动的配置文件
- 查看kubet服务器启动指导的配置文件,–config信息
- 修改默认路径
- 重启kubelet服务会制动识别该目录下的相关YML文件。
http方式
通过设置 kubelet 的启动参数” --anifest -url ", kubelet 将会定期从该 URL 地址下载 Pod 的定义文件,并以 yam或jso 文件的格式进行解析,然后创建 Pod 。其实现方式与 配置文件方式是一致的。
Job Pod
Job Pod是一种用于执行一次性任务的Pod,例如数据导入、数据备份等。
CronJob Pod
CronJob Pod是一种定期执行任务的Pod,例如定期生成报告、清理数据等。
关于job和cronjob会在后面的资源管理中单独介绍。
Pod的启动删除流程
启动流程
- 创建 Pod 描述文件:使用 YAML 或 JSON 格式的 Pod 描述文件来定义 Pod 的元数据(如名称、标签和注释)以及容器的规范(如容器镜像、命令、端口和卷)。
- 将 Pod 描述文件提交到 Kubernetes API Server:通过运行
kubectl apply
命令或使用 Kubernetes API 客户端将 Pod 描述文件提交到 Kubernetes API Server。- API Server 验证描述文件:API Server 验证 Pod 描述文件的格式和内容是否正确,并将其存储在 Kubernetes etcd 存储中。
- 调度 Pod:Kubernetes Scheduler 根据 Pod 的调度规则(如资源需求、亲和性和反亲和性)选择合适的节点,并将 Pod 分配给该节点。
- 创建容器:Kubernetes 节点上的 Kubelet 接收到调度器分配的 Pod 后,会拉取 Pod 中定义的容器镜像,并在节点上创建容器。
- 更新 Pod 状态:一旦容器创建成功,Kubelet 会向 API Server 报告 Pod 的状态,包括容器的运行状态、IP 地址和端口映射等信息。
- 监控 Pod:Kubernetes 控制器会定期检查 Pod 的状态,并根据需要采取修复措施,例如重启容器或迁移 Pod 到其他节点。
删除流程
- 删除 Pod 描述文件:使用
kubectl delete
命令或 Kubernetes API 客户端将 Pod 的描述文件删除。这会触发 Kubernetes 控制器删除相应的 Pod 资源。- API Server 验证删除请求:API Server 验证删除请求的格式和内容是否正确,并将删除请求存储在 Kubernetes etcd 存储中。
- 调度器删除 Pod:Kubernetes Scheduler 从节点中删除 Pod,并释放节点上的资源。
- 删除容器:Kubernetes 节点上的 Kubelet 会停止并删除 Pod 中的所有容器。
- 更新 Pod 状态:一旦 Pod 中的所有容器都被停止并删除,Kubelet 会向 API Server 报告 Pod 已被删除的状态。
- 清理资源:Kubernetes 控制器会在一定时间内监视 Pod 的状态,如果发现 Pod 删除不干净,会自动清理相关资源,例如存储卷和网络资源。
Pod的基本用法
Pod资源文件介绍
apiVersion: v1 #版本号,例如:v1
kind: Pod #资源类型,如:Pod,Deployment,service等
metadata: #元数据
name: string #Pod名称,自定义
namespace: string #Pod所属于的命名空间,不指定默认为default
labels: #定义Pod标签
- name: string #标签名称,自定义
spec: #Pod详细定义部分
containers: #Pod中容器列表
- name: string #自定义容器名称
image: string #镜像名称
imagePullPolicy: [Always| Never | IfNotPresent] #镜像拉取策略:默认为Aways #(1)Always:表示每次尝试重新拉取镜像(2)Never:表示仅使用本地镜像(3)IfNotPresent:表示本地有则用本地镜像,没有则仓库拉取
command: string #容器启动命令列表,如果不指定则使用镜像打包还是使用的启动命令
args: string #容器启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用Pod定义的共享存储卷名称,需要使用Volume[]部分定义的共享存储卷名称
mountPath: string #存储卷在容器内部Mount的绝对路径,应少于512个字符串
readOnly: boolean #是否为只读模式,默认为读写
ports: #容器需要暴露端口列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与containerPort相同,设置hostPort的时候,同一宿主机将无法启动容器的第二个副本
protocol: string #端口协议,支持TCP和UDP,默认为TCP
env: #容器运行前需要设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和资源限制请求的设置
limiuts: #资源限制最最大
cpu: string #CPU限制:单位为core数,将使用docker run --cpu-shares参数
memeory: string #内存限制:单位为M,G等,将用于docker run --memory
requests: #资源最小限制
cpu: string #CPU限制:单位为core数,容器启动的初始可用数量
memeory: string #内存限制:单位为M,G等,,容器启动的初始可用数量
livenessProbe: #对Pod内各个容器健康检查的设置,当探测无响应几次后,系统将自动重启该容器,可以设置的方式包括exec,httpGet和tcpSocket
exec: #对pod内各个容器健康检查的设置为exec方式
command: [string] #exec防暑需要制定的命令或者脚本
httpGet: #对pod内各个容器健康检查的设置为httpGet方式,该方式需要指定path,port
path: string
ports: number
host: string
scheme: string
httpHeaders:
- name: string
value: string
tcpSocket: #对pod内各个容器健康检查的设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #启动容器完成后首次探测的时间,单位为s
timeoutSeconds: 0 #对容器健康检查的探测等待响应的超时时间设置,单位为s;默认为1s,若超时时间设置,则将认为该容器不健康,则会重启
periodSeconds: 0 #对容器健康检查的定期探测时间设置,单位为s;默认为10s探测一次
successThreshold: 0
failureThreshold: 0
restartPolicy: [Always| Never | OnFailure] #Pod的重启策略,默认为Always;(1)Always:Pod一旦停止运行,则无论容器是如何终止的,kubelet都将重启它。(2)OnFailure:只有Pod以非0退出码终止时,kubelet才会重启该容器,假如容器为正常退出(退出码为0)kubelet就不会重启;(3)Nerver:Pod终止后,kubelet将退出码报告给master,不会再重启该pod
nodeSelector: object #设置Node的label,以key:value的格式指定,pod将会被调度到具有这些label的node节点上
imagePullSecrets: #pull镜像的时候使用Secret名称,以name:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认值为false,设置为true表示容器使用宿主机网络,不在使用docker网桥,该pod无法在同一宿主机上启动第二个副本
volume: #Pod上定义的共享存储列表
- name: string #共享存储卷的名称,在pod中每个存储卷定义一个名称,应该符合RFC 1035规范,容器定义的部分,将引用该共享存储卷名称。
emptyDir: {} #类型为empytDir的存在卷,表示与Pod同生命周期的一个临时目录,其值为一个空对象。
hostPath: #类型为hostPath的存储卷,表示挂载pod所在宿主机的目录,通过volumes[],hostPath.path指定
path: string #Pod所在主机的目录,将被用于容器中的mount的目录
secret: #类型为secret的存储卷,表示挂载集群一定要的secret对象到容器内部
secretName: string
item:
- key: string
path: string
configMap #类型为configMap存储卷,表示挂载集群预定义的configMap对象到容器的内部
name: string
item: string
- key: string
path: string
Pod常用操作
- 定义一个基础的Pod资源文件
[root@master pod]# cat nginx_pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: pod-namespace
labels:
nginx: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
ports:
- name: 80-port
containerPort: 80
hostPort: 8081
protocol: TCP
[root@master pod]#
kubectl常用的pod指令
- 通过pod资源文件创建pod
kubectl apply -f nginx_pod.yml
- 通过pod资源文件删除pod
kubectl delete -f nginx_pod.yml
- 显示pod的详细信息,包括资源的元数据、状态和事件等
kubectl describe nginx-pod -n pod-namespace
- 查看pod的日志信息
kubectl logs nginx-pod -n pod-namespace
- 获取特定 Pod 的详细信息
kubectl get pod nginx-pod -n pod-namespace -o wide
- 获取特定 Pod 的详细信息,以yaml的形式显示
kubectl get pod nginx-pod -n pod-namespace -o yaml
- 使用默认编辑器编辑特定 Pod 的定义文件。
kubectl edit pod <pod-name>
- 进入特定 Pod 的容器中,并启动 Bash shell 会话。
kubectl exec -it <pod-name> -- /bin/bash
- 将本地端口与 Pod 中的端口进行映射,以便可以通过本地计算机访问 Pod 中的服务。
kubectl port-forward <pod-name> <local-port>:<pod-port>
- 获取特定 Pod 中特定容器的日志。
kubectl logs <pod-name> -c <container-name>
本章节只介绍了Pod的相关概念,如Pod的组成,Pod中容器种类,Pod的删除启动流程等等,然后Pod的是整个Kubernetes的最小单元及核心,后面我们也将围绕Pod继续展开说说,比如Pod的生命周期,Pod的调度等等
- 将本地端口与 Pod 中的端口进行映射,以便可以通过本地计算机访问 Pod 中的服务。
kubectl port-forward <pod-name> <local-port>:<pod-port>
- 获取特定 Pod 中特定容器的日志。
kubectl logs <pod-name> -c <container-name>
本章节只介绍了Pod的相关概念,如Pod的组成,Pod中容器种类,Pod的删除启动流程等等,然后Pod的是整个Kubernetes的最小单元及核心,后面我们也将围绕Pod继续展开说说,比如Pod的生命周期,Pod的调度等等
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。