Kubernetes ReplicaSets: Eine kurze Einführung

Kubernetes ReplicaSets: Eine kurze Einführung

  • ITOps & DevOps
6 Minuten Lesezeit Aktualisiert Jan 9, 2019

Auf einen Blick: Kubernetes ReplicaSets stellen sicher, dass die gewünschte Anzahl an Pod-Replikaten ausgeführt werden, was die Bereitstellung im Vergleich zur manuellen Pod-Erstellung vereinfacht. Dieser Leitfaden erklärt, wie man ReplicaSets effektiv nutzt und erstellt.

  • ReplicaSets verwalten Pod-Replikate über Label-Selektoren.
  • Manifest-Beispiele zeigen, wie man ReplicaSets definiert und bereitstellt.

In diesem Blogbeitrag werden wir das ReplicaSet-Konzept in Kubernetes besprechen. Wir werden erklären:

  • Was RS ist
  • Wofür man ReplicaSets verwenden sollte
  • Wie man es erstellt

Dieser Beitrag setzt voraus, dass du ein grundlegendes Verständnis von Pods, Minikube und Kubectl hast.

Was sind ReplicaSets?

Ein ReplicaSet ist einer der Kubernetes-Controller, der sicherstellt, dass eine bestimmte Anzahl von Pod-Repliken läuft. (Denken Sie daran: Ein Controller in Kubernetes kümmert sich um Aufgaben, um sicherzustellen, dass der gewünschte Zustand des Clusters mit dem beobachteten Zustand übereinstimmt.)

Ohne RS müssen wir mehrere Manifeste für die benötigte Anzahl der Pods erstellen, was viel Arbeit ist, um Replikate einer einzelnen Anwendung bereitzustellen. In früheren Versionen von Kubernetes wurde das ReplicaSet Replication Controller genannt. Der Hauptunterschied zwischen den beiden ist, dass ReplicaSets uns erlauben, etwas namens Label Selector zu verwenden.

Labels sind Schlüssel-Werte-Paare, die verwendet werden, um Attribute von Objekten zu spezifizieren, die für die Nutzer sinnvoll und nützlich sind, daher sollten Sie bedenken, dass dies die Funktionsweise des Kernsystems nicht verändert. Label Selectors wird verwendet, um eine Menge von Objekten in Kubernetes zu identifizieren.

ReplicaSets ermöglichen es uns, einen "set-basierten" Label-Selektor zu verwenden (z. B. Umgebung in (Produktion, QA) oder Tier-Notin (Frontend, Backend)) im Gegensatz zu "Gleichheitsbasiert" (z. B. Umgebung = Produktion oder Tier != Frontend), wie man es mit einem Replikationscontroller verwendet.

Operatoren zur Verwendung mit ReplicaSets

Es gibt drei Arten von Operatoren, die wir mit ReplicaSets verwenden können:

  • In
  • Notin
  • Existiert

ReplicaSets verwaltet alle Pods mit Labels, die mit dem Selektor übereinstimmen. Wenn Pods erstellt werden, wird nicht zwischen allen Pods unterschieden, sodass die vorherigen ReplicaSets denken, dass sie diese Pods erstellt haben, wenn du ein weiteres ReplicaSets mit demselben Label-Selector erstellst, was Probleme verursacht.

Das ist wichtig zu beachten, daher sollte man sicherstellen, dass Label-Selektoren nicht von einem ReplicaSets zum anderen übereinstimmen.

Wie sieht das ReplicaSet-Manifest aus?

    apiVersion: apps/v1 # our API version
kind: ReplicaSet   # The kind we are creating
Metadata: # Specify all Metadata like name, labels
  name: some-name
  labels:
    app: some-App
    tier: some-Tier
Spec: 
  replicas: 3 # Here is where we tell k8s how many replicas we want
  Selector: # This is our label selector field. 
    matchLabels:
      tier: some-Tier
    matchExpressions:
      - {key: tier, operator: In, values: [some-Tier]} # we are using the set-based operators
  template:
    metadata:
      labels:
        app: some-App
        tier: someTier
    Spec: # This spec section should look like spec in a pod definition
      Containers:

APIVersion, Typ und Metadaten sehen ähnlich aus wie jedes andere Objekt in Kubernetes, aber der Spec-Abschnitt sieht leicht anders aus als bei anderen Objekten. Tatsächlich gibt es im obigen Manifestbeispiel zwei Specs. Die erste Spec erlaubt es dir, zu deklarieren, wie das Replicaset aussehen soll, und die zweite Spec ist für Container. ".spec.template" ist das einzige erforderliche Feld im ersten Spec-Abschnitt. Wenn du keine Repliken spezifizierst, wird nur ein Pod bereitgestellt. Es ist auch erwähnenswert, dass die ".spec.template.metadata.labels" genau mit dem übereinstimmen muss, was du im ".spec.selector" hast (das kannst du in unserem obigen Manifest sehen), sonst erlaubt Kubernetes die Erstellung nicht.

ReplicaSet: ein Beispiel

Okay, jetzt, wo wir verstehen, was ein Replicaset ist, erstellen wir eines. In diesem Beispiel werden wir unsere replica.yaml-Datei bereitstellen, die eine einfache Frontend-nginx-App mit 3 Repliken erstellt.

    apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicas
  labels:
    app: myapp
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
  template:
    metadata:
      labels:
        app: myapp
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Zuerst führen wir kubectl create-Befehl aus, um unser Manifest anzuwenden

    $ kubectl create -f replica.yaml
replicaset.apps "myapp-replicas" created

Als Nächstes stellen wir sicher, dass es erstellt wird

    $ kubectl get replicaset
NAME                            DESIRED   CURRENT   READY     AGE
myapp-replicas                  3         3         3         15s

Wir sehen, dass 3 eingesetzt und 3 einsatzbereit sind. Wir können auch einfach die Pods überprüfen.

    $ kubectl get pod
NAME                            READY     STATUS    RESTARTS   AGE
myapp-replicas-67rkp            1/1       Running   0          33s
myapp-replicas-6kfd8            1/1       Running   0          33s
myapp-replicas-s96sg            1/1       Running   0          33s

Wir sehen, dass alle drei ohne Neustarts laufen, was bedeutet, dass unsere Anwendung nicht abstürzt. Wir können auch das Objekt beschreiben, was uns mehr Details zu unseren Repliken liefert.

    $ kubectl describe replicaset myapp-replicas
Name:         myapp-replicas
Namespace:    default
Selector:     tier=frontend,tier in (frontend)
Labels:       app=myapp
              tier=frontend
Annotations:  
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=myapp
           tier=frontend
  Containers:
   nginx:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  
    Mounts:       
  Volumes:        
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  12m   replicaset-controller  Created pod: myapp-replicas-6kfd8
  Normal  SuccessfulCreate  12m   replicaset-controller  Created pod: myapp-replicas-67rkp
  Normal  SuccessfulCreate  12m   replicaset-controller  Created pod: myapp-replicas-s96sg

ReplicaSet FAQs

Hier einige kurze FAQs zu ReplicaSets.

Was, wenn wir keine drei Repliken mehr brauchen, sondern nur noch eine?

Alles, was wir tun müssen, ist, das Replikatfeld auf den gewünschten Wert zu ändern, und k8s skaliert es auf diese Zahl. Zum Beispiel "Replikate: 1". Wenn wir die Änderung vornehmen und erneut anwenden, läuft nur ein Replikat.

Können wir den Pod aus einem ReplicaSets entfernen?

Ja, das können wir. Es ist so einfach wie das Etikett vom Pod zu entfernen, und es wird aus dem Set entfernt.

Wie beseitigt man RS?

Um replicaset zu löschen, müssen wir nur "kubectl delete replicaset myapp-replicas" ausführen. Dieser Befehl löscht die Replicasets und die Pods.

Im Allgemeinen empfiehlt Kubernetes, einen Deployment-Controller (ein höherwertiges Konzept, das ReplicaSets verwaltet und deklarative Updates für Pods sowie viele andere nützliche Funktionen bereitstellt) statt ReplicaSets zu verwenden.

Zusätzliche Ressourcen

Für mehr Informationen zu Kubernetes entdecken Sie diese Ressourcen:

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus ITOps & DevOps

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.