Sobes.tech
Middle

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