pod 概述
Pod 是 K8S 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 K8S 上运行容器化应用的资源对象,其它的资源对象都是用来支撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者 Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod 提供存储等等,K8S 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成。
Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为 “根容器”的 Pause 容器。Pause 容器对应的镜像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod 还包含一个或多个紧密相关的用户业务容器
Pod基本概念
- 最小部署的单元
- Pod 里面是由一个或多个容器组成【一组容器的集合】
- 一个 pod 中的容器是共享网络命名空间
- Pod 生命周期是短暂的
- 每个 Pod 包含一个或多个紧密相关的用户业务容器
Pod存在的意义
- 创建容器使用 docker,一个 docker 对应一个容器,一个容器运行一个应用进程
- Pod 是多进程设计,运用多个应用程序,也就是一个 Pod 里面有多个容器,而一个容器里面运行一个应用程序
Pod 是在 K8S 集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。同时 Pod 对多容器的支持是 K8S 中最基础的设计理念。在生产环境中,通常是由不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。
Pod 是 K8S 集群中所有业务类型的基础,可以把 Pod 看作运行在 K8S 集群上的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前 K8S 的业务主要可以分为以下几种
- 长期伺服型:long-running
- 批处理型:batch
- 节点后台支撑型:node-daemon
- 有状态应用型:stateful application
Pod实现机制
主要有以下两大机制
- 共享网络
- 共享存储
共享网络
容器本身之间相互隔离的,一般是通过 namespace 和 group 进行隔离,那么Pod里面的容器如何实现通信?
- 首先需要满足前提条件,也就是容器都在同一个namespace之间
关于Pod实现原理,首先会在Pod会创建一个根容器: pause容器
,然后我们在创建业务容器 【nginx,redis 等】,在我们创建业务容器的时候,会把它添加到 info容器
中
而在 info容器
中会独立出 ip地址,mac地址,port 等信息,然后实现网络的共享
共享存储
Pod 持久化数据,专门存储到某个地方中
常用命令
# 查看所有的 pod 列表,-n 后面跟 namespace,查看指定的命名空间,-o wide 查看详细信息 kubectl get pod kubectl get pod -n kube-system # 查看 kube-system 命名空间下的 pod kubectl get pod -o wide # 查看 pod 的详细信息,有 ip、node 节点等信息
kubectl get pod -o wide 的参数含义如下
- name:自定义的名称,后面会加些数据
- READY:当前 pod 里的容器,pause 容器不算在里面,/ 前面的表示运行了几个,后面的数字表示一共有几个
- STATUS:当前的状态
- AGE:pod 存在的时长
- IP:pod 的 ip,这个只能在当前部署的机器上访问,外网是访问不了的
- NODE:当前 pod 在哪个 node 上运行
# 显示 Node 的详细信息 kubectl describe node dce-10-6-215-190 # node 后面的是 node名称
# 显示 Pod 的详细信息, 特别是查看 pod 无法创建的时候的日志 kubectl describe pod web # web 是你创建 pod 时起的名称
# 根据 yaml 创建资源, apply 可以重复执行,create 不行 kubectl create -f pod.yaml kubectl apply -f pod.yaml
# 删除所有 Pod kubectl delete pod --all # 强制删除某个文件名命名节点 ,基于 pod.yaml 定义的名称删除 pod kubectl delete -f <文件名> # 删除某个Pod命令节点 kubectl delete pod <pod名> # 删除某个Replication Controller命名节点 kubectl delete rc <rc名> kubectl delete deployment 名称 # 删除某个服务命名节点 kubectl delete service <service名> # 删除所有Pod节点 kubectl delete pod --all