kubernetes(k8s)核心之Pod速通
k8s核心技术-Pod
pod基本概念
pod是最小部署单元,包含对各容器(一组容器的集合),每个pod都有一个"根容器"——Pause容器,一个pod中的容器共享网络命名空间,pod是短暂的
pod存在的意义
①创建容器使用docker,一个docker对应一个容器,一个容器有一个进程,一个容器运行一个应用程序
②pod是多进程设计,运行多个应用程序,一个pod可以有多个容器,可以同时运行多个应用程序
③pod的存在为了亲密性应用(多个应用之间进行交互,也可以提供网络之间调用)
pod实现机制
共享网络:通过Pause容器,把其他业务容器加入到Pause容器里,让所有业务容器在同一个命名空间(namespace)中,可以实现网络共享
共享存储:引入数据卷概念volume,使用数据卷进行持久化存储
pod镜像拉取策略
imagePullPolicy:Always#IfNotPresent:默认值,镜像在宿主机不存在时进行拉取
#Always:每次创建镜像都会进行镜像拉取
#Never:pod永远不会主动拉取镜像
pod资源限制
其实是通过docker实现
resources:requests:memory: "64Mi"cpu: "250M"limits:memory: "128Mi"cpu: "500M"
pod重启机制
restartPolicy:Never#Always:默认策略,当容器停止退出后,总是重启容器
#OnFailure:当容器异常退出(退出状态码非0)时,才重启容器
#Never:当容器终止退出,从不重启容器 (批量任务使用次策略)
pod健康检查
livenessProbe(存活检查):如果检查失败,将杀死容器,根据pod的restartPolicy来操作
readinessProbe(就绪检查):如果检查失败,k8s会把pod从service endpoints中剔除
Probe三种检查方法:
httpGet:发送http请求,返回200-400状态码为成功
exec:执行shell命令返回状态0为成功
tcpSocket:发起TCP Socket建立成功
pod调度
创建pod的流程:
master节点:
createPod --apiserver --etcd存储
scheduler --apiserver --etcd --调度算法,把pod调度到某个node节点(工作节点)上
node节点:
kubelet --apiserver --读取etcd数据,拿到分配给当前节点的pod--docker创建容器
影响调度的属性:
1、pod资源限制对pod调度产生影响
2、节点选择器(nodeSelector)标签影响pod调度
spec:nodeSelector:env-role: dev#对节点创建标签
kubectl label node node1 env_role=dev
3、节点亲和性影响pod调度
nodeAffinity:硬亲和性------约束条件必须满足
软亲和性------尝试满足,不保证
支持常用操作符:In NotIn Exists Gt Lt DoesNotExists
4、污点和污点容忍
nodeSelector和nodeAffinity:pod调度到某些节点上,是pod的属性,调度时实现
污点Taint:节点不做普通分配调度,是节点的属性
应用场景:专用节点
配置特定硬件的节点
基于Taint驱逐
#查看节点污点情况
kubectl describe node [节点名称] | grep Taint
污点值:
NoSchedule:一定不被调度
PreferNoSchedule:尽量不被调度
NoExcute:不会调度,并且还会驱逐节点上已有的pod
#为节点添加污点
kubectl taint node [node] key=value:污点值
kubectl taint node k8smaster name=env_role:NoSchedule#删除污点
kubectl taint node [node]
污点容忍tolerations:即使给吴点设置了NoSchedule的污点值,也可能存在被调度到的情况
在pod中添加容忍规则:
tolerations:
- key: "name"value: "env_role"effect: "NoExecute"