- Pod概述
- Pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,k8s不会直接处理容器,而是Pod,Pod是由一个或多个container组成
- Pod是Kubernetes的最重要概念,每一个Pod都有一个特殊的被称为==”根容器“的Pause容器==Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器
(1)最小部署的单元
(2)包含多个容器(一组容器的集合)
(3)一个pod中容器共享网络命名空间
(4)pod是短暂的(重启就可能发生变化)
- 创建容器使用docker,一个docker对应是一个容器,一个容器有进程,一个容器运行一个应用程序
- Pod是多进程设计,运行多个应用程序
- 一个Pod有多个容器,一个容器里面运行一个应用程序
- Pod存在为了亲密性应用
- 两个应用之间(频繁)交互
- 网络之间的调用
容器用Docker创建,容器本身之间是相互隔离的(namespace->名称空间, group)
- 共享网络
- 首先pod会创建Pause容器(根容器/info容器)
- 通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间(namespace)中,可以实现网络共享
- 共享存储
- 引入数据卷概念Volumn,使用数据卷进行持久化存储
演示:
Pod镜像拉取策略
-
IfNotPresent: 默认值,镜像在宿主机上不存在时才拉取
-
Always: 每次创建Pod都会重新拉取一次镜像
-
Never: Pod永远不会主动拉取这个镜像
*
Pod健康检查- livenessProbe(存活检查)
- 如果检查失败,将杀死容器,根据Pod的**restartPolicy(重启策略)**来操作。
- readinessProbe(就绪检查)
-
如果检查失败,Kubernetes会把Pod从service endpoints中别除。
#Probe支持以下三种检查方法: ## httpGet ### 发送HTTP请求,返回200-400范围状态码为成功。 #exec ## 执行shell命令返回状态码是0为成功。 #tcpSocket ###发起TCP Socket建立成功。
- master节点:1创建pod-首先进入API Server - 把相关信息存储到etcd · 2Scheduler监听API Server(是否有新的pod创建) - 有新的pod创建时通过etcd读取到相关信息(把结果返回给API Server - 在存储到etcd) - 通过调度算法把pod调度到某个node节点
- node节点:3通过Kubelet先访问API Server - 通过etcd读取到分配给当前节点pod相关信息 · 4通过docker创建容器(把创建容器的状态返回给API Server - 在存储到etcd)
- API Server:同一管理
- etxd:存储
- Scheduler: 实时监控API Server
- 影响Pod调度:
-
Pod资源限制
-
节点选择器标签(nodeSelector)
spec: nodeSelector: env_test: dev containers: - name: nginx image: nginx:1.15
[root@master0 ~]# kubectl label node node1 env_test=dev node/node1 labeled [root@master0 ~]# kubectl get node node1 --show-labels NAME STATUS ROLES AGE VERSION LABELS node1 Ready26h v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env_test=dev,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux [root@master0 ~]#
-
节点亲和性
-
污点和污点容忍
节点亲和性->nodeAffinity和之前nodeSelector基本一样的,根据节点上标签约束来绝对Pod调度
到哪些节点上
- 硬亲和性
- 软亲和性
- 支持常用操作符:operator: In/NotIn/Exists/Gt…
-
基本介绍
- nodeSelector和nodeAffinity: Pod调度到某些节点上,Pod属性,调度时候实现
- Taint污点:节点不做普通分配调度,是节点属性
-
查看污点情况命令:kubectl describe node [节点name]| grep Taint
[rootak8smaster ~]# kubectl describe node k8smaster | grep Taint Taints: node-role.kubernetes.io/master:NoSchedule #污点值 #NoSchedule: 一定不会调度 #PreferNoSchedule: 尽量不被调度 #NoExecute: 不会调度,并且还会驱逐Node已有Pod
- 为节点添加污点:kubectl taint node [节点name] [key=value:污点值]
[root@k8smaster ~]# kubectl taint node k8snodel env_test=yes:NoSchedule node/k8snodel tainted [root k8smaster ~]#
- 删除污点:kubectl taint node [节点name] [key:污点值] -
[rootek8smaster ~]# kubectl describe node k8snode1 | grep Taint Taints: env_test=yes:NoSchedule [rootak8smaster ]# kubectl taint node k8snode1 env_test:NoSchedule- node/k8snodel untainted [rootak8smaster ~]# kubectl describe node k8snode1 | grep Taint Taints:
- 污点容忍: 虽然加了污点但也有可能被调度到
spec:
tolerations:
- key: " "
operator: "Equal"
value: " "
effect: "NoSchedule"
containers:
- name: webdemo
image: nginx



