在k8s中的控制器和部署服务-ReplicationController和ReplicaSet
pod 代表了 k8s 中的基本部署单元,但是在实际应用场景中,服务不可能是单个pod运行的,否则会出现“单点”。在 k8s 中对 pod 的托管部署,专门抽象成了单独的资源。其中包含了 ReplicationController 或 Deloyment ,由他们来管理实际的 pod。
试想一下,当你创建未托管的 pod 的时候,会选择一个集群来运行 pod,在集群中选择节点来运行容器。如果节点中某些 pod 丢失,或者失败,这时候就需要自动重启他们,并且产生新的 pod 来替代他们,这些工作就是有 ReplicationController 的资源来进行托管的。
ReplicationController
下面找了幅图来说明,ReplicationController 旨在创建和管理一个 pod 的多个副本(replica),这就是 ReplicationController 的由来。
在 k8s 中,ReplicationController 的工作就是确保 pod 的数量始终和其标签选择器匹配,如果不匹配则需要适当的“调度”来满足。这里可以想象成 k8s 始终在循环的检查对应的 RepliactionController 资源状态,如果符合 yaml 文件的描述则跳过,如果不满足则进行调度调整。
在创建 ReplicationController 中,声明 yaml 只需要三个主要的部分:
- label seoector(标签选择器),用于确定 ReplicationController 作用域中有哪些 pod
- replica count(副本个数),指定运行的 pod 数量
- pod template(pod模板),用于创建 pod 副本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | apiVersion: v1 kind: ReplicationController metadata: name: kubia // ReplicationController 的名字 spec: replicas: 3 selector: app: kubia // 确保标签选择器 app=kubia 的pod实例始终只有3个 template: metadata: name: kubia labels: app: kubia // 这里可以不指定,它会被自动配置,如果指定必须和上面的 selector一致 spec: // 创建新 pod 所用的 pod 模板 containers: - name: kubia image: luksa/kubia ports: - containerPort: 8080 |
相关执行命令
# 创建 ReplicationController $ kubectl create -f ./kubia-rc.yaml # 查看 rc $ kubectl get rc # 查看详情 $ kubectl describe rc {ReplicationController名称} # 将pod移入或移出,只需要更改标签即可 $ kubectl label pod {pod名字} {标签名}={标签值} --overwrite ## 这里的标签修改后,与rc的不匹配则会导致 ReplicationController 重新拉起一个 pod,并且这个被修改的pod是完全独立的,并且会一直运行直到你手动删除它 # 修改 rc 模板 $ kubectl edit rc {ReplicationController名称} # 扩缩容 $ kubectl scale rc {ReplicationController名称} --replicas={副本数量} # 删除 ReplicationController $ kubectl delete rc {ReplicationController名称}
ReplicaSet
ReplicaSet 的功能其实和 ReplicationController 一模一样,但是不同的是 ReplicaSet 对于 pod 的选择器提供更多的语法来进行匹配。
举个栗子,单纯 ReplicationController 无法将 pod 与标签 env=dev 和 env=prod 的进行同时匹配,但是 ReplicaSet 可以进行同时符合这连个标签的 pod 来进行管理。
比较简单的选择器 selector.matchLabels
apiVersion: apps/v1beta2 kind: ReplicaSet metadata: name: kubia-rs spec: selector: matchLabels: app: kubia-rs template: ....后面和ReplicationController一样
更复杂的选择器 selector.matchExpressions
selector: matchExpressions: - key: app // 此选择器要求该 pod 包含名为"app"的标签,下面则是对 app 这个标签的筛选 operator: In values: - kubia-rs
选择器每个表达式必须包含一个 key,和一个 operator 运算符。其中运算符分为:
- In:Label 的值必须与其中一个指定的 values 匹配 - NotIn: Label 的值与任何指定的 values 不匹配 - Exists: pod 必须包含一个指定名称的标签 - DoesNotExist: pod 不得包含有指定名称的标签
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」