Kubernetes-ში deployment და stateful set-ის შორის რა განსხვავებაა?
sobes.tech AI
პასუხი AI-სგან
Deployment დოკუმენტურად უზრუნველყოფს Pod-ების და ReplicaSet-ების განახლებას. ძირითადი მიზანია სტატeless პროგრამების მართვა. Deployment-ის მიერ შექმნილი Pod-ები იდენტურია და ურთიერთგამომრიცხავია. მასშტაბირების ან განახლებების დროს Pod-ები შეიძლება სრულად შეიცვალოს ახალი Pod-ებით. Pod-ების იდენტობის (სახელი, ქსელური იდენტობა) ან მათი შექმნის/წაშლის წესრიგის შენარჩუნება არ არის გარანტირებული. გამოიყენება ვებ სერვერებისთვის, მიკროწესვერვებისთვის, რომლებიც არ ინახავენ სტატუსს.
StatefulSet განკუთვნილია stateful პროგრამების მართვისთვის. ის უზრუნველყოფს სტაბილურ ქსელურ იდენტობას, სტაბილურ მუდმივ შენახულობას და მკაცრად მოწესრიგებულ განლაგებას/მაშტაბირებას/წაშლას Pod-ების. თითოეულ Pod-ს აქვს უნიკალური, სტაბილური hostname (მაგ., <statefulset-name>-<ordinal-index>) და დაკავშირებულია PersistentVolumeClaim-თან, რომელიც გარანტიას იძლევა მონაცემების შენახვისთვის. შესაფერისია მონაცემთა ბაზებისთვის (PostgreSQL, MySQL), განაწილებული სისტემებისთვის (Kafka, ZooKeeper).
ძირითადი განსხვავებები განლაგებულია ცხრილში:
| მახასიათებელი | Deployment | StatefulSet |
|---|---|---|
| პროგრამების ტიპი | Stateless (არასამყარო) | Stateful (სამყარო) |
| Pod-ების იდენტობა | უნიკალური, ურთიერთგამომრიცხავი | უნიკალური, სტაბილური (hostname, ID) |
| შექმნის/წაშლის წესრიგი | თავისუფალი | მკაცრად მოწესრიგებული |
| მონაცემთა შენახვა | დროებითი, გარანტია არ არის შენახვისთვის | სტაბილური, მუდმივი (PVC-ის საშუალებით) |
| ქსელური იდენტობა | თავისუფალი, იცვლება Pod-ის შეცვლისას | სტაბილური, შენარჩუნებულია (Headless Service-ის საშუალებით) |
| მაშტაბირება | პარალელური | თანმიმდევრული, წესრიგით |
StatefulSet-ის მაგალითი:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-stateful-app
spec:
serviceName: "my-stateful-service" # Headless Service
replicas: 3
selector:
matchLabels:
app: my-stateful-app
template:
metadata:
labels:
app: my-stateful-app
spec:
containers:
- name: my-container
image: my-image:latest
ports:
- containerPort: 80
volumeMounts:
- name: my-persistent-storage
mountPath: /data # მონტაჟის გზა
volumeClaimTemplates: # შაბლონი PersistentVolumeClaim-ის შექმნისთვის
- metadata:
name: my-persistent-storage # ტომის სახელი, მითითებულია volumeMounts-ში
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard" # შენახვის კლასი
resources:
requests:
storage: 1Gi # მოთხოვნილი მოცულობა
Deployment-ის მაგალითი:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-stateless-app
spec:
replicas: 3
selector:
matchLabels:
app: my-stateless-app
template:
metadata:
labels:
app: my-stateless-app
spec:
containers:
- name: my-container
image: my-image:latest
ports:
- containerPort: 80