Kubernetes:部署和副本集有什么区别?

Rya*_* Lv 85 kubernetes

副本集和部署都有属性replica: 3,部署和副本集有什么区别?部署是否通过底层的副本集进行?

部署配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    my-label: my-value
spec:
  replicas: 3
  selector:
    matchLabels:
      my-label: my-value
  template:
    metadata:
      labels:
        my-label: my-value
    spec:
      containers:
        - name: app-container
          image: my-image:latest
Run Code Online (Sandbox Code Playgroud)

副本集的配置

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
  labels:
    my-label: my-value
spec:
  replicas: 3
  selector:
    matchLabels:
      my-label: my-value
  template:
    metadata:
      labels:
        my-label: my-value
    spec:
      containers:
        - name: app-container
          image: my-image:latest
Run Code Online (Sandbox Code Playgroud)

Kubernetes 文档

何时使用 ReplicaSet

ReplicaSet 可确保在任何给定时间运行指定数量的 Pod 副本。然而,部署是一个更高级别的概念,它管理 ReplicaSet 并为 Pod 提供声明性更新以及许多其他有用的功能。因此,我们建议使用 Deployments 而不是直接使用 ReplicaSet,除非您需要自定义更新编排或根本不需要更新。

这实际上意味着您可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在规范部分定义您的应用程序。

Far*_*arz 77

部署资源使您可以更轻松地将 pod 更新到新版本。

假设您使用ReplicaSet-A来控制您的 pod,那么您希望将您的 pod 更新到较新的版本,现在您应该创建Replicaset-B,缩小ReplicaSet-A并扩大ReplicaSet-B重复一步(此过程称为滚动更新)。虽然这可以完成工作,但这不是一个好的做法,最好让 K8S 来完成这项工作。

部署资源会自动执行此操作,无需任何人工交互,并将抽象程度提高一级。

注意:部署不直接与 Pod 交互,它只是使用 ReplicaSet 进行滚动更新。

  • 那么,问题是,为什么我们需要 ReplicaSet?为什么我们需要这个中间人?为什么 Deployment 不直接与 Pod 交互? (7认同)
  • 抱歉,您的回答没有回答我的问题。你的答案是部署和副本集的作用,但我问的是,如果部署是一个更高级的概念,为什么我们需要副本集?为什么副本集的概念不直接嵌入到部署中,以便部署直接操作和滚动更新 Pod?为什么我们有这些独立的实体,而不仅仅是管理 Pod 的实体? (7认同)
  • @t7e 这篇文章的主要问题是“ReplicaSet 和 Deployment 之间有什么区别”,我回答了这个问题(Deployment 创建了多一层抽象)。该帖子的第二个问题是“部署是否通过幕后的副本集进行工作?” 我也回答了。在之前的评论中,您提出了一个不同的问题:“为什么复制集的概念没有直接嵌入到部署中?” 这超出了问题的标题,可能会让我的答案变得过于复杂。在另一个堆栈问题中提出这个问题。 (4认同)
  • @t7e 当您需要自定义更新过程或根本不需要更新时,您可以使用“ReplicaSet”。第一个原因通常是原因。我所说的“自定义”,是指它与“部署”在您告诉它“更新”时自动执行的操作不同。`ReplicaSet` 的存在是为了提供在 pod 更新过程中执行您想做的任何操作的功能。 (2认同)

Tho*_*mas 58

ReplicaSet 确保集群中创建一定数量的 Pod。Pod 称为副本,是 Kubernetes 中的可用性机制。但更改 ReplicaSet 不会对现有 Pod 生效,因此无法轻易更改,例如镜像版本。

部署是一种更高的抽象,它管理一个或多个 ReplicaSet 以提供新版本的受控部署。当 Deployment 中的镜像版本发生更改时,将为该版本创建一个新的 ReplicaSet,最初的副本数为零。然后会缩容为一个副本,运行后旧的ReplicaSet会缩容。(新创建的 Pod 数量,即步长,可以调整。)

只要您没有进行中的部署,部署就会生成一个复制集,其复制因子由部署管理。

我建议始终使用 Deployment 而不是裸露的 ReplicaSet。


Pav*_*ulu 21

Deployments 和 ReplicaSet 之间的区别之一是创建 ReplicaSet 后对容器所做的更改不会反映出来

例如:这是我的replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet

metadata:
  name: nginx-replicaset
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 5 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.13.2
        ports:
        - containerPort: 80
Run Code Online (Sandbox Code Playgroud)

我将使用此命令应用此副本集

kubectl apply -f replicaset.yaml
kubectl get pods
kubectl describe pod <<name_of_pod>>
Run Code Online (Sandbox Code Playgroud)

因此,从 pod 定义中,我们可以观察到 nginx 使用的是 1.13.2。现在让我们在replicaset.yaml中将镜像版本更改为1.14.2 再次应用更改

kubectl apply -f replicaset.yaml
kubectl get pods
kubectl describe pod <<name_of_pod>>
Run Code Online (Sandbox Code Playgroud)

现在我们没有看到 Pod 发生任何变化,他们仍在使用旧镜像。


现在让我们对部署重复相同的操作 (deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 5 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.13.2
        ports:
        - containerPort: 80
Run Code Online (Sandbox Code Playgroud)

我将使用此命令应用此部署

kubectl apply -f deployment.yaml
kubectl get pods
kubectl describe pod <<name_of_pod>>
Run Code Online (Sandbox Code Playgroud)

将deployment.yaml文件更改为其他版本的nginx镜像

apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 5 # tells deployment to run 2 pods matching the template
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
Run Code Online (Sandbox Code Playgroud)

我将使用此命令再次应用此部署

kubectl apply -f deployment.yaml
kubectl get pods
kubectl describe pod <<name_of_pod>>
Run Code Online (Sandbox Code Playgroud)

现在我们可以看到这些 pod,并且可以在 pod 的描述中看到更新后的图像


Wil*_*een 5

总而言之:

\n

部署管理 \xe2\x86\x92 副本集管理 \xe2\x86\x92 pod 抽象 \xe2\x86\x92 容器(例如 docker 容器)

\n
\n

部署一个更高级别的抽象,代表应用程序的一组副本。它确保您所需数量的应用程序副本正在运行且可用。

\n

副本另一方面,ReplicaSet 是一种较低级别的资源,负责维护应用程序的一组稳定的ReplicaSet 确保指定数量的副本正在运行且可用。

\n

示例:\n假设您有一个 Web 应用程序想要在 3 个副本上运行以实现高可用性。
\n您将在 Kubernetes 中创建一个部署资源,并将所需的副本数量指定为 3 个 Pod。然后,部署将创建并管理 ReplicaSet,而 ReplicaSet 又将创建并管理 Web 应用程序 Pod 的 3 个副本。

\n

总之,Deployment 为扩展、滚动更新和回滚提供了更高级别的抽象,而 ReplicaSet 提供了较低级别的机制来确保指定数量的应用程序副本正在运行。

\n