K8s Q A Replica Set vs Deployments: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
Строка 3: Строка 3:
 
[[Категория:Требуется форматирование текста]]
 
[[Категория:Требуется форматирование текста]]
   
Различия в Replication Controller, Replica Set и Deployments
+
=Различия в Replication Controller, Replica Set и Deployments=
   
 
Как инструмент оркестрации контейнеров, Kubernetes предусматривает управление несколькими экземплярами (репликами) контейнеров. На сегодняшний день существует несколько способов организации репликации - в данной статье мы рассмотрим три варианта:
Sep 14, 2018 07:04 · 874 words · 5 minute read
 
KUBERNETES
 
Как инструмент оркестрации контейнеров, Kubernetes предусматривает управление несколькими экземплярами (репликами) контейнеров. На сегодняшний день существует несколько способов организации репликации - в данной статье мы рассмотрим три варианта: Replication Controllers, Replica Sets и Deployments. Давайте разберемся!
 
   
  +
* Replication Controllers
Прежде всего, нужно знать зачем нужна репликация контейнеров в кластере Kubernetes. Чаще всего, это нужно для:
 
  +
* Replica Sets
  +
* Deployments
   
 
Прежде всего, нужно знать зачем нужна репликация контейнеров в кластере Kubernetes.
надежности. C несколькими экземплярами приложения вы избавляетесь от проблем в случае отказа одного (или нескольких) из них;
 
  +
<BR>
балансировки. Наличие нескольких экземпляров приложения позволяет распределять траффик между ними, предотвращая перегрузку одного инстанса (под / контейнер) или ноды;
 
  +
Чаще всего, это нужно для:
масштабирования. При возрастающей нагрузке на уже существующие экземпляры приложения Kubernetes позволяет легко увеличивать количество реплик по необходимости.
 
Репликация также хорошо подходит в случае работы с микросервисами, облачными (cloud-native) и мобильными приложениями.
 
   
 
* надежности. C несколькими экземплярами приложения вы избавляетесь от проблем в случае отказа одного (или нескольких) из них;
 
* балансировки. Наличие нескольких экземпляров приложения позволяет распределять траффик между ними, предотвращая перегрузку одного инстанса (под / контейнер) или ноды;
 
* масштабирования. При возрастающей нагрузке на уже существующие экземпляры приложения Kubernetes позволяет легко увеличивать количество реплик по необходимости.
  +
  +
  +
<BR>
  +
<BR>
 
Replication Controller - традиционный (изначальный) способ организации репликации в кластере Kubernetes. В данный момент он заменяется более “свежим” вариантом - Replica Sets, но не будет лишним понять, что это и как работает.
 
Replication Controller - традиционный (изначальный) способ организации репликации в кластере Kubernetes. В данный момент он заменяется более “свежим” вариантом - Replica Sets, но не будет лишним понять, что это и как работает.
  +
<BR>
 
  +
<BR>
 
С помощью объекта Replication Controller можно создать несколько экземпляров подов и отслеживать их состояние. Если один (или несколько) подов завершаются с ошибкой, то контроллер создаст и запустит новый экземпляр (чтобы количество подов всегда соответствовало желаемому). Кроме того, Replication Controller предоставляет возможность масштабирования подов.
 
С помощью объекта Replication Controller можно создать несколько экземпляров подов и отслеживать их состояние. Если один (или несколько) подов завершаются с ошибкой, то контроллер создаст и запустит новый экземпляр (чтобы количество подов всегда соответствовало желаемому). Кроме того, Replication Controller предоставляет возможность масштабирования подов.
  +
<BR>
 
 
Создадим файл rc.yaml следующего содержания:
 
Создадим файл rc.yaml следующего содержания:
  +
<PRE>
 
 
apiVersion: v1
 
apiVersion: v1
 
kind: ReplicationController
 
kind: ReplicationController
Строка 41: Строка 48:
 
ports:
 
ports:
 
- containerPort: 80
 
- containerPort: 80
  +
</PRE>
 
Далее создадим объект Replication Controller в кластере на основе описания выше:
 
Далее создадим объект Replication Controller в кластере на основе описания выше:
  +
<PRE>
 
 
kubectl create -f rc.yaml
 
kubectl create -f rc.yaml
 
replicationcontroller "testrc" created
 
replicationcontroller "testrc" created
  +
</PRE>
 
Получим детальное описание созданного объекта:
 
Получим детальное описание созданного объекта:
  +
<PRE>
 
 
kubectl describe rc testrc
 
kubectl describe rc testrc
 
Name: testrc
 
Name: testrc
Строка 62: Строка 71:
 
1m 1m 1 {replication-controller } Normal SuccessfulCreate Created pod: testrc-cws05
 
1m 1m 1 {replication-controller } Normal SuccessfulCreate Created pod: testrc-cws05
 
1m 1m 1 {replication-controller } Normal SuccessfulCreate Created pod: testrc-ro2bl
 
1m 1m 1 {replication-controller } Normal SuccessfulCreate Created pod: testrc-ro2bl
  +
<PRE>
 
Как видно, все три реплики запущены (ожидаемо). Увидеть состояние подов можно с помощью команды:
 
Как видно, все три реплики запущены (ожидаемо). Увидеть состояние подов можно с помощью команды:
  +
<PRE>
 
 
kubectl get pods
 
kubectl get pods
 
NAME READY STATUS RESTARTS AGE
 
NAME READY STATUS RESTARTS AGE
Строка 69: Строка 79:
 
testrc-g5snq 1/1 Running 0 3m
 
testrc-g5snq 1/1 Running 0 3m
 
testrc-ro2bl 1/1 Running 0 3m
 
testrc-ro2bl 1/1 Running 0 3m
  +
</PRE>
 
Перед рассмотрением Replica Sets “убираем” за собой:
 
Перед рассмотрением Replica Sets “убираем” за собой:
  +
<PRE>
 
 
kubectl delete rc testrc
 
kubectl delete rc testrc
  +
</PRE>
 
Как мы уже ранее говорили, Replica Sets - это более современная версия все того же Replication Controller, которая отличается поддержкой множественного выбора в селекторе. Создадим файл rs.yaml с таким содержимым:
 
Как мы уже ранее говорили, Replica Sets - это более современная версия все того же Replication Controller, которая отличается поддержкой множественного выбора в селекторе. Создадим файл rs.yaml с таким содержимым:
   
  +
<PRE>
 
apiVersion: extensions/v1beta1
 
apiVersion: extensions/v1beta1
 
kind: ReplicaSet
 
kind: ReplicaSet
Строка 94: Строка 107:
 
ports:
 
ports:
 
- containerPort: 80
 
- containerPort: 80
  +
</PRE>
 
Здесь все практически то же самое, что и в описании Replication Controller, за исключением того, что мы используем matchLabels. Но можно пойти дальше и заменить секцию matchLabels на такую:
 
Здесь все практически то же самое, что и в описании Replication Controller, за исключением того, что мы используем matchLabels. Но можно пойти дальше и заменить секцию matchLabels на такую:
  +
<PRE>
 
 
matchExpressions:
 
matchExpressions:
 
- {key: app, operator: In, values: [testrs, test]}
 
- {key: app, operator: In, values: [testrs, test]}
 
- {key: tier, operator: NotIn, values: [production]}
 
- {key: tier, operator: NotIn, values: [production]}
  +
</PRE>
 
Создаем объект в кластере командой:
 
Создаем объект в кластере командой:
  +
<PRE>
 
 
kubectl create -f rs.yaml
 
kubectl create -f rs.yaml
 
replicaset "testrs" created
 
replicaset "testrs" created
  +
</PRE>
 
Смотрим описание:
 
Смотрим описание:
  +
<PRE>
 
 
kubectl describe rs testrs
 
kubectl describe rs testrs
 
Name: testrs
 
Name: testrs
Строка 120: Строка 136:
 
1m 1m 1 {replicaset-controller } Normal SuccessfulCreate Created pod: testrs-kimmm
 
1m 1m 1 {replicaset-controller } Normal SuccessfulCreate Created pod: testrs-kimmm
 
1m 1m 1 {replicaset-controller } Normal SuccessfulCreate Created pod: testrs-8i4ra
 
1m 1m 1 {replicaset-controller } Normal SuccessfulCreate Created pod: testrs-8i4ra
  +
</PRE>
  +
<PRE>
 
kubectl get pods
 
kubectl get pods
 
NAME READY STATUS RESTARTS AGE
 
NAME READY STATUS RESTARTS AGE
Строка 125: Строка 143:
 
testrs-it2hf 1/1 Running 0 1m
 
testrs-it2hf 1/1 Running 0 1m
 
testrs-kimmm 1/1 Running 0 1m
 
testrs-kimmm 1/1 Running 0 1m
  +
</PRE>
 
Как видим, Replica Sets действительно очень похожа не Replication Controller. Еще одно важное отличие, о котором мы не упомянули - команда rolling-update будет работать для Replication Controller, но не для Replica Sets.
 
Как видим, Replica Sets действительно очень похожа не Replication Controller. Еще одно важное отличие, о котором мы не упомянули - команда rolling-update будет работать для Replication Controller, но не для Replica Sets.
   
 
“Убираем” за собой:
 
“Убираем” за собой:
  +
<PRE>
 
 
kubectl delete rs testrs
 
kubectl delete rs testrs
 
replicaset "testrs" deleted
 
replicaset "testrs" deleted
  +
</PRE>
 
Вариант репликации подов с использованием объекта Deployment - еще более высокий уровень абстракции. На самом деле, под капотом, Deployment будет самостоятельно создавать необходимые Replica Sets (следовательно, предоставлять тот же функционал, но с возможностью rolling-update/rollback).
 
Вариант репликации подов с использованием объекта Deployment - еще более высокий уровень абстракции. На самом деле, под капотом, Deployment будет самостоятельно создавать необходимые Replica Sets (следовательно, предоставлять тот же функционал, но с возможностью rolling-update/rollback).
   
 
Создадим файл deployment.yaml следующего содержания:
 
Создадим файл deployment.yaml следующего содержания:
  +
<PRE>
 
 
apiVersion: extensions/v1beta1
 
apiVersion: extensions/v1beta1
 
kind: Deployment
 
kind: Deployment
Строка 151: Строка 171:
 
ports:
 
ports:
 
- containerPort: 80
 
- containerPort: 80
  +
</PRE>
 
Запускаем объект в кластере:
 
Запускаем объект в кластере:
  +
<PRE>
 
 
kubectl create -f deployment.yaml
 
kubectl create -f deployment.yaml
 
deployment "test" created
 
deployment "test" created
  +
</PRE>
 
Просмотр деталей:
 
Просмотр деталей:
  +
<PRE>
 
 
kubectl describe deployment test
 
kubectl describe deployment test
 
Name: test
 
Name: test
Строка 174: Строка 196:
 
38s 38s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set test-3914185155 to 3
 
38s 38s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set test-3914185155 to 3
 
36s 36s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set test-3914185155 to 5
 
36s 36s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set test-3914185155 to 5
  +
</PRE>
  +
<PRE>
 
kubectl get pods
 
kubectl get pods
 
NAME READY STATUS RESTARTS AGE
 
NAME READY STATUS RESTARTS AGE
Строка 181: Строка 205:
 
test-3914185155-ojzn8 1/1 Running 0 2m
 
test-3914185155-ojzn8 1/1 Running 0 2m
 
test-3914185155-r2pt7 1/1 Running 0 2m
 
test-3914185155-r2pt7 1/1 Running 0 2m
  +
</PRE>
Чуть больше информации о Replica Sets и Deployment можно найти в предыдущих статьях цикла - здесь и здесь.
 

Текущая версия на 15:05, 9 января 2024


Различия в Replication Controller, Replica Set и Deployments

Как инструмент оркестрации контейнеров, Kubernetes предусматривает управление несколькими экземплярами (репликами) контейнеров. На сегодняшний день существует несколько способов организации репликации - в данной статье мы рассмотрим три варианта:

  • Replication Controllers
  • Replica Sets
  • Deployments

Прежде всего, нужно знать зачем нужна репликация контейнеров в кластере Kubernetes.
Чаще всего, это нужно для:

  • надежности. C несколькими экземплярами приложения вы избавляетесь от проблем в случае отказа одного (или нескольких) из них;
  • балансировки. Наличие нескольких экземпляров приложения позволяет распределять траффик между ними, предотвращая перегрузку одного инстанса (под / контейнер) или ноды;
  • масштабирования. При возрастающей нагрузке на уже существующие экземпляры приложения Kubernetes позволяет легко увеличивать количество реплик по необходимости.




Replication Controller - традиционный (изначальный) способ организации репликации в кластере Kubernetes. В данный момент он заменяется более “свежим” вариантом - Replica Sets, но не будет лишним понять, что это и как работает.

С помощью объекта Replication Controller можно создать несколько экземпляров подов и отслеживать их состояние. Если один (или несколько) подов завершаются с ошибкой, то контроллер создаст и запустит новый экземпляр (чтобы количество подов всегда соответствовало желаемому). Кроме того, Replication Controller предоставляет возможность масштабирования подов.
Создадим файл rc.yaml следующего содержания:

apiVersion: v1
kind: ReplicationController
metadata:
  name: testrc
spec:
  replicas: 3
  selector:
    app: testrc
  template:
    metadata:
      name: testrc
      labels:
        app: testrc
    spec:
      containers:
      - name: testrc
        image: ealebed/test
        ports:
        - containerPort: 80

Далее создадим объект Replication Controller в кластере на основе описания выше:

kubectl create -f rc.yaml
replicationcontroller "testrc" created

Получим детальное описание созданного объекта:

kubectl describe rc testrc
Name:           testrc
Namespace:      default
Image(s):       ealebed/test
Selector:       app=testrc
Labels:         app=testrc
Replicas:       3 current / 3 desired
Pods Status:    3 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen     LastSeen        Count   From                            SubobjectPath   Type   Reason                   Message
  ---------     --------        -----   ----                            -------------   --------------                  -------
  1m            1m              1       {replication-controller }                       Normal SuccessfulCreate Created pod: testrc-g5snq
  1m            1m              1       {replication-controller }                       Normal SuccessfulCreate Created pod: testrc-cws05
  1m            1m              1       {replication-controller }                       Normal SuccessfulCreate Created pod: testrc-ro2bl
<PRE>
Как видно, все три реплики запущены (ожидаемо). Увидеть состояние подов можно с помощью команды:
<PRE>
kubectl get pods
NAME           READY     STATUS    RESTARTS   AGE
testrc-cws05   1/1       Running   0          3m
testrc-g5snq   1/1       Running   0          3m
testrc-ro2bl   1/1       Running   0          3m

Перед рассмотрением Replica Sets “убираем” за собой:

kubectl delete rc testrc

Как мы уже ранее говорили, Replica Sets - это более современная версия все того же Replication Controller, которая отличается поддержкой множественного выбора в селекторе. Создадим файл rs.yaml с таким содержимым:

apiVersion: extensions/v1beta1
 kind: ReplicaSet
 metadata:
   name: testrs
 spec:
   replicas: 3
   selector:
     matchLabels:
       app: testrs
   template:
     metadata:
       labels:
         app: testrs
         environment: dev
     spec:
       containers:
       - name: testrs
         image: ealebed/test
         ports:
         - containerPort: 80

Здесь все практически то же самое, что и в описании Replication Controller, за исключением того, что мы используем matchLabels. Но можно пойти дальше и заменить секцию matchLabels на такую:

     matchExpressions:
      - {key: app, operator: In, values: [testrs, test]}
      - {key: tier, operator: NotIn, values: [production]}

Создаем объект в кластере командой:

kubectl create -f rs.yaml
replicaset "testrs" created

Смотрим описание:

kubectl describe rs testrs
Name:           testrs
Namespace:      default
Image(s):       ealebed/test
Selector:       app in (test,testrs),tier notin (production)
Labels:         app=testrs
Replicas:       3 current / 3 desired
Pods Status:    3 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen     LastSeen        Count   From                            SubobjectPath   Type    Reason                   Message
  ---------     --------        -----   ----                            -------------   --------------                   -------
  1m            1m              1       {replicaset-controller }                        Normal  SuccessfulCreate Created pod: testrs-it2hf
  1m            1m              1       {replicaset-controller }                       Normal  SuccessfulCreate Created pod: testrs-kimmm
  1m            1m              1       {replicaset-controller }                        Normal  SuccessfulCreate Created pod: testrs-8i4ra
kubectl get pods
NAME           READY     STATUS    RESTARTS   AGE
testrs-8i4ra   1/1       Running   0          1m
testrs-it2hf   1/1       Running   0          1m
testrs-kimmm   1/1       Running   0          1m

Как видим, Replica Sets действительно очень похожа не Replication Controller. Еще одно важное отличие, о котором мы не упомянули - команда rolling-update будет работать для Replication Controller, но не для Replica Sets.

“Убираем” за собой:

kubectl delete rs testrs
replicaset "testrs" deleted

Вариант репликации подов с использованием объекта Deployment - еще более высокий уровень абстракции. На самом деле, под капотом, Deployment будет самостоятельно создавать необходимые Replica Sets (следовательно, предоставлять тот же функционал, но с возможностью rolling-update/rollback).

Создадим файл deployment.yaml следующего содержания:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: test
        image: ealebed/test
        ports:
        - containerPort: 80

Запускаем объект в кластере:

kubectl create -f deployment.yaml
deployment "test" created

Просмотр деталей:

kubectl describe deployment test
Name:                   test
Namespace:              default
CreationTimestamp:      Mon, 03 Sep 2018 13:21:19 +0000
Labels:                 app=test
Selector:               app=test
Replicas:               5 updated | 5 total | 5 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
OldReplicaSets:         <none>
NewReplicaSet:          test-3914185155 (5/5 replicas created)
Events:
  FirstSeen     LastSeen        Count   From                            SubobjectPath   Type    Reason                   Message
  ---------     --------        -----   ----                            -------------   --------------                   -------
  38s           38s             1       {deployment-controller }                        Normal  ScalingReplicaSet        Scaled up replica set test-3914185155 to 3
  36s           36s             1       {deployment-controller }                        Normal  ScalingReplicaSet        Scaled up replica set test-3914185155 to 5
kubectl get pods
NAME                    READY     STATUS    RESTARTS   AGE
test-3914185155-7gyja   1/1       Running   0          2m
test-3914185155-lrm20   1/1       Running   0          2m
test-3914185155-o28px   1/1       Running   0          2m
test-3914185155-ojzn8   1/1       Running   0          2m
test-3914185155-r2pt7   1/1       Running   0          2m