如何使用ReplicationController管理Kubernetes集群内运行的确切数量pod?

100 阅读3分钟

你有没有想过,是什么在负责监督和管理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集群中使用哪些方法来实现复制,对于决定哪种方法最适合你纳入你的应用架构考虑是很重要的。