Sobes.tech
Middle

Որ ծրագրի համար պետք է օգտագործել StatefulSet փոխարեն Deployment և ինչու?

sobes.tech AI

Պատասխան AI-ից

StatefulSet-ը անհրաժեշտ է օգտագործել այն հավելվածների համար, որոնց համար անհրաժեշտ է.

  1. Տևական ցանցային նույնականացում։ Pod-երը ստանում են յուրահատուկ, մշտական hostname՝ <statefulset-name>-<pod-index> ձևաչափով։
  2. Տևական, կայուն պահեստ։ Յուրաքանչյուր Pod-ի ռեպլիկին վերապահվում է իր PersistentVolume-ը։ Даже при перезапуске Pod-ի, նրա տվյալները մնում են կապված նրա հետ։
  3. Կարգավորված տեղադրում և մասշտաբավորում։ Pod-երը ստեղծվում և ջնջվում են խիստ որոշված կարգով (բարձրացող ինդեքսով՝ ստեղծման ժամանակ, իջնող՝ ջնջման ժամանակ)։
  4. Կարգավորված կամ համաժամեցված թարմացումներ։ Հնարավոր է ինչպես աստիճանաբար (rolling update), այնպես էլ միաժամանակ (in-place կամ parallel) թարմացումներ, բայց վերահսկելի կարգով։

Նման հավելվածների օրինակներ՝

  • Տվյալների բազաներ (MySQL, PostgreSQL, MongoDB)
  • Հաղորդագրության միջնորդներ (Kafka, RabbitMQ)
  • Կեշային համակարգեր (Redis, Memcached)
  • Տարածված ֆայլային համակարգեր (օրինակ՝ Ceph, եթե աշխատում է Kubernetes-ում)
  • Յուրաքանչյուր հավելված, որը պետք է պահի վիճակը վերագործարկումների միջև և ունենա կայուն նույնականացում։

Ի տարբերություն Deployment-ի, որտեղ Pod-երը փոխանակելի և stateless են, 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 # Պահեստավորման պահանջվող չափը