API 对象
API 对象是 k8s 集群中的管理操作单元。k8s 集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的 API 对象,用于对该功能的管理操作。例如:副本集 Replica Set 对应的 API 对象是 RS。
每个 API 对象都有 3 大类属性:
- 元数据 metadata :元数据是用来标识 API 对象的,每个对象都至少有 3 个元数据:
- namespace:用来标识该 api 对象 是在哪个 namespace 下
- name:为该 api 对象起一个名字
- uid: k8s 自动为对象生成的,可以唯一标识该对象的字符串
- 除此之外,还有各种各样的标签 label 用来 env=testing、env=production 来标识开发、测试、生产的不同服务
k8s 中的 namespace 就类似于 windows 中的多个桌面,或者 linux 中的多个终端;namespace 之间的 api 对象是不可见的。只有在同一个 namespace 中的 api 对象,才能互相可见。
- 规格 spec
- spec 描述了用户期望 k8s 集群中分布式系统达到的理想状态(Desired State),例如用户可以通过复制控制器 Replication Controller 可以在 spec 中设置期望的 Pod 副本数为 3;
k8s 中所有的配置都是通过 API 对象的 spec 去设置的,也就是用户通过配置系统的理想状态来改变系统,这是 k8s 重要设计理念之一:所有的操作都是声明式的而不是命令式的。
上一篇文章中写 声明式与命令式的区别是也写过:声明式操作在分布式系统中的好处是稳定,不怕丢操作或运行多次,例如设置副本数为 3 的操作运行多次也还是一个结果,而给副本数 +1 的操作就不是声明式的,运行多次结果就错了。
- 状态 status
- status 描述了系统实际当前达到的状态(Status),例如系统当前实际的 Pod 副本数为 2;那么复制控制器就会自动启动新的 Pod,争取达到副本数为 3。
常用的 api 对象
1. Pod
k8s 有很多技术概念,对应很多 API 对象。但是 k8s 中最重要的也最基础的是微服务 Pod。
Pod 是在 k8s 集群中运行部署应用或服务的最小单元,它支持多容器运行。
pod 的设计理念是支持多个容器在一个 pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
pod 对多容器的支持是 k8s 最基础的设计理念。
pod 是 k8s 集群中所有业务类型的基础,可以看作是运行在 k8s 集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。
目前 k8s 中业务可以分为
- 长期伺服型(long-running) —— Deployment
- 批处理型(batch)—— Job
- 节点后台支撑型(node-daemon)—— DaemonSet
- 有状态应用型(stateful application)—— PetSet
2. 复制控制器(Replication Controller ,RC)
目前 k8s 最新版本已弃用,被 RS 所代替。
RC 是 k8s 集群中最早的保证 pod 高可用的 api 对象。通过监控运行中的 pod 来保证集群中运行指定数目的 pod 副本。
指定的数目可以是多个也可以是 1 个;少于指定数目,RC 就会启动运行新的 pod 副本;多于指定数目,RC 就会杀死多余的 pod 副本。
即使在指定数目为 1 的情况下,通过 RC 运行 pod 也比直接运行 pod 更明智,因为 RC 也可以发挥它高可用的能力,保证永远有 1 个 pod 在运行。 RC 是 k8s 较早期的技术概念,只适用于长期伺服的业务类型。
3. 副本集(Replica Set, RS)
RS 是新一代 RC,提供同样的高可用能力, RS 较于 RC 的优势,在于 RS 能支持更多种类的匹配模式。
副本集对象一般不单独使用,而是作为 Deployment 的离线状态使用。
4. 服务(Service)
RC、RS 和 Deployment 只是保证了支撑服务 pod 的数量,但是没有解决如何访问这些服务的问题。
一个 pod 只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的 ip 启动一个新的 pod,因此不能以确定的 ip 和端口号提供服务。因此 k8s 有要稳定地提供服务需要服务发现和负载均衡能力。
服务发现: 新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
服务发现的工作:针对客户端访问的服务,可以找到对应的后端服务实例。
在 k8s 集群中,服务发现是有 servcie 实现的,客户端需要访问的服务是 service 服务,每个 service 会对应一个集群内部有效的虚拟 ip。
在 k8s 集群中,微服务的负载均衡是由 kube-proxy 实现的。 kube-proxy 是 k8s 内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个。
END
未完待续...