Sobes.tech
Middle

За коя апликация трябва да се използва StatefulSet вместо Deployment и защо?

sobes.tech AI

Отговор от AI

StatefulSet трябва да се използва за приложения, които изискват:

  1. Стабилна мрежова идентификация. Pod-овете получават уникално, постоянно hostname във формат <име-на-statefulset>-<индекс-на-pod>.
  2. Стабилно, постоянно хранилище. На всяка реплика на Pod се назначава собствен PersistentVolume. Дори при рестартиране на Pod, данните остават свързани с него.
  3. Подредено внедряване и мащабиране. Pod-овете се създават и изтриват в строго определен ред (по възходящ ред за създаване, по низходящ за изтриване).
  4. Подредено или паралелно обновяване. Поддържа както постепенни (rolling update), така и паралелни (in-place или parallel) обновявания, с контрол върху реда.

Примери за такива приложения:

  • Бази данни (MySQL, PostgreSQL, MongoDB)
  • Посредници на съобщения (Kafka, RabbitMQ)
  • Кеш системи (Redis, Memcached)
  • Разпределени файлови системи (например Ceph, ако се изпълнява в Kubernetes)
  • Всяко приложение, което трябва да запазва състояние между рестарти и да има постоянна идентификация.

За разлика от Deployment, където Pod-овете са взаимозаменяеми и без състояние, StatefulSet гарантира уникалност и запазване на състоянието за всяка реплика, което е критично за приложения, зависими от постоянно съхранение и стабилна мрежова идентификация.

Пример за най-прост StatefulSet за база данни:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Необходимо за стабилна мрежова идентификация на Pod-овете
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password" # В продукционна среда използвайте Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Път, където се монтира постоянното хранилище
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Име на шаблона PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Режим на достъп
      resources:
        requests:
          storage: 10Gi # Изискван обем за съхранение