Kubernetes05: Pod
1、概述
1)最小部署的单元
2)K8s不会处理容器,而是Pod,Pod里边包含多个容器(一组容器的集合)
3)一个Pod中的容器共享一个网络命名空间
4) Pod是短暂存在的东西(重新创建/启动Pod,其IP是不一致的)
5)每个Pod都有一个称为根容器的Pause容器。Pause容器对应的镜像属于 kubernetes平台的一部分。
6)除了根容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
2、Pod存在的意义
1)创建容器使用docker,一个docker对应一个容器,一个容器有一个进程,一个容器运行一个应用程序。因为docker容器里边多进程不好管理。
2)Pod是一个多进程的设计,可以运行多个应用程序
- 一个Pod里边可以有多个容器,一个容器里边运行一个应用程序
3)Pod存在是为了亲密性应用 - 两个应用或多个应用之间要进行交互
- 网络之间的调用,在Pod的中,通过socket或者127.0.0.1就可以交互
- 两个应用需要频繁调用
3、Pod的实现的机制
1)共享网络
Pod实现共享网络的过程
步骤:首先创建Pause容器也就是info容器,然后再创建业务容器,并将业务容器加入info容器,这样将会在同一个namespace之中,并且有同一个 IP、MAC、PORT
*共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间中,可以实现网络共享
2)共享存储
*共享存储:引入数据卷概念Volume,使用数据卷进行持久化存储
4、Pod镜像拉取的策略
5、Pod资源限制
本身是由docker做到的
6、Pod重启机制
Always:redis
后两个:批量处理任务:kafaka、MQ…
7、Pod的健康检查
容器检查 是否是一个正常运行的状态
当出现java堆内存溢出的时候,容器检查已经不能检查出来
所以需要从应用层面进行健康检查,比如通过127.0.0.1去进行连接
不需要去记,在使用中看文档即可
8、Pod的调度策略
createpod – apiserver – etcd
scheduler – apiserver – etcd --调度算法,把Pod调度到某个node节点上
在node节点操作
kubectl – apiserver – 读取etcd拿到
分配给当前节点的Pod – docker 创建容器
所有操作都经过 APIServer 用 etcd 做存储
Pod调度
影响调用的属性
1、Pod资源限制对Pod调用会产生影响
根据 request 找到足够node节点进行调度
2、节点选择器标签 影响Pod调度
####### 首先对节点创建标签
#给节点打一个标签将node起名为prod
kubectl label node node1 env_role=prod
kubectl get nodes K8snode1 env_role=dev
节点的亲和性对资源调度的影响
节点亲和性 nodeAffinity 和之前nodeSelector基本一样的,根据节点上标签约束来决定Pod调度到哪些节点上
1)硬亲和性–约束条件必须满足
2)软亲和性–尝试满足,不保证绝对能满足
支持常操作符
In :在里边
NotIn:不在里边
Exists :存在
DoesNotExists:不存在
Gt :大于
Lt:小于
反亲和性
DoesNotExists:不存在
影响Pod调度 污点、污点容忍
1、基本介绍
nodeSelector 和 nodeAffinity:Pod调度到某些节点上,Pod属性,调度时候实现
Taint污点:节点不做普通分配调度m , 是节点属性
2、场景
- 专用节点
- 配置特定硬件节点
- 基于Taint驱逐
3、具体演示
1)具体查看污点情况
污点中的值主要有三个
- NoSchedule :表示节点肯定不会被调度
- PreferNoSchedule:尽量会被调度
- NoExecute :不会调度,并且还会驱逐Node已有Pod
2)为节点添加污点
kubectl taint node k8snode1 key=value:污点的三个值
#添加污点
kubectl taint k8snodel env role=yes:NoSchedule
#删除镜像
kubectl delete deployment nginx-f8
3)为节点删除污点
kubectl taint node k8snode1 key=value:污点的三个值
4)污点的容忍 – 设定污点容忍之后也可能被调度到,但也可能不被调度到