Kubernetes 有各种资源对象来描述整个集群的运行状态。这些对象都须要经过调用 kubernetes api 来进行建立、修改、删除,能够经过 kubectl 命令工具,也能够直接调用 k8s api,或者使用对象语言的客户端库(例如:golang , pythion )。python
每一个 kubernetes 对象都会包含两个关键字段:Object Spec 和 Object Status。spec 描述了对象所指望达到的状态,status 描述了该对象的实际状态。git
下面会宽泛的介绍一些 Kubernetes 的核心概念,便于初步的理解它们特征及工做模式。github
Pod 是 Kubernetes 最小的调度单元,能够由一个或者多个容器组成。golang
Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,能够经过进程间通讯和文件共享这种简单高效的方式组合完成服务。docker
Pod 的特征:api
kubernetes v1.8+ 且 docker >= 1.13.1 才支持容器之间共享
PID
namespace,还须要配置 kubelet —docker-disable-shared-pid=false
Labels 是 Key-Value 对,k8s 用于标识其全部资源;而 Selectors 是标签选择器,用于选择特定 labels 的资源。网络
Selectors 目前支持两种选择器:Equality-based(基于平等) 和 Set-based(基于集合)。app
1. Equality-based负载均衡
基于相等的或者不想等的条件用标签的 keys 和 values 进行过滤。支持三种运算符:“=”,“==” 和 “!=”。还可使用逗号操做符,链接多个运算符。
2. Set-based
Set-based 的选择器容许用一组 value 来过滤 key。
支持三种操做符:in,notin 和 exists(仅针对于 key 符号)。
例如:
env in (dev, test, staging, prod) env notin (staging, prod) partition !partition
Set-based 能够和 Equality-based 条件结合使用。
Kubernetes 有几个版本的副本控制器,好比 Replication Controller、Replica Set(RC 升级版)和 Deployments。
Deployment 是逻辑层的一种抽象,为 Pod 和 ReplicaSet 提供了一种声明式定义,来代替之前的 Replication Controller 更方便的管理应用。
在 Kubernetes 的实际使用中,RS 也属于底层概念,由 Deployment 来管理,所以用户通常都是与 Deployment 打交道。
Deployment 有几种 典型的应用场景
,好比:
RC、RS、Deployment 等对象都是为了解决无状态服务而设计,下面还会针对有状态服务,介绍对应的对象。
Kubernetes Pod 有本身的生命周期,能够随时被建立和销毁,而一旦销毁就永远结束了。而每一个 Pods 都有本身的 IP,而 Pod 的生命周期也意味着 这些 IP 地址不老是稳定可靠的。因此须要有针对容器的服务发现与负载均衡机制,来访问这个 Pod 逻辑分组。
service 是对一组提供相同功能的 Pods 集合的抽象,为这组Pods提供统一的访问入口。借助 Service 能够方便的实现服务发现与负载均衡,并实现应用的零宕机升级。
在 Kubernetes 集群中,每一个 Node 都会部署一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP (虚 IP)。
Service 有四种类型:
NodeIP:NodePort
进行服务访问。一般状况下,Service 和 Pod 仅支持在集群内部进行服务访问。而 Ingress 能够提供外部服务可访问的 URL / 负载均衡器等。
Ingress 对象只是配置了一些规则,若要实现集群外部的访问,还须要部署一个 Ingress Controller
,它会从 kube-apiserver 监听 Ingress 和 Service 的变动,并根据 Ingress 的规则配置负载均衡来提供访问入口。
Job 负责批量处理短暂的一次性任务,仅执行一次,并保证处理的一个或者多个Pod成功结束。
具体的能够查看:深刻K8S Job(一):介绍
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供网络存储资源,而 PVC 请求存储资源。这样,设置持久化的工做流包括配置底层文件系统或者云数据卷、建立持久性数据卷、最后建立 PVC 来将 Pod 跟数据卷关联起来。PV 和 PVC 能够将 pod 和数据卷解耦,pod 不须要知道确切的文件系统或者支持它的持久化引擎。
PV 也是集群的资源(等同于cpu / mem),但不一样于 pod volume,它是独立于 Pod 的生命周期。
支持类别划分,好比不一样的服务质量级别(SSD / SATA),不一样的备份策略等。
支持动态 PV(StorageClass)。
支持卷的扩容及快照(v1.8+ 特性)。
支持 Local Volume,容许将 Node 本地的磁盘、分区或者目录做为持久化存储使用。可是须要注意该模式不支持动态建立,使用前须要预先建立好 PV。
PV 是存储资源,而 PVC 是对 PV 的请求。PVC 和 Pod 相似,Pod 消费 Node 资源,而 PVC 消费 PV 资源;Pod 可以请求 CPU 和内存资源,而 PVC 请求特定大小和访问模式的数据卷。
StatefulSet 用于支持部署有状态服务,而有状态的服务很关键的就是持久化存储,这就依赖上面介绍的 PV & PVC 了。
StatefulSet 的应用场景包括:
参考案例:Running ZooKeeper, A Distributed System Coordinator - Kubernetes
- 推荐在 k8s v1.9 + 的版本使用 statefulSet。
- 为了保证数据安全,删除 StatefulSet 是不会删除 PV 的,须要考虑清理策略。
- StatefulSet 须要提早建立一个 Headless Service 来定义 DNS domain。
还有不少别的资源对象,这里暂不一一介绍了,由于涉及的篇幅会比较长。
对于上面或者未说起的资源对象须要多了解一下的,建议查阅官方文档。
好比: