作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
我们前面从概念到安装,再到pod和master及node的介绍,都是为了让我们对k8s有一个比较直观的理解,今后及后面相当长的时间我们将介绍k8s的各种资源。
ReplicaSets介绍
我们前面介绍pod的时候通过yaml文件创建了pod,这个pod大概就等于使用docker run 创建的容器。如果我们想对这个容器做更高级的操作(增加pod的数量,更换镜像等),则必须要借助其他控制器,今天我们要介绍的控制器就是ReplicaSets,也可以简称:rs。
ReplicaSets 是 Kubernetes 中的一种资源对象,用于确保指定数量的 Pod 副本处于运行状态。它通过监控正在运行的 Pod,并在需要时创建或销毁 Pod 来保证集群中运行的 Pod 数量与预期相符。尽管 ReplicaSet 可以独立使用,但在实际应用中,通常推荐使用更高层级的抽象如 Deployments,因为 Deployments 提供了声明式更新、回滚等额外功能。
以下是关于 ReplicaSets 的一些关键点:
维持 Pod 副本数:ReplicaSet 确保一定数量的 Pod 副本始终可用。如果一个 Pod 挂掉,ReplicaSet 会启动一个新的来替代它。
选择器(Selector):使用标签选择器来确定由 ReplicaSet 管理的 Pod 集合。所有带有指定标签的 Pod 都会被认为是该 ReplicaSet 的一部分。
Pod 模板(Pod Template):定义了 ReplicaSet 创建的新 Pod 的属性。每个由 ReplicaSet 创建的 Pod 都是从这个模板生成的。
扩展性:用户可以通过修改 ReplicaSet 的副本数来增加或减少 Pod 的数量,从而实现服务的水平扩展。
局限性:如果你直接使用 ReplicaSet 而不是 Deployment,那么你就失去了滚动更新、版本回退等高级特性。
滚动更新和回滚:这些功能通常由 Deployments 提供,但如果你直接管理 ReplicaSet,则需要自己处理这些操作。
替代方案:在大多数情况下,应该使用 Deployments 来代替直接使用 ReplicaSet,因为 Deployments 内部管理了一个 ReplicaSet 并提供了更多的功能。
升级策略:ReplicaSet 自身不提供任何内置的升级策略;对于复杂的部署和升级场景,应考虑使用 Deployments 或 StatefulSets。
范例
apiVersion: apps/v1 # api版本
kind: ReplicaSet # 产品类型
metadata:
name: nginx-replicaset
labels:
app: nginx
spec:
replicas: 3 # 设置你想要维持的Pod副本数量
selector:
matchLabels:
app: nginx # 定义选择器,用于确定哪些Pod属于此ReplicaSet
template: # 这是创建新Pod时使用的模板
metadata:
labels:
app: nginx # 确保Pod标签与选择器匹配
spec:
containers:
- name: nginx
image: nginx # 使用Nginx镜像
imagePullPolicy: IfNotPresent #定义镜像下载策略
ports:
- containerPort: 80 # 容器监听的端口
kubectl apply -f xx.yaml
这个时候k8s按照我们的预期,创建了3个pod,如果因为意外或者其他原因,部分pod被删除,那么这个rs的控制器则会自动补齐对应的个数,这样他就通过这个方式来提高了我们的业务的高可用。始终按照我们的预期的方式运行。
[root@master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-replicaset-9ztvk 1/1 Running 0 18m
nginx-replicaset-t6747 1/1 Running 0 18m
nginx-replicaset-tj728 1/1 Running 0 18m
[root@master01 ~]# kubectl delete pod nginx-replicaset-tj728
pod "nginx-replicaset-tj728" deleted
[root@master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-replicaset-9ztvk 1/1 Running 0 18m
nginx-replicaset-t6747 1/1 Running 0 18m
nginx-replicaset-z9fjd 1/1 Running 0 3s
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。