(四)ReplicaSet
ReplicaSet 基础了解
ReplicaSet 是副本集的意思,一种管理 Pod 的对象,跟 Deployment 一样,可以守护 Pod,保证 Pod 挂了后能够恢复
当我们创建一个 Delpoyment 时,Delpoyment 会自动创建一个 ReplicaSet ,为我们维护 Pod 实例的数量
使用 Deployment 部署 Pod,当 Pod 或所在节点出现故障时,Deployment 会自动创建新的 Pod
kubectl get deployments

- NAME 列出了集群中 Deployment 的名称
- READY 显示应用程序的可用的 副本 数,显示的模式是 "就绪个数/期望个数"
- UP-TO-DATE 显示为了达到期望状态已经更新的副本数
- AVAILABLE 显示应用可供用户使用的副本数
- AGE 显示应用程序运行的时间
在使用命令创建 Deployment,在 Pod 没有创建完成前, READY 字段可能显示为 0/1
这里我们可以看看 Deployment 的 YAML 文件是怎么写的
kubectl get deployment nginx-deployment -o yaml
可以看到,对应的 副本集 为 1

这个字段与 ReplicaSet 有关,创建 Deployment 后,会自动创建 ReplicaSet,ReplicaSet 管理的副本数量跟 YAML 中 replicas 字段值一致,查看 replicaset 实例
kubectl get replicaset
# 也可以使用缩写 rs 查看
kubectl get rs

扩容 Pod
随着项目的逐步稳定,用户数量越来越多,单实例无法支撑起高并发,访问速度变慢,响应时间变长,内存爆炸,这时候就需要多个实例,以此均分用户的访问请求,让一个 Pod 只负载一部分用户,这样就能有效地支持亿级用户并发
在扩展 Pod 实例的时候,需要保证 Pod 应当是无状态的,每个 Pod 都是一样的,它们不能表现出差异,同一个请求无论被哪个 Pod 处理,响应结果都应该是一致的
扩容方式有两种,一种是 edit,在上一节 deployment 中有讲过,这里不再赘述,我们将另一种 scale,edit 的方式需要对 yaml 文件直接操作,但我们不希望直接修改文件时,可以使用 scale
kubectl scale deployment nginx-deployment --replicas=2
# 等待几秒后查看
kubectl get deployments
kubectl get rs

# 查看 pod 数量
kubectl get pods

DaemonSet
在 Kubernetes 中,负载类型有 Deployments、ReplicaSet、DaemonSet、StatefulSets 等(或者说有这几个控制器)
这里说的负载类型的意思是指 这个工作负载准备以什么方式运行和管理 Pod,是一种业务运行模式,比如
- Deployment 我要长期运行 3 个相同的 Web Pod
- DaemonSet 我要每个 Node 都运行一个 xx Pod
DaemonSet 可以确保一个节点只运行一个 Pod 副本;假如有个 Pod,当新的节点加入集群时,会自动在这个 节点 上部署一个 Pod;当节点从集群中移开时,这个 Node 上的 Pod 会被回收;如果 DaemontSet 配置被删除,则也会删除所有由它创建的 Pod
负载均衡
负载均衡 是一种将网络流量、请求或工作负载分配到多个服务器或计算资源上的技术,其目的是提高系统的性能、可靠性和可扩展性
创建多个 Pod 能够实现负载均衡的原因是 Pod 被分配到多个节点中,利用了多台服务器的计算资源,本质是分配更多的资源,如果只有一个服务器,那么再扩容 Pod ,能够使用的资源是有限的,不会带来什么效果
Pod 实例数量是多了,也分配到不同的节点上,串起这多个 Pod 的服务叫做 Service 服务。Pod 提供了一个 8080端口,我们可以创建一个 Service,这个 Service 对外也提供了 8080 端口,当用户访问公网 IP:8080 时,Service 会随机选择一个 Pod 为用户提供服务,我们无需关注访问了哪个 Pod

总结
在这一章我们涉及了一些浅显的知识,比如 replicaset、扩容、负载均衡等知识,虽然大多数知识都是杂乱无章的,但通过不断的学习,你就会逐渐串起这些知识
愿诸君顺遂
PS
亿级并发,并非如此简单,通过单纯加机器的方式,虽然在硬件方面可以支持,但机器多了,流量多了,会压垮 kubernetes ,所以就出现了多集群、怎么对多集群负载均衡等
这里的集群,大家需要有概念,集群的意思是指 kubernetes 管理多机器组成的机器群,也就是单集群,而为了实现亿级流量,就需多集群,也就是同时管理多个独立的 Kubernetes 集群