你有没有想过,是什么在负责监督和管理Kubernetes集群内运行的确切数量的pod?Kubernetes可以通过多种方式做到这一点,但一个常见的方法是使用ReplicationController(rc)。ReplicationController负责管理pod的生命周期,并确保在任何时候都能运行所需的指定数量的pod。另一方面,它不负责先进的集群能力,如执行自动扩展、准备度和活度探测以及其他先进的复制能力。Kubernetes集群中的其他组件可以更好地执行这些功能。
简而言之,ReplicationController的职责有限,通常用于不需要复杂逻辑就能达到某些要求的具体实现(例如,确保所需的pod数量总是与指定的数量相符)。如果超过了所需的数量,ReplicationController会删除多余的,并确保即使在节点故障或pod终止的情况下,也有相同数量的pod存在。
简单的事情不需要复杂的解决方案,对我来说,这就是ReplicationController如何被使用的一个完美的比喻。
如何创建一个ReplicationController
像大多数Kubernetes资源一样,你可以使用YAML或JSON格式创建一个ReplicationController,然后将其发布到Kubernetes API端点。
$ kubectl create -f rcexample.yaml
replicationcontroller/rcexample created
现在,我将深入探讨一下rcexample.yaml 的样子。
apiVersion: v1
kind: ReplicationController → rc descriptor
metadata:
name: rcexample → Name of the replication controller
spec:
replicas: 3 → Desired number of pods
selector: → The pod selector for this rc
app: nginx
template: → The template for creating a new pod
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
为了进一步解释,这个文件在执行时创建一个名为rcexample 的ReplicationController,确保三个名为nginx 的pod实例一直在运行。如果一个或所有的podsapp=nginx 没有运行,就会根据定义的pod模板创建新的pods。
一个ReplicationController有三个部分。
- 复制(Replica)。3
- Pod模板:app=nginx
- Pod Selector: app=nginx
注意,Pod Template与Pod Selector相匹配,以防止ReplicationController无限期地创建pod。如果你创建的ReplicationController的Pod选择器与模板不匹配,Kubernetes API服务器会给你一个错误。
要验证ReplicationControllerrcexample 得到创建。
$ kubectl get po
NAME READY STATUS RESTARTS AGE
rcexample-53thy 0/1 Running 0 10s
rcexample-k0xz6 0/1 Running 0 10s
rcexample-q3vkg 0/1 Running 0 10s
要删除该ReplicationController。
$ kubectl delete rc rcexample
replicationcontroller "rcexample" deleted
注意,你可以对ReplicationController中的服务使用滚动更新策略,逐一替换pod。
复制容器的其他方法
在Kubernetes部署中,有多种方法可以实现容器的复制。Kubernetes是容器平台的主要选择,其中一个主要原因是复制容器以实现可靠性、负载平衡和扩展的原生能力。
我在上面展示了你如何轻松地创建一个ReplicationController,以确保在任何时候都有一定数量的pod可用。你可以通过更新副本的数量来手动扩展pod。
实现复制的另一种可能的方法是通过使用ReplicaSet。
(kind: ReplicaSet)
ReplicaSet(rs)的功能几乎与ReplicationController相同。主要区别在于,ReplicaSet不允许采用滚动更新策略。
另一种实现复制的方法是使用Deployments。
(kind: Deployment)
Deployments是一种更高级的容器复制方法。从功能上讲,Deployments提供了相同的功能,但在需要时可以推出和回滚变化。这种功能之所以能够实现,是因为Deployments有StrategyType规范,可以用新的pod替换旧的pod。你可以定义两种类型的部署策略--Recreate和RollingUpdate。你指定部署策略,如下图所示。
StrategyType: RollingUpdate
总结
容器的复制是Kubernetes被视为大多数企业容器采用的主要原因之一。复制使你能够达到大多数关键应用程序所需要的可靠性和可扩展性,这是生产的最低要求。
了解在Kubernetes集群中使用哪些方法来实现复制,对于决定哪种方法最适合你纳入你的应用架构考虑是很重要的。