Un cluster Kubernetes sur deux sites, une simple histoire de disponibilité, non ?

ntrauwaen

Nicolas TRAUWAEN

Ingénieur production / SRE

smetayer

Sylvain MÉTAYER

Tech Lead

Contexte technique

vmware logo
kubernetes logo
nutanix logo charcoal gray
openshift logo
Diagram

Haute Disponibilité

Diagram

Stretched cluster

Diagram

Control Plane

kubernetes components

Mono Control Plane

Diagram

Mono Control Plane

Diagram

Mono Control Plane

Diagram

Multi Control Plane

Diagram
etcd horizontal color
etcd xkcd 2347

Raft consensus algorithm

raft sticker
Consensus, subst. masc.

Accord de plusieurs personnes, de plusieurs textes dans un domaine déterminé

Raft - Consensus

Diagram

Network partition

Diagram

Défaillance pendant l’initialisation

Recovery

Diagram

Recovery

Diagram

Recovery

Diagram

Recovery

Diagram

Gestion applicative

Un control plane haute disponibilité, mais un seul pod pour son application, ça n’a pas grand intérêt…​

Diagram
Diagram

Anti-affinité

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - topologyKey: topology.kubernetes.io/region
  containers: # [...]

Affinité

apiVersion: v1
kind: Pod
metadata:
  name: my-bdd
spec:
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app.kubernetes.io/name
              operator: In
              values:
              - my-redis
          topologyKey: topology.kubernetes.io/region
  containers: # [...]

Et pour du stateful ?

Diagram

PostgreSQL (CNPG)

---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: database
spec:
  affinity:
    enablePodAntiAffinity: true
    podAntiAffinityType: required # or preferred
    topologyKey: topology.kubernetes.io/region
  instances: 2
operator
⚠️

Kafka

kafka

Avant la version 4

Diagram

À partir de la version 4

Diagram

⚠️ Pensez à vos topics !

---
kind: Kafka
metadata:
  name: kafka
spec:
  kafka:
    rack:
      topologyKey: topology.kubernetes.io/region
    config:
      replica.selector.class: org.apache.kafka.common.replica.RackAwareReplicaSelector
      min.insync.replicas: 2

Kubernetes sur 2 régions, on y va ?

Diagram

Alternatives : Une troisième zone ?

Diagram

Alternatives : Du stockage distribué ?

rook logo
Rook
longhorn logo
Longhorn

Alternatives : Externaliser le stockage ?

Alternatives : Multi cluster

Diagram

Alternatives : Multi cluster federation

Diagram
Liens
Liens