Pod 概述
- Pod 是 k8s 系统中可以创建和管理的最小单元(注意这里不是容器), 是资源对象模型中由用户创建或部署的最小资源对象模型, 也是在 k8s 上运行容器化应用的资源对象, 其他的资源对象都是用来支撑或者扩展 Pod 对象功能的, 比如控制器对象是用来管控 Pod 对象的, Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的, PersistentVolume 资源对象是用来为 Pod提供存储等等。
- k8s 不会直接处理容器, 而是 Pod, Pod 是由一个或多个 container 组成,Pod是一组容器的集合。
- 一个Pod容器共享网络命名空间。
- Pod是短暂的。重启IP是不唯一的。
Pod 是 Kubernetes 的最重要概念, 每一个 Pod 都有一个特殊的被称为” 根容器“的 Pause容器。 Pause 容器对应的镜 像属于 Kubernetes 平台的一部分, 除了 Pause 容器, 每个 Pod还包含一个或多个紧密相关的用户业务容器。
Pod存在的意义
- 创建容器使用docker,一个docker对应一个容器,一个容器有一个守护进程,一个容器运行一个应用程序(可以运行多个,但父进程挂了不好管理)。
- Pod是多进程设计,运行多个应用程序。一个Pod有多个容器,一个容器里运行一个应用程序。
- Pod存在是为了服务亲密性产品的。比如一个pod有两个应用,应用内部网络优先调用。两个应用需要频繁调用。
Pod实现机制
共享网络
容器本身之间是相互隔离的(用linux的namespace和group隔离),多个容器共享同一 network namespace, 由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace, 所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。 不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之前通信, 不可以使用 IPC( 如果没有特殊指定的话) 通信, 通常情况下使用 Pod的 IP 进行通信。pause根容器也叫info容器。通过pause容器,把其他业务容器加入到Pause容器里,让所有业务容器在同一个名称空间中,可以实现网络共享。
共享存储
一个 Pod 里的多个容器可以共享存储卷, 这个存储卷会被定义为 Pod 的一部分, 并且可以挂载到该 Pod 里的所有容器的文件系统上。
在Pod里进行持久化数据,包括日志数据和业务数据。下面是持久化数据卷的流程。
下面是一个写,一个读。挂在在同一个目录下。
镜像拉取策略
POD资源限制
Pod资源限制示例:
Pod重启机制
Pod 的重启策略包括 Always、 OnFailure 和 Never, 默认值是 Always。 OnFailure 和 Never主要在批量任务时开启。
Pod健康检查
一般可以通过kebectl get pods,但不能检查容器的实际状态。比如Java中的堆内存溢出,应用在运行但是不能正常提供服务。可以在应用层面进行健康检查。
Pod调度策略
通过kubectl get pods -o wide查看Pod状态。
- createpod ->在master中调用apiserver->将信息填写到etcd。
- scheduler -> 监控apiserver是否有createpod,通过etcd读取pod,通过调度算法将Pod调度到某个node节点上。
- 下面在node上操作。
- 通过kubelet访问apiserver,读取etcd拿到分配给当前节点pod->docker创建容器。
影响调度的属性
主要包括Pod资源限制、节点选择器标签、节点亲和性和污点和污点容忍。
Pod资源限制
节点选择器标签
节点选择环境。所以我们首先得给节点打个标签。
kubectl label node node1 env_role=dev #为node1节点为dev。
kubectl get nodes node1 --show-labels #查看标签
节点亲和性
节点亲和性:nodeAffinity和之前的nodeSelector基本一样,根据节点上标签约束来绝对Pod调度到哪些节点上。nodeAffinity功能更加强大。
(1)硬亲和性
(2)软亲和性
(3)支持常用操作符
IN, NotIn,Exists, Gt, Lt,DoesNotExists(反亲和性)。
污点和污点容忍
Taint污点:节点不做普通分配调度,是节点属性。
- 场景
(1)专用节点
(2)配置特点硬件节点
(3)基于Taint驱逐 - 具体演示
kubectl describe node node1 | grep Taint
(1)污点值有三个
a. NoSchedule:一定不被调度
b.PreferNoSchedule:尽量不被调度
c.NoExecute:不会调度,并且还会驱逐Node已有Pod
(2)为节点添加污点
kubectl taint node [node] key=value:污点值 #创建污点
kubectl taint node node1 env_role:NoSchedule- #删除污点
先测试发现会分配到两个节点。
创建污点后只调度到node2。
3. 污点容忍