kubernetes 核心技术-Pod

kubernetes 核心技术-Pod

  • Pod 概述
  • Pod存在的意义
  • Pod实现机制
    • 共享网络
    • 共享存储
  • 镜像拉取策略
  • POD资源限制
  • Pod重启机制
  • Pod健康检查
  • Pod调度策略
    • 影响调度的属性
      • Pod资源限制
      • 节点选择器标签
      • 节点亲和性
      • 污点和污点容忍

Pod 概述

  1. Pod 是 k8s 系统中可以创建和管理的最小单元(注意这里不是容器), 是资源对象模型中由用户创建或部署的最小资源对象模型, 也是在 k8s 上运行容器化应用的资源对象, 其他的资源对象都是用来支撑或者扩展 Pod 对象功能的, 比如控制器对象是用来管控 Pod 对象的, Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的, PersistentVolume 资源对象是用来为 Pod提供存储等等。
  2. k8s 不会直接处理容器, 而是 Pod, Pod 是由一个或多个 container 组成,Pod是一组容器的集合。
  3. 一个Pod容器共享网络命名空间。
  4. Pod是短暂的。重启IP是不唯一的。

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

Pod存在的意义

  1. 创建容器使用docker,一个docker对应一个容器,一个容器有一个守护进程,一个容器运行一个应用程序(可以运行多个,但父进程挂了不好管理)。
  2. Pod是多进程设计,运行多个应用程序。一个Pod有多个容器,一个容器里运行一个应用程序。
  3. Pod存在是为了服务亲密性产品的。比如一个pod有两个应用,应用内部网络优先调用。两个应用需要频繁调用。

Pod实现机制

共享网络

容器本身之间是相互隔离的(用linux的namespace和group隔离),多个容器共享同一 network namespace, 由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace, 所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。 不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之前通信, 不可以使用 IPC( 如果没有特殊指定的话) 通信, 通常情况下使用 Pod的 IP 进行通信。pause根容器也叫info容器。通过pause容器,把其他业务容器加入到Pause容器里,让所有业务容器在同一个名称空间中,可以实现网络共享。
kubernetes 核心技术-Pod_第3张图片

共享存储

一个 Pod 里的多个容器可以共享存储卷, 这个存储卷会被定义为 Pod 的一部分, 并且可以挂载到该 Pod 里的所有容器的文件系统上。
在Pod里进行持久化数据,包括日志数据和业务数据。下面是持久化数据卷的流程。
kubernetes 核心技术-Pod_第4张图片
下面是一个写,一个读。挂在在同一个目录下。
kubernetes 核心技术-Pod_第5张图片

镜像拉取策略

kubernetes 核心技术-Pod_第6张图片

POD资源限制

kubernetes 核心技术-Pod_第7张图片
Pod资源限制示例:
kubernetes 核心技术-Pod_第8张图片

Pod重启机制

Pod 的重启策略包括 Always、 OnFailure 和 Never, 默认值是 Always。 OnFailure 和 Never主要在批量任务时开启。
kubernetes 核心技术-Pod_第9张图片

Pod健康检查

一般可以通过kebectl get pods,但不能检查容器的实际状态。比如Java中的堆内存溢出,应用在运行但是不能正常提供服务。可以在应用层面进行健康检查。
kubernetes 核心技术-Pod_第10张图片

Pod调度策略

通过kubectl get pods -o wide查看Pod状态。

  1. createpod ->在master中调用apiserver->将信息填写到etcd。
  2. scheduler -> 监控apiserver是否有createpod,通过etcd读取pod,通过调度算法将Pod调度到某个node节点上。
  3. 下面在node上操作。
  4. 通过kubelet访问apiserver,读取etcd拿到分配给当前节点pod->docker创建容器。

kubernetes 核心技术-Pod_第11张图片

影响调度的属性

主要包括Pod资源限制、节点选择器标签、节点亲和性和污点和污点容忍。

Pod资源限制

kubernetes 核心技术-Pod_第12张图片

节点选择器标签

节点选择环境。所以我们首先得给节点打个标签。

kubectl label node node1 env_role=dev #为node1节点为dev。
kubectl get nodes node1 --show-labels #查看标签

kubernetes 核心技术-Pod_第13张图片

节点亲和性

节点亲和性:nodeAffinity和之前的nodeSelector基本一样,根据节点上标签约束来绝对Pod调度到哪些节点上。nodeAffinity功能更加强大。
(1)硬亲和性
kubernetes 核心技术-Pod_第14张图片

(2)软亲和性

kubernetes 核心技术-Pod_第15张图片

(3)支持常用操作符
IN, NotIn,Exists, Gt, Lt,DoesNotExists(反亲和性)。

污点和污点容忍

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

  1. 场景
    (1)专用节点
    (2)配置特点硬件节点
    (3)基于Taint驱逐
  2. 具体演示
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- #删除污点

先测试发现会分配到两个节点。
kubernetes 核心技术-Pod_第16张图片
创建污点后只调度到node2。
kubernetes 核心技术-Pod_第17张图片
3. 污点容忍
kubernetes 核心技术-Pod_第18张图片

你可能感兴趣的:(k8s)