云原生05-Pod高级
Replicaset 控制器:概念、原理解读
概念
假设你有一个容器应用程序,需要在·Kubernetes·集群中运行。这个应用程序需要多个相同的 Pod·实例来处理用户请求,以确保应用程序的高可用性和性能。但是,由于:Pod·可能会因为各种 原因而停止运行(例如,节点故障、资源不足、应用程序崩溃等),因此你需要一种机制来确保始终 有足够数量的:Pod·实例在运行。
这时候,就可以使用·ReplicaSet·来管理这些·Pod·实例。ReplicaSet·可以定义应该运行多少 个相同的·Pod·实例,以及在某个Pod·实例失败时如何自动创建新的·Pod·实例来替代。 ReplicaSet·还可以根据资源利用率自动调整·Pod·实例的数量,以确保应用程序始终能够处理用户 请求。
简单来说,ReplicaSet·可以帮助你确保你的应用程序始终能够提供足够的容量和可用性,而无 需手动管理多个·Pod·实例。
工作原理:如何管理pod
ReplicaSet·的工作原理可以简单概括为:它不断地检查当前集群中的·Pod·副本数量是否符合 用户定义的期望数量,如果数量不足,则会自动创建新的·Pod·副本来满足期望数量,如果数量过 多,则会删除一些·Pod·副本以满足期望数量。
具体来说,当创建一个·ReplicaSet·时,需要定义以下参数: 1、模板(template):指定了要创建的·Pod·的规格和属性; 2、副本数量(replicas):指定了要创建的·Pod·的副本数量; 3、选择器(selector):指定了要选择哪些·Pod·实例,以确保它们的标签与·ReplicaSet·的标签相匹配。
一旦·ReplicaSet·创建完成,它会不断地监控集群中符合选择器要求的·Pod·实例数量,如果 实际数量小于期望数量,则会自动创建新的·Pod·实例,如果实际数量多于期望数量,则会自动删除 一些·Pod·实例。
总之,ReplicaSet·是·Kubernetes·中用来管理·Pod·实例数量的核心组件,它通过自动创建 和删除·Pod·实例来确保应用程序的高可用性和可伸缩性。简写成 rs。
Replicaset资源清单文件编写技巧
kubectl explain rs
1)apiVersion:表示当前资源使用的·APl·版本,通常为·"apps/v1"。 2)kind:表示资源类型,即."ReplicaSet"。 3)metadata:包括·name、namespace、labels、annotations·等字段,用于定义 Replicaset·的元数据信息。 4)spec:包括·replicas、selector、template·等字段,用于定义·Replicaset·的规格,包 括副本数、标签选择器和·Pod·模板等。 5)status:包括·replicas、available、Replicas、readyReplicas·等字段,用于记录当前 Replicaset·的状态信息,例如副本数、可用副本数和就绪副本数等。 注意:status·字段是只读的,不能手动修改。
kubectl explain rs.spec
1)replicas:表示需要创建的·Pod·副本数。个 2)selector:用于匹配要管理的·Pod·的标签选择器,通常是一个·key-value·对,例如 matchLabels:-{app:-nginx)。 3)template:定义·Pod·的模板,基于该模板创建的所有·Pod·都是相同的。模板中包含了 Pod·的元数据和规格信息,例如·Pod·的名称、标签、容器镜像、容器端口等。
kubectl explain rs.spec.template.spec
- activeDeadlineSeconds:定义Pod的运行时间限制(秒)。
- affinity:用于定义Pod如何调度到节点上的规则,可指定nodeSelector、nodeAffinity和podAffinity/podAntiAffinity。
- automountServiceAccountToken:是否自动挂载Service·Account的token到Pod中
- containers:定义Pod中的容器列表,该字段是必需的。
- dnsConfig:定义Pod中的DNS配置,如DNS服务器的IP地址和搜索域。
- dnsPolicy:定义Pod中的DNS策略,如使用ClusterFirst或Default
- ephemeralContainers:定义Pod中的临时容器列表,这些容器具有短暂的生命周期,例如用于调试或临时的数据处理。
- hostAliases:I定义Pod中的hosts文件条目。
- hostIPC:是否允许容器共享IPC命名空间。
- hostNetwork:是否将Pod的网络命名空间与主机共享。
- hostPID:是否允许容器共享主机PID命名空间。
- hostUsers:是否允许容器共享主机用户命名空间。
- hostname:定义Pod的主机名。
- imagePullSecrets:定义从私有仓库中拉取镜像所需的身份验证信息。
- initContainers:定义Pod中的初始化容器列表,这些容器在主容器启动之前运行。
- nodeName:定义Pod所在的节点名称。
- nodeSelector:用于定义Pod应该调度到哪些节点上。
- os:定义Pod所在的操作系统类型和版本。
- overhead:定义Pod需要的CPU、内存和存储资源之外的其他资源。
- preemptionPolicy:定义 Pod 被抢占的行为,如 Never、PreemptLowerPriority 或 PreemptNever。
- priority:定义Pod的调度优先级。
- priorityClassName:定义Pod使用的调度优先级类名称。
- readinessGates:定义Pod的就绪探针列表,这些探针用于检查容器是否已准备好接受流量。
- resourceClaims:定义Pod使用的资源声明列表。
- restartPolicy:定义Pod 的重启策略,如Always、OnFailure 或Never。
- runtimeClassName:定义Pod使用的容器运行时类名称。
- schedulerName:定义Pod使用的调度器名称。
- schedulingGates:定义Pod的调度探针列表,这些探针用于检查节点是否已准备好接受Pod。
- securityContext:定义Pod的安全上下文。
- serviceAccount:定义Pod使用的Service·Account的名称。
- serviceAccountName:定义Pod使用的Service·Account的名称。
- setHostnameAsFQDN:是否将Pod的主机名设置为完全限定域名。
- shareProcessNamespace:是否允许容器共享主机命名空间。如果将此字段设置为true,则在同一Pod中的容器可以共享主机的PID命名空间、IPC命名空间和UTS命名空间。这使得容器之间可以相互查看和访问进程、共享进程、文件系统和其他资源。通常情况下,建议不要将此设置为true,以提高容器之间的安全性和隔离性。