文章目录

  • 一、Pod 概述
    • 1.1 Pod 基本概念
  • 二、Pod存在的意义
  • 三、Pod实现机制
    • 3.1 共享网络
    • 3.2 共享存储
  • 四、Pod镜像拉取策略
  • 五、Pod资源限制
  • 六、Pod 生命周期和重启策略
    • 6.1 Pod 的状态
    • 6.2 Pod 重启策略
  • 七、Pod健康检查
  • 八、Pod调度策略
    • 8.1 创建Pod流程
    • 8.2 影响Pod调度的属性
      • 8.2.1 Pod资源限制对Pod的调度会有影响
      • 8.2.2 节点选择器标签影响Pod调度
      • 8.2.3 节点亲和性
      • 8.2.4 污点和污点容忍

一、Pod 概述

Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象,其它的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,K8S不会直接处理容器,而是Pod,Pod是由一个或多个container组成。

Pod是Kubernetes的最重要概念,每一个Pod都有一个特殊的被称为 “根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。

1.1 Pod 基本概念

  • 最小部署的单元
  • Pod里面是由一个或多个容器组成【一组容器的集合】
  • 一个pod中的容器是共享网络命名空间(网络共享)
  • Pod是短暂的
  • 每个Pod包含一个或多个紧密相关的用户业务容器

二、Pod存在的意义

  • 创建容器使用docker,一个docker对应一个容器,一个容器运行一个应用进程
  • Pod是多进程设计,运用多个应用程序,也就是一个Pod里面有多个容器,而一个容器里面运行一个应用程序

Pod的存在是为了亲密性应用

  • 两个应用之间进行交互
  • 网络之间的调用【通过127.0.0.1 或 socket】
  • 两个应用之间需要频繁调用

Pod是在K8S集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。同时Pod对多容器的支持是K8S中最基础的设计理念。在生产环境中,通常是由不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。

Pod是K8S集群中所有业务类型的基础,可以把Pod看作运行在K8S集群上的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8S的业务主要可以分为以下几种

  • 长期伺服型:long-running
  • 批处理型:batch
  • 节点后台支撑型:node-daemon
  • 有状态应用型:stateful application

上述的几种类型,分别对应的小机器人控制器为:Deployment、Job、DaemonSet 和 StatefulSet (后面将介绍控制器)

三、Pod实现机制

主要有以下两大机制

  • 共享网络
  • 共享存储

3.1 共享网络

容器本身之间相互隔离的,一般是通过 namespace 和 group 进行隔离,那么Pod里面的容器如何实现通信?

首先需要满足前提条件,也就是容器都在同一个namespace之间
关于Pod实现原理,首先会在Pod会创建一个根容器: pause容器(info容器),然后我们在创建业务容器 【nginx,redis 等】,在我们创建业务容器的时候,会把它添加到 info容器 中而在 info容器 中会独立出 ip地址,mac地址,port 等信息,然后实现网络的共享


完整步骤如下

  • 通过 Pause 容器,把其它业务容器加入到Pause容器里,让所有业务容器在同一个名称空间中,可以实现网络共享

3.2 共享存储

Pod持久化数据,专门存储到某个地方中

引入Volumn数据卷概念,使用数据卷进行持久化存储

使用 Volumn数据卷进行共享存储,案例如下所示

apiversion: v1
kind: Pod
metadata:name: my-pod
spec:containers: - name: write #循环写入1-100image: centoscommand: ["bash","-c","for i in (1..100 );do echo $i >> /data/hello;sleep 1;done"]volumeMounts:   #挂载数据卷- name: datamountPath: /data   - name: read   #写入读取的数据image: centoscominand: ["bash","-c","tail -f /data/hel1o"]volumeMounts:   #挂载数据卷- name: datamountPath: /data  volumes:  #定义数据卷- name: dataemptyDir: () #默认是空的

四、Pod镜像拉取策略

拉取策略就是 imagePullPolicy

apiversion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: nginximaae: nainx :1.14imagePullPolicy: Always

拉取策略(imagePullPolicy)主要分为了以下几种

  • IfNotPresent: 默认值,镜像在宿主机上不存在才拉取
  • Always: 每次创建Pod都会重新拉取一次镜像
  • Never: Pod永远不会主动拉取这个镜像

五、Pod资源限制

也就是我们Pod在进行调度的时候,可以对调度的资源进行限制,例如我们限制 Pod调度是使用的资源是 2C4G,那么在调度对应的node节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度

示例

apiversion:v1
kind: Pod
metadata:name : frontend
spec:containers:- name: dbimage: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: "password"resources: #资源限制部分recuests: #request:表示调度所需的资源memory: "64Mi" #内存cpu:"250m" #cpulimits: #limits:表示最大所占用的资源memory: "128Mi"cpu: "500m"

六、Pod 生命周期和重启策略

6.1 Pod 的状态

状态值 说明
Pending API Server已经创建了该Pod,但Pod中的一个或多个容器的镜像还没有创建,包括镜像下载过程
Running Pod内所有容器已创建,且至少一个容器处于运行状态、正在启动状态或正在重启状态
Completed Pod内所有容器均成功执行退出,且不会再重启
Failed Pod内所有容器均已退出,但至少一个容器退出失败
Unknown 由于某种原因无法获取Pod状态,例如网络通信不畅s:/iblog.csdn.nakai46385076

6.2 Pod 重启策略

因为Pod中包含了很多个容器,假设某个容器初选问题了,那么就会触发Pod重启机制

apiversion: v1
kind: Pod
metadata:name: dns-test
spec:containers :- name: busyboximage: busybox : 1.28.4args:- /bin/sh- -c- sleep 36000restartPolicy: Never

重启策略(restartPolicy)主要分为以下三种

  • Always: 当容器终止退出后,总是重启容器,默认策略 【nginx等,需要不断提供服务】
  • OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器。
  • Never: 当容器终止退出,从不重启容器 【批量任务】

七、Pod健康检查

通过容器检查,原来我们使用下面的命令来检查

[root@k8s-master ~]$ kubectl get pods

但是有的时候,程序可能出现了 Java 堆内存溢出,程序还在运行,但是不能对外提供服务了,这个时候就不能通过 容器检查来判断服务是否可用了

这个时候就可以使用应用层面的检查

# 存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy【重启策略】来操作
livenessProbe# 就绪检查,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除
readinessProbe

示例

apiversion: v1
kind: Podmetadata:labels:test: livenessname: liveness-execspec:containers:- name: livenessimage: busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /emp/healthylivenessProbe: #健康检查策略exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5

Probe(livenessProbe)支持以下三种检查方式

  • http Get:发送HTTP请求,返回200 - 400 范围状态码为成功
  • exec:执行Shell命令返回状态码是0为成功
  • tcpSocket:发起TCP Socket建立成功

八、Pod调度策略

8.1 创建Pod流程

  1. 首先创建一个pod,然后创建一个API Server 和 Etcd【把创建出来的信息存储在etcd中】
  2. 然后创建 Scheduler,监控API Server是否有新的Pod,如果有的话,从etcd读取创建的pod,会通过调度算法,把pod调度某个node上
  3. 在node节点,会通过 kubelet --- apiserver 读取etcd 拿到分配在当前node节点上的pod,然后通过docker创建容器

8.2 影响Pod调度的属性

8.2.1 Pod资源限制对Pod的调度会有影响

根据request找到足够node节点进行调度

apiversion:v1
kind: Pod
metadata:name : frontend
spec:containers:- name: dbimage: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: "password"resources: #资源限制部分recuests: #request:表示调度所需的资源memory: "64Mi" #内存cpu:"250m" #cpulimits: #limits:表示最大所占用的资源memory: "128Mi"cpu: "500m"

8.2.2 节点选择器标签影响Pod调度

apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:nodeSelector: #节点选择器env_role: dev  #开发环境
containers:- name: nginximage: nginx:1.15

关于节点选择器,其实就是有两个环境,然后环境之间所用的资源配置不同


我们可以通过以下命令,给我们的节点新增标签,然后节点选择器就会进行调度了

[root@k8s-master ~]$ kubectl label node k8s-node01 env_role=prod
k8s-node01:节点的名字
env_role:标签的名字

8.2.3 节点亲和性

节点亲和性 nodeAffinity 和 之前nodeSelector 基本一样的,根据节点上标签约束来决定Pod调度到哪些节点上

  • 硬亲和性:约束条件必须满足
  • 软亲和性:尝试满足,不保证


支持常用操作符:in(存在)、NotIn(不存在)、Exists(存在)、Gt(大于)、Lt(小于)、DoesNotExists(不存在)

反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等

8.2.4 污点和污点容忍

概述
nodeSelector 和 NodeAffinity,都是Prod调度到某些节点上,属于Pod的属性,是在调度的时候实现的。

Taint 污点:节点不做普通分配调度,是节点属性

应用场景

  • 专用节点【限制ip】
  • 配置特定硬件的节点【固态硬盘】
  • 基于Taint驱逐【在node1不放,在node2放】

查看污点情况

[root@k8s-master ~]$ kubectl describe node k8s-master | grep Taint
Taints:             node-role.kubernetes.io/master:NoSchedule
#NoSchedule值

污点值有三个

  • NoSchedule:一定不被调度
  • PreferNoSchedule:尽量不被调度【也有被调度的几率】
  • NoExecute:不会调度,并且还会驱逐Node已有Pod

为节点添加污点

语法:kubectl taint node [nodeName] key=value:污点的三个值
key:名字随便起
value:yes

示例

#查看污点
[root@k8s-master ~]$ kubectl describe node k8s-node01 | grep Taint
Taints:             <none>#删除一个pod,之前创建的
[root@k8s-master ~]$ kubectl delete deployment nginx#创建一个pod
[root@k8s-master ~]$ kubectl create deployment web --image=nginx
#查看详细信息
[root@k8s-master ~]$ kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
web-5dcb957ccc-9sm2z   1/1     Running   0          60s   10.244.2.6   k8s-node02   <none>           <none>
#分配到了node02节点上了#多创建几个,scale 子命令扩宿容副本集的数量。deployment,资源对象,web 指定资源的名称
[root@k8s-master ~]$ kubectl scale deployment web --replicas=5
NAME                   READY   STATUS    RESTARTS   AGE     IP           NODE         NOMINATED NODE   READINESS GATES
web-5dcb957ccc-9sm2z   1/1     Running   0          5m55s   10.244.2.6   k8s-node02   <none>           <none>
web-5dcb957ccc-bzdtb   1/1     Running   0          25s     10.244.1.4   k8s-node01   <none>           <none>
web-5dcb957ccc-kczbb   1/1     Running   0          25s     10.244.2.8   k8s-node02   <none>           <none>
web-5dcb957ccc-pb7wg   1/1     Running   0          25s     10.244.1.5   k8s-node01   <none>           <none>
web-5dcb957ccc-qjrd8   1/1     Running   0          25s     10.244.2.7   k8s-node02   <none>           <none>
#没有加污点,就会分配不同的节点#为了演示污点,把创建的pod全部删掉
[root@k8s-master ~]$ kubectl delete deployment web#添加污点
[root@k8s-master ~]$ kubectl taint node k8s-node01 env_role=yes:NoSchedule[root@k8s-master ~]$ kubectl describe node k8s-node01 | grep Taint
Taints:             env_role=yes:NoSchedule#创建一个pod
[root@k8s-master ~]$ kubectl create deployment web --image=nginx
#查看详细信息
[root@k8s-master ~]$ kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
web-5dcb957ccc-9sm2z   1/1     Running   0          60s   10.244.2.6   k8s-node02   <none>           <none>
#分配到了node02节点上了#多创建几个,scale 子命令扩宿容副本集的数量。deployment,资源对象,web 指定资源的名称
[root@k8s-master ~]$ kubectl scale deployment web --replicas=5
NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
web-5dcb957ccc-4pr6j   1/1     Running   0          27s   10.244.2.10   k8s-node02   <none>           <none>
web-5dcb957ccc-h5sp2   1/1     Running   0          27s   10.244.2.12   k8s-node02   <none>           <none>
web-5dcb957ccc-q2bdz   1/1     Running   0          58s   10.244.2.9    k8s-node02   <none>           <none>
web-5dcb957ccc-vqpnf   1/1     Running   0          27s   10.244.2.11   k8s-node02   <none>           <none>
web-5dcb957ccc-wbr44   1/1     Running   0          27s   10.244.2.13   k8s-node02   <none>           <none>
#全部分配到了node02节点上面#删除污点
[root@k8s-master ~]$ kubectl taint node k8s-node01 env_role:NoSchedule-

污点容忍

污点容忍就是某个节点可能被调度,也可能不被调度

6、kubernetes 核心技术-Pod相关推荐

  1. 【搞定K8S】第2天3:kubernetes 核心技术-Pod

    1.Pod 概述 Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展 ...

  2. 深入分析Kubernetes Critical Pod(二)

    深入分析Kubernetes Critical Pod(一)介绍了Scheduler对Critical Pod的处理逻辑,下面我们再看下Kubelet Eviction Manager对Critica ...

  3. Kubernetes中Pod生命周期

    在 Kubernetes中Pod是容器管理的最小单位, 有着各种各样的Pod管理器. 那么一个Pod从启动到释放, 在这期间经历了哪些过程呢? Pod自开始创建, 到正常运行, 再到释放, 其时间跨度 ...

  4. 容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍

    容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍 1 介绍 2 怎样获取 DNS 名字? 3 支持的 DNS 模式 3.1 Service 3.1.1 A 记录 3. ...

  5. 容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级

    容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级 1 Before you begin 2 QoS 等级 3 创建一个命名空间 4 创建一个 Pod 并分配 QoS 等级为 Gu ...

  6. Kubernetes之Pod调度

    本文讲的是Kubernetes之Pod调度[编者的话]Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上.在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度po ...

  7. 4 Kubernetes资源-Pod控制器(2)

    4 Kubernetes资源-Pod控制器(2) 4.3 DaemonSet DaemonSet确保Pod在所有Node节点运行一个副本,当有Node节点添加时会自动在新的节点创建Pod.常用于每个N ...

  8. 4 Kubernetes资源-Pod控制器(1)

    4 Kubernetes资源-Pod控制器(1) Kubernetes中Pod分为自主式和控制器管理式: YAML指定类型为Pod的均为自主式,此类Pod退出后不会被创建: YMAL指定类型为Repl ...

  9. Kubernetes中pod分类、核心组件、网络模型及kubectl命令使用

    文章目录 Kubernetes中pod分类.核心组件.网络模型及kubectl命令使用 1.k8s中pod分类 2.核心组件 3.网络模型 4.kubectl常用命令使用 Kubernetes中pod ...

最新文章

  1. 为什么不要用uuid做主键
  2. 10分钟搞定 Java 并发队列
  3. JAVA面试题(part3)--if条件语句
  4. vc++出现warningC4819的处理方法
  5. html5 php idea,五个HTML5新特性
  6. html页面foot,HTML tfoot用法及代码示例
  7. 开发环境与工具部署服务_开发与部署之间的区别
  8. java并发AtomicIntegerFieldUpdater
  9. window下启动Redis闪退问题解决
  10. 该如何缓解网卡的普遍问题?
  11. VS2017 启动调试出现 无法启动程序“http://localhost:15613” 操作在当前状态中是非法的。 同时附加进程也是错误的解决方法
  12. Sklearn——Sklearn的介绍与安装
  13. 1.6 logistic回归的keras实现
  14. Python使用matplotlib可视化模拟学生成绩饼图
  15. 名词解释——元数据和数据字典
  16. Windows 7集成IE11(离线安装包、补丁)
  17. C# 使用Microsoft Speech朗读文本
  18. wpf ui分析工具 Snoop
  19. Mysql-04-DQL-基础查询-条件查询-模糊查询-UNION和UNION ALL-排序-数量限制-分组查询-子查询
  20. 华为充电的效果_华为充电特效主题插件下载-华为炫酷充电特效插件1.0.1安卓版-精品下载...

热门文章

  1. R卡方检验(CHI-SQUARE TEST)
  2. seaborn+画图+EDA
  3. pandas常用函数说明及速查表
  4. Bert需要理解的一些内容
  5. 中国科学技术大学研究生基因组学考试复习提要
  6. 转录组背景、环境设置(目录管理)
  7. 试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数
  8. python随机选取列表中的一个字符串_如何从Python中的列表中选择随机字符串?
  9. JAVA基础3-选择语句
  10. STM32核心板电路分析