Pods

2022/4/10 k8sDevops

# 1.pod的基本概念

  • pod是一个抽象容器运行环境的概念
  • k8s集群中的最小部署单元
  • pod是由一个或多个container的集合
  • 一个pod中的容器共享网络命名空间
  • pod是短暂的
  • 每个pod都有一个特殊的被称为"根容器"的Pause容器Pause容器对应的镜像属于 kubernetes平台的一部分,除了根容器,每个Pod还包含一个或多个紧密相关的用户业务容器

pod的基本概念

# 2.pod存在的意义

  1. 首先容器的"单进程模型",并不是指容器里只能运行"一个"进程,而是指容器没有管理多个进程的能力。这是因为容器里的主进程(PID=1 的进程)就是应用本身,其他的进程都是这个主进程的子进程。可是,用户编写的应用,并不能够像正常操作系统里的init进程或者systemd 那样拥有进程管理的功能。比如,你的容器启动命令是执行一个shell脚本,脚本里依次启动容器里的Nginx和Web应用。
  • 比如是下面这个shell脚本:
sudo su -root -c "nginx -s start && /app/go_web_bin"
1

那么这个容器里主进程是sh,Nginx和Web应用是子进程。可是,当这个 Nginx进程异常退出的时候,主进程sh是感知不到的,也就没法对Nginx进行重启。Docker只能识别主进程的状态,如果主进程正常,Docker的状态就是Running所以在容器里不推荐跑多个进程。所以更确切的说法是每个容器应该只有一个关注点,只有一个单一的功能。将应用程序解耦到多个容器中,可以更轻松地水平缩扩和重复使用容器。例如,一个Web应用程序服务可能由三个单独的容器组成,每个容器都有自己的镜像,以松耦合的方式管理Web应用程序,数据库和Redis缓存。对于这些相互依赖的容器,则使用Docker容器网络来保持这些容器的通信。

  1. pod是“多进程模式”设计,可运行多个应用程序
  • 一个pod有多个容器,一个容器里面运行一个应用程序
  1. pod存在是为了亲密性应用
  • 两个应用之间进行交互
  • 网络之前的调用
  • 两个应用需要频繁调用

除了 Docker 之外,Kubernetes 支持 很多其他容器运行时, Docker 是最有名的运行时。 使用 Docker 的术语来描述 Pod 会比较好理解

# 3.Pod实现机制

# 3.1共享网络

  • 容器本身之间是相互隔离的(namespace CGroup 来实现的)
  • 前提条件---- 让容器在同一个 ns 中
  • pod如何实现共享网络机制
    • 首先创建 pause 容器 也可以叫 info容器
    • 在info容器中会独立出 ip mac port
    • 创建业务容器时会把业务容器加入到info容器中,

图示

# 3.2共享存储

  • 需要了解一个 volumes: 挂载(数据)卷的概念

  • pod持久化数据

    • 日志数据
    • 业务数据
  • 使用数据卷进行持久化数据存储 图示

  • pod重启机制 图示

# 4.pod健康检测 probe(探针)

图示

# 5.pod调度策略

图示

kubectl create -f  xxx.yaml

kubectl apply  -f xxx.yaml
1
2
3

create是创建新的pod,并且相同yaml只能执行一次。 apply也是创建,但它的创建是有就更新,没有就新建,可以多次执行

# 6.资源限制对调度的影响

  • pod资源限制对pod调度产生影响

图示

  • 节点选择器 标签影响pod调度

nodeSelector

kubectl  label node nodeName  env-role=prod
1

图示

  • 节点亲和性,nodeAffinity 对pod调度的影响

图示

  • 反亲和性

可以用操作符 NotIn DoesNotExists 来实现,与亲和性相反

  • 污点和污点容忍 taint

图示

Last Updated: 2022/8/12 下午10:21:19