webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Bereitstellung auf mehrere Knoten verteilen?

Ich habe eine Kubernetes-Bereitstellung, die ungefähr so ​​aussieht (Namen und andere Dinge durch '....' ersetzt):

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
    kubernetes.io/change-cause: kubectl replace deployment ....
      -f - --record
  creationTimestamp: 2016-08-20T03:46:28Z
  generation: 8
  labels:
    app: ....
  name: ....
  namespace: default
  resourceVersion: "369219"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/....
  uid: aceb2a9e-6688-11e6-b5fc-42010af000c1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ....
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: ....
    spec:
      containers:
      - image: gcr.io/..../....:0.2.1
        imagePullPolicy: IfNotPresent
        name: ....
        ports:
        - containerPort: 8080
          protocol: TCP
        resources:
          requests:
            cpu: "0"
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 2
  observedGeneration: 8
  replicas: 2
  updatedReplicas: 2

Das Problem, das ich beobachte, ist, dass Kubernetes beide Repliken (in der Bereitstellung, die ich für zwei angefordert habe) auf demselben Knoten platziert. Wenn dieser Knoten ausfällt, verliere ich beide Container und der Dienst geht offline.

Ich möchte, dass Kubernetes dafür sorgt, dass es keine Container auf demselben Knoten verdoppelt, auf denen die Container vom gleichen Typ sind. Dies verbraucht nur Ressourcen und bietet keine Redundanz. Ich habe die Dokumentation zu Bereitstellungen, Replikatsätzen, Knoten usw. durchgesehen, aber ich habe keine Optionen gefunden, die mich dazu veranlassen, Kubernetes dazu zu bringen.

Gibt es eine Möglichkeit, Kubernetes mitzuteilen, wie viel Redundanz zwischen Knoten für einen Container gewünscht wird?

EDIT: Ich bin nicht sicher, ob Labels funktionieren werden. Bezeichnungen geben an, wo ein Knoten ausgeführt wird, sodass er auf lokale Ressourcen (SSDs) usw. zugreifen kann. Alles, was ich tun möchte, ist sicherzustellen, dass keine Ausfallzeiten auftreten, wenn ein Knoten offline geht.

14
June Rhodes

Ich denke, Sie suchen nach den Affinitäts-/Anti-Affinitäts-Selektoren. 

Affinity ist für die gemeinsame Lokalisierung von Pods. Ich möchte, dass meine Website versucht, einen Termin auf dem gleichen Host zu planen wie beispielsweise mein Cache. Auf der anderen Seite ist Anti-Affinität das Gegenteil: Planen Sie auf einem Host nicht nach einem Regelwerk.

Für das, was Sie tun, möchte ich mir diese beiden Links genauer ansehen: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#never-co-located im selben Knoten

https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/#tolerating-node-failure

10
Kevin Nisbet

Wenn Sie einen Dienst für diese Bereitstellung erstellen, bevor die Bereitstellung erstellt wird, verteilt Kubernetes Ihre Pods auf Knoten. Dieses Verhalten stammt vom Scheduler. Er wird nach besten Kräften bereitgestellt, vorausgesetzt, Sie verfügen auf beiden Knoten über ausreichend Ressourcen.

Aus der Kubernetes-Dokumentation ( Ressourcen verwalten ):

es ist am besten, den Service zuerst anzugeben, da der Scheduler die mit dem Service verknüpften Pods so verteilen kann, wie sie von den Controllern erstellt werden, wie z. B. Deployment.

Ebenfalls verwandt: Best Practices für die Konfiguration - Service .

7
Antoine Cotten

Ich stimme mit Antoine Cotten überein, einen Dienst für Ihre Bereitstellung zu verwenden. Ein Dienst hält immer einen Dienst aufrecht, indem er einen neuen Pod erstellt, wenn aus irgendeinem Grund ein Pod in einem bestimmten Knoten stirbt. Wenn Sie jedoch nur eine Bereitstellung auf alle Knoten verteilen möchten, können Sie die Pod-Affinität in Ihrer Pod-Manifest-Datei verwenden. Ich habe ein Beispiel auf meine gitlab-Seite gestellt das Sie auch im Kubernetes Blog finden können. Um Ihnen die Arbeit zu erleichtern, gebe ich auch hier das Beispiel.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
              topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: gcr.io/google_containers/nginx-slim:0.8
        ports:
        - containerPort: 80

In diesem Beispiel verfügt jede Bereitstellung über ein Label, das app ist, und der Wert dieses Labels ist nginx. In der Pod-Spezifikation haben Sie podAntiAffinity, das sich darauf beschränkt, zwei gleiche Pods (Label-App: nginx) in einem Knoten zu haben. Sie können podAffinity auch verwenden, wenn Sie mehrere Bereitstellungen in einem Knoten platzieren möchten.

1
Abu Shoeb

Wenn ein Knoten ausfällt, werden alle darauf laufenden Pods automatisch auf einem anderen Knoten neu gestartet.

Wenn Sie genau angeben, wo sie ausgeführt werden sollen, verlieren Kubernetes die Möglichkeit, sie auf einem anderen Knoten neu zu planen.

Daher ist es üblich, Kubernetes einfach sein Ding machen zu lassen.

Wenn Sie jedoch gültige Anforderungen zum Ausführen eines Pods auf einem bestimmten Knoten haben, müssen Sie aufgrund der Anforderungen für einen bestimmten lokalen Datenträgertyp usw. Folgendes lesen:

0

Vielleicht funktioniert eine DaemonSet besser. Ich verwende DaemonStets mit nodeSelector, um Pods auf bestimmten Knoten auszuführen und Duplizierungen zu vermeiden.

http://kubernetes.io/docs/admin/daemons/

0
Camil