工作负载型

工作负载型

image-20240317133108755

Pod

Pod(容器组)是 Kubernetes 中最小的可部署单元。一个 Pod(容器组)包含了一个应用程序容器(某些情况下是多个容器)、存储资源、一个唯一的网络
IP 地址、以及一些确定容器该如何运行的选项。Pod 容器组代表了 Kubernetes 中一个独立的应用程序运行实例,该实例可能由单个容器或者几个紧耦合在一起的容器组成。

Docker 是 Kubernetes Pod 中使用最广泛的容器引擎;Kubernetes Pod 同时也支持其他类型的容器引擎。
Kubernetes 集群中的 Pod 存在如下两种使用途径:

  • 一个 Pod 中只运行一个容器。“one-container-per-pod” 是 Kubernetes 中最常见的使用方式。此时,您可以认为 Pod 容器组是该容器的
    wrapper,Kubernetes 通过 Pod 管理容器,而不是直接管理容器。
  • 一个 Pod 中运行多个需要互相协作的容器。您可以将多个紧密耦合、共享资源且始终在一起运行的容器编排在同一个 Pod 中,可能的情况有:
1967881-d8ad2d0b00198509

副本(replicas)

image-20240317141550530

先引入“副本”的概念——一个 Pod 可以被复制成多份,每一份可被称之为一个“副本”,这些“副本”除了一些描述性的信息(Pod 的名字、uid
等)不一样以外,其它信息都是一样的,譬如 Pod 内部的容器、容器数量、容器里面运行的应用等的这些信息都是一样的,这些副本提供同样的功能。

Pod 的控制器通常包含一个名为 “replicas” 的属性。“replicas”属性则指定了特定 Pod 的副本的数量,当当前集群中该 Pod
的数量与该属性指定的值不一致时,k8s 会采取一些策略去使得当前状态满足配置的要求。

控制器

适用于无状态服务

image-20240317142058890

  1. ReplicationController(RC)

    Replication Controller 简称 RC,RC 是 Kubernetes 系统中的核心概念之一,简单来说,RC 可以保证在任意时间运行 Pod
    的副本数量,能够保证 Pod 总是可用的。如果实际 Pod 数量比指定的多那就结束掉多余的,如果实际数量比指定的少就新启动一些Pod,当
    Pod 失败、被删除或者挂掉后,RC 都会去自动创建新的 Pod 来保证副本数量,所以即使只有一个 Pod,我们也应该使用 RC 来管理我们的
    Pod。可以说,通过 ReplicationController,Kubernetes 实现了 Pod 的高可用性。

  2. ReplicaSet(RS)RC (ReplicationController )

    主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数 。即如果有容器异常退出,会自动创建新的 Pod
    来替代;而如果异常多出来的容器也会自动回收(已经成为过去时),在 v1.11 版本废弃。

    Kubernetes 官方建议使用 RS(ReplicaSet ) 替代 RC (ReplicationController ) 进行部署,RS 跟 RC 没有本质的不同,只是名字不一样,并且
    RS 支持集合式的 selector。

    **label (标签)**是附加到 Kubernetes 对象(比如 Pods)上的键值对,用于区分对象(比如Pod、Service)。

    label 旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。 label 可以用于组织和选择对象的子集。label
    可以在创建时附加到对象,随后可以随时添加和修改。可以像 namespace 一样,使用 label 来获取某类对象,但 label 可以与
    selector 一起配合使用,用表达式对条件加以限制,实现更精确、更灵活的资源查找。

    label 与 selector 配合,可以实现对象的“关联”,“Pod 控制器” 与 Pod 是相关联的 —— “Pod 控制器”依赖于 Pod,可以给 Pod 设置
    label,然后给“控制器”设置对应的 selector,这就实现了对象的关联。

  3. Deployment

    Deployment 为 Pod 和 Replica Set 提供声明式更新。

    你只需要在 Deployment 中描述你想要的目标状态是什么,Deployment controller 就会帮你将 Pod 和 Replica Set
    的实际状态改变到你的目标状态。你可以定义一个全新的 Deployment,也可以创建一个新的替换旧的 Deployment。

image-20240317142148265

  • 创建 Replica Set / Pod
  • 滚动升级/回滚
  • 平滑扩容和缩容
  • 暂停与恢复 Deployment
适用有状态服务(StatefulSet)

StatefulSet 中每个 Pod 的 DNS 格式为 statefulSetName-{0…N-1}.serviceName.namespace.svc.cluster.local

  • serviceName 为 Headless Service 的名字
  • 0…N-1 为 Pod 所在的序号,从 0 开始到 N-1
  • statefulSetName 为 StatefulSet 的名字
  • namespace 为服务所在的 namespace,Headless Servic 和 StatefulSet 必须在相同的 namespace
  • .cluster.local 为 Cluster Domain

image-20240317143004407

  1. 主要特点

    1. 稳定的持久化存储

      即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现

    2. 稳定的网络标志

      稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service(即没有 Cluster IP 的
      Service)来实现

    3. 有序部署,有序扩张

      有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从 0到 N-1,在下一个Pod
      运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现

    4. 有序收缩,有序删除

      有序收缩,有序删除(即从 N-1 到 0)

  2. 组成

    1. Headless Service

      用于定义网络标志(DNS domain)

      Domain Name Server:域名服务
      将域名与 ip 绑定映射关系

      服务名 => 访问路径(域名) => ip

      1. volumeClaimTemplate

      用于创建 PersistentVolumes

  3. 注意事项

    1. kubernetes v1.5 版本以上才支持
    2. 所有Pod的Volume必须使用PersistentVolume或者是管理员事先创建好
    3. 为了保证数据安全,删除StatefulSet时不会删除Volume
    4. StatefulSet 需要一个 Headless Service 来定义 DNS domain,需要在 StatefulSet 之前创建好
守护进程 DaemonSet

image-20240317152316483

DaemonSet 保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:

  • 日志收集,比如 fluentd,logstash 等
  • 系统监控,比如 Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等
  • 系统程序,比如 kube-proxy, kube-dns, glusterd, ceph 等
任务/定时任务
  • Job

    一次性任务,运行完成后Pod销毁,不再重新启动新容器。

  • CronJob

    CronJob 是在 Job 基础上加上了定时功能。