kubernetes核心技术之Pod知识总结

简介: 【4月更文挑战第2天】kubernetes核心技术之Pod知识总结

Pod

Pod概述

Pod是k8s系统中国可以创建和管理的最小单元,是资源对象模型中又用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistenVolume资源对象是用来为Pod提供存储等等,k8s不会直接处理容器,而是Pod,Pod是由一个或多个container组成。

Pod是Kubernetes的最重要概念,每个Pod都有一个特殊的被称为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。

  • Pod vs应用

每个 Pod 都是应用的一个实例, 有专用的 IP

  • Pod vs 容器

一个 Pod 可以有多个容器, 彼此间共享网络和存储资源, 每个 Pod 中有一个 Pause 容器保存所有的容器状态, 通过管理 pause 容器, 达到管理 pod 中所有容器的效果

  • Pod vs 节点

同一个 Pod 中的容器总会被调度到相同 Node 节点, 不同节点间 Pod 的通信基于虚拟二层网络技术实现

  • Pod vs Pod
    普通的 Pod 和静态 Pod

Pod特性

1、资源共享

一个 Pod 里的多个容器可以共享存储和网络, 可以看作一个逻辑的主机。 共享的如
namespace,cgroups 或者其他的隔离资源。

多个容器共享同一 network namespace, 由此在一个 Pod里的多个容器共享 PodIP 和端口 namespace, 所以一个Pod 内的多个容器之间可以通过localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。 不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之前通信, 不可以使用 IPC(如果没有特殊指定的话)通信, 通常情况下使用 PodIP 进行通信。

一个 Pod 里的多个容器可以共享存储卷, 这个存储卷会被定义为 Pod 的一部分, 并且可以挂载到该 Pod 里的所有容器的文件系统上。

2、生命周期短暂

Pod 属于生命周期比较短暂的组件, 比如, 当 Pod 所在节点发生故障, 那么该节点上的 Pod会被调度到其他节点, 但需要注意的是, 被重新调度的 Pod 是一个全新的 Pod,跟之前的Pod 没有半毛钱关系。

3、平坦的网络

K8s 集群中的所有 Pod 都在同一个共享网络地址空间中, 也就是说每个 Pod 都可以通过其他 Pod 的 IP 地址来实现访问。

Pod 定义

1、下面是 yaml 文件定义的 Pod 的完整内容。

apiVersion: v1
kind: Pod
metadata: //元数据
name: string
namespace: string
labels:
-name: string
annotations:
-name: string
spec:containers: //pod 中的容器列表, 可以有多个容器
- name: string //容器的名称
image: string //容器中的镜像
imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略, 默认值为Always, 每次都尝试重新下载镜像
command: [string] //容器的启动命令列表(不配置的话使用镜像内部的命令) args:[string] //启动参数列表
workingDir: string //容器的工作目录 volumeMounts: //挂载到到容器内部的存储卷设置
-name: string
mountPath: string //存储卷在容器内部 Mount 的绝对路径 readOnly: boolean //默认值为读写
ports: //容器需要暴露的端口号列表
-name: string
containerPort: int //容器要暴露的端口
hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口, 设置hostPort 时同一台宿主机将不能再启动该容器的第 2 份副本)
protocol: string //TCP 和 UDP, 默认值为 TCP env: //容器运行前要设置的环境列表
-name: string value: string
resources:
limits: //资源限制, 容器的最大可用资源数量 cpu: Srting
memory: string
requeste: //资源限制, 容器启动的初始可用资源数量 cpu: string
memory: string
livenessProbe: //pod 内容器健康检查的设置 exec:
command: [string] //exec 方式需要指定的命令或脚本 httpGet: //通过 httpget 检查健康
path: string port: number host: string scheme: Srtring httpHeaders:
- name: Stirng value: string
tcpSocket: //通过 tcpSocket 检查健康
port: number initialDelaySeconds: 0//首次检查时间 timeoutSeconds: 0 //检查超时时间
periodSeconds: 0 //检查间隔时间
successThreshold: 0
failureThreshold: 0 securityContext: //安全配置
privileged: falae
restartPolicy: [Always|Never|OnFailure]//重启策略, 默认值为 Always
nodeSelector: object //节点选择, 表示将该 Pod 调度到包含这些 label 的 Node 上, 以key:value 格式指定
imagePullSecrets:
-name: string
hostNetwork: false //是否使用主机网络模式, 弃用 Docker 网桥, 默认否
volumes: //在该 pod 上定义共享存储卷列表
-name: string emptyDir: {} hostPath:
path: string secret:
secretName: string item:
-key: string path: string
configMap: name: string items:
-key: string
path: string

Pod 的基本使用方法

kubernetes 中对运行容器的要求为: 容器的主程序需要一直在前台运行, 而不是后台运行。 应用需要改造成前 台运行的方式。 如果我们创建的 Docker 镜像的启动命令是后台执行程序, 则在 kubelet 创建包含这个容器的 pod 之 后运行完该命令, 即认为 Pod 已经结束,将立刻销毁该 Pod。 如果为该 Pod 定义了 RC, 则创建、 销毁会陷入一个无 限循环的过程中。Pod 可以由 1 个或多个容器组合而成。

1、一个容器组成的 Pod 的 yaml 示例

apiVersion: v1
kind: Pod
metadata:
   name: mynginx
   labels:
      app: mynginx
spec:
 containers:
   - name: mynginx
     image: reg.harbor.com/public/nginx:latest
     ports:
      - containerPort: 80

2、多个容器组成的 Pod 的 yaml 示例

apiVersion: v1
kind: Pod
metadata:
   name: nginx-mysql
   labels:
      app: nginx-mysql
spec:
 containers:
   - name: ningx
     image: reg.harbor.com/public/nginx:latest
     ports:
      - containerPort: 80
   - name: mysql
     image: reg.harbor.com/public/mysql:5.7.17
     ports:
      - containerPort: 3306
     env:
      - name: MYSQL_ROOT_PASSWORD
        value: "123456"

3、创建

#进入yaml文件所在的目录下执行
kubectl create -f xxx.yaml 或者 kubectl apply -f xxx.yaml
[root@master1 pod]# kubectl apply  -f nginx_mysql.yaml
pod/nginx-mysql created

4、查看

kubectl get pod/po <Pod_name>
kubectl get pod/po <Pod_name> -o wide 
kubectl describe pod/po <Pod_name>

5、删除

kubectl delete -f pod pod_name.yaml
kubectl delete pod [pod_name]
kubectl delete pod --all #删除默认命名空间下的所有Pod资源

Pod的分类

1、普通Pod

普通 Pod 一旦被创建, 就会被放入到 etcd 中存储, 随后会被 Kubernetes Master 调度到某个具体的 Node 上并进行绑定, 随后该 Pod对应的 Node 上的 kubelet 进程实例化成一组相关的 Docker 容器并启动起来。 在默认情 况下, 当 Pod 里某个容器停止时, Kubernetes 会自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机,则会将这个 Node 上的所有 Pod 重新调度到其它节点上。

2、静态Pod

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

Pod生命周期和重启策略

1、Pod 的状态

状态值

说明

Pending

API Server已经创建该Pod,但Pod中的一个或多个容器镜像还没创建,包括镜像下载过程

Running

Pod内所有容器已创建,且至少一个容器处于运行状态、正在启动状态或正在重启状态

Completed

Pod内所有容器均成功执行退出,且不会重启

Failed

Pod内所有容器均已退出,但至少一个容器退出失败

Unknown

由于某种原因无法获取Pod状态,例如网络通信不通

2、Pod重启策略    

Pod 的重启策略包括 AlwaysOnFailureNever, 默认值是 Always

重启策略

说明

Always

当容器失效时,由kubelet自动重启该容器

OnFailure

当容器终止运行且退出码不为0时,由kubelet自动重启该容器

Never

不论容器运行状态如何,kubelet都不会重启该容器

Pod资源配置

每个Pod 都可以对其能使用的服务器上的计算资源设置限额, Kubernetes中可以设置限额的计算资源有CPUMemory 两种, 其中CPU的资源单位为CPU数量,是一个绝对值而非相对值。 Memory配额也是一个绝对值, 它的单位是内存字节数。

Kubernetes里, 一个计算资源进行配额限定需要设定以下两个参数: Requests该资源最小申请数量, 系统必须满足要求Limits该资源最大允许使用的量, 不能突破, 当容器试图使用超过这个量的资源时, 可能会被 Kubernetes Kill并重启。

apiVersion: v1
kind: Pod
metadata:
   name: mynginx
   labels:
      app: mynginx
spec:
 containers:
   - name: mynginx
     image: reg.harbor.com/public/nginx:latest
     ports:
      - containerPort: 80
     resources:
      requests:
       memory: "64Mi"
       cpu: '250m'
      limits:
       memory: "128Mi"
       cpu: "500m"

上述代码表明Nginx容器申请最少 0.25 个CPU以及64MiB内存, 在运行过程中容器所能使用的资源配额为 0.5 个CPU以及128MiB内存。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
运维 Kubernetes Cloud Native
智联招聘 × 阿里云 ACK One:云端弹性算力颠覆传统 IDC 架构,打造春招技术新范式
在 2025 年春季招聘季的激战中,智联招聘凭借阿里云 ACK One 注册集群与弹性 ACS 算力的深度融合,成功突破传统 IDC 机房的算力瓶颈,以云上弹性架构支撑千万级用户的高并发访问,实现招聘服务效率与稳定性的双重跃升。
|
11月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
429 25
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
11月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
403 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
260 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
386 14
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
267 1
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
212 1
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多