Middle
Որ ծրագրի համար պետք է օգտագործել StatefulSet փոխարեն Deployment և ինչու?
sobes.tech AI
Պատասխան AI-ից
StatefulSet-ը անհրաժեշտ է օգտագործել այն հավելվածների համար, որոնց համար անհրաժեշտ է.
- Տևական ցանցային նույնականացում։ Pod-երը ստանում են յուրահատուկ, մշտական hostname՝
<statefulset-name>-<pod-index>ձևաչափով։ - Տևական, կայուն պահեստ։ Յուրաքանչյուր Pod-ի ռեպլիկին վերապահվում է իր PersistentVolume-ը։ Даже при перезапуске Pod-ի, նրա տվյալները մնում են կապված նրա հետ։
- Կարգավորված տեղադրում և մասշտաբավորում։ Pod-երը ստեղծվում և ջնջվում են խիստ որոշված կարգով (բարձրացող ինդեքսով՝ ստեղծման ժամանակ, իջնող՝ ջնջման ժամանակ)։
- Կարգավորված կամ համաժամեցված թարմացումներ։ Հնարավոր է ինչպես աստիճանաբար (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 # Պահեստավորման պահանջվող չափը