pod
Pod 是 kubernetes 中你可以创建和部署的最小也是最简的单位。Pod 代表着集群中运行的进程。
Pod 中可以共享两种资源:网络和存储。
当 Pod 被创建后(不论是由你直接创建还是被其他 Controller),都会被 Kubernetes 调度到集群的 Node 上。
直到 Pod 的进程终止、被删掉、因为缺少资源而被驱逐、或者 Node 故障之前这个 Pod 都会一直保持在那个 Node 上。
注意:重启 Pod 中的容器跟重启 Pod 不是一回事。Pod 只提供容器的运行环境并保持容器的运行状态,重启容器不会造成 Pod 重启。
Pod 不会自愈。如果 Pod 运行的 Node 故障,或者是调度器本身故障,这个 Pod 就会被删除。
同样的,如果 Pod 所在 Node 缺少资源或者 Pod 处于维护状态,Pod 也会被驱逐。
Kubernetes 使用更高级的称为 Controller 的抽象层,来管理 Pod 实例。虽然可以直接使用 Pod,但是在 Kubernetes 中通常是使用 Controller 来管理 Pod 的。
- Pod 和 Controller
Controller 可以创建和管理多个 Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个 Node 故障,Controller 就能自动将该节点上的 Pod 调度到其他健康的 Node 上。
包含一个或者多个 Pod 的 Controller 示例:
集群资源管理
Kubernetes 中提供了很多集群管理的配置和管理功能,通过 namespace 划分的空间,通过为 node 节点创建 label 和 taint 用于 pod 的调度等。
- Node
Node 是 Kubernetes 集群的工作节点,可以是物理机也可以是虚拟机。
Node 的状态
- Address
HostName:可以被 kubelet 中的 –hostname-override 参数替代。
ExternalIP:可以被集群外部路由到的 IP 地址。
InternalIP:集群内部使用的 IP,集群外部无法访问。 - Condition
OutOfDisk:磁盘空间不足时为 True
Ready:Node controller 40 秒内没有收到 node 的状态报告为 Unknown,健康为 True,否则为 False。
MemoryPressure:当 node 有内存压力时为 True,否则为 False。
DiskPressure:当 node 有磁盘压力时为 True,否则为 False。 - Capacity
CPU
内存
可运行的最大 Pod 个数 - Info:节点的一些版本信息,如 OS、kubernetes、docker 等
- Namespace
在一个 Kubernetes 集群中可以使用 namespace 创建多个 “虚拟集群”,这些 namespace 之间可以完全隔离,
也可以通过某种方式,让一个 namespace 中的 service 可以访问到其他的 namespace 中的服务
获取集群中有哪些:kubectl get ns
集群中默认会有 default 和 kube-system 这两个 namespace
用户的普通应用默认是在 default 下,与集群管理相关的为整个集群提供服务的应用一般部署在 kube-system 的 namespace 下,例如我们在安装 kubernetes 集群时部署的 kubedns、heapseter、EFK 等都是在这个 namespace 下面
控制器
Kubernetes 中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod 的具体状态和行为
Deployment 无状态服务
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的 ReplicationController 来方便的管理应用。典型的应用场景包括:
定义 Deployment 来创建 Pod 和 ReplicaSet
滚动升级和回滚应用
扩容和缩容
暂停和继续 DeploymentStatefulSet 有状态服务
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
- 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
- 有序收缩,有序删除(即从N-1到0)
DaemonSet
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。
当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
使用 DaemonSet 的一些典型用法:
运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph。
在每个 Node 上运行日志收集 daemon,例如fluentd、logstash。
在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond。Job
Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。CronJob
Cron Job 管理基于时间的 Job,即:
在给定时间点只运行一次
周期性地在给定时间点运行
服务发现与路由
Kubernetes 中为了实现服务实例间的负载均衡和不同服务间的服务发现,创造了 Serivce 对象,同时又为从集群外部访问集群创建了 Ingress 对象。
- Service