发展历程

image.png

容器概念

容器

特点

  • 独立的文件系统 - chroot
  • 控制资源使用率 - cgroup [PID_Namespace、IPC_Namespace、Mount_Namespace、Network_Namesapce、UTS_Namespace]
  • 资源视图隔离 - namesapce

    容器是一个视图隔离、资源可限制、独立文件系统的进程集合

镜像

运行容器所需要的所有文件集合-容器镜像

Dockerfile - 描述镜像构建步骤

构建步骤所产生出文件系统的变化 - changeset

changeset具备分层复用特点

生命周期

单进程模型

  1. Init进程生命周期 = 容器生命周期
  2. 运行期间可运行exec执行运维操作

    数据持久化

  3. 独立于容器生命周期

  4. 数据卷 - docker volume vs bind

容器项目的架构

moby容器引擎架构

containerd

Containerd 是一个工业级标准(OCI(Open Container Initiative))的容器运行时,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等

  1. 容器运行时管理引擎,独立于moby daemon
  2. containerd-shim管理容器生命周期,可被containerd动态接管

容器运行时

  1. 容器虚拟化技术方案
  2. runC kata gVisor

DOCKER & K8S概念 - 图2


kuberneters基本概念

master

负责集群的管理调度工作

  • API Server(组件之间链接的依赖)
  • Controller(对集群状态的管理、扩张、修复等)
  • Scheduler(完成容器在集群内的调度、分配)
  • etcd(高可用存储系统、存储API Server所需的集群原信息)

Node

运行集群业务负载的组件

Pod

最小的调度及资源单元、由一个或多个容器组成、定义容器运行的方式、提供容器共享网络、进程空间等

静态Pod

静态Pod有kubelet进行管理,仅存在特定的Node上的Pod。不能通过API Server进行管理,无法与ReplicationController、Deployment或者DaemonSet进行关联,并且kubelet也无法对它们进行健康检查。静态Pod总是由kubelet进行创建,并且总是在kubelet所在的Node上运行。

Pod的调度
  • 定向调度

通过Master上的Scheduler服务实现Pod的调度工作,为Node打定标签后,可通过Pod的nodeSelector属性匹配调度到指定Node

  • 亲和性调度

不同于Label的精确匹配,NodeAffinity亲和性

Kubelet

在Api Server获取Pod运行状态,通过Container Runtime、Storage Plugin、Network Plugin、Kube-proxy 在Node 的 OS上创建容器运行所需的资源、环境

Volume

  • 声明在Pod中的容器可访问的文件目录
  • 可以被挂载在Pod中一个(或者多个)容器的指定路径下
  • 支持多种后端存储的抽象
    • 本地存储、分布式存储、云存储

Deployment

  • 定义一组Pod的副本数目、版本等
  • 通过控制器(Controller)维持Pod的数目
    • 自动恢复失败的Pod
  • 通过控制器以指定的策略控制版本
    • 滚动升级、重新生成、回滚等

Service

  • 提供访问一个或多个Pod实例的稳定访问地址
  • 支持多种访问方式实现
    • ClusterIP
    • NodePort
    • LoadBalancer

IP

  • Node IP: Node 节点IP地址,集群节点中的物理网卡IP地址
  • Pod IP : Pod的IP地址,Docker Engine根据docker0网桥的IP地址段进行分配,通常是虚拟的二层网络,Pod之间通信在一个广播域内通过MAC地址进行报文交换
  • Cluster IPService的IP地址,由Kubernetes管理分配,每个Node运行一个kube-proxy负责为Service实现一种VIP
    1. iptables代理模式
    2. IPVS代理模式
    3. Userspace代理模式

Namespace

Namesapce在很多情况下用于多租户资源隔离,#kubectl get默认显示“default”命令空间的资源对象。可针对Namesapce进行资源配额管理

  • 一个集群内部的逻辑隔离机制(鉴权、资源额度)
  • 每个资源都属于一个Namespace
  • 同一个Namespace中的资源命名唯一
  • 不通Namesapce中的资源可重名

API

HTTP + JSON/YAML的格式呈现,通过kubectl、UI、curl 访问控制

API-Label

  • 一组Key:Value
  • 可以被selector所查询
    • select color = red
  • 资源集合的默认表达形式

    • 例如Service对应的一组Pod

      Annotation

      与Label类似,使用key/value键值对的形式进行定义。
      不同的是Label拥有严格的命名规则,用于Label Selector。Annotation则用于定义“附加”信息。比如
  • build信息、Docker镜像信息、时间戳

  • 日志库、监控库、分析库等
  • 程序调试信息
  • 团队联系信息

Pod & 容器设计

两种设计模式

  • initContainer
    • Init Container 会比用户容器先启动,并且严格按照定义顺序来依次执行
  • Sidecar

应用存储和持久化数据卷

核心知识

存储快照与拓扑调度 snapshot & Topolopy

  • 动态生成