Box

Allgemein

Profil

Deployment vs StatefulSet » Historie » Revision 2

Revision 1 (Peter Pfläging, 18.03.2022 16:17) → Revision 2/3 (Peter Pfläging, 18.03.2022 16:29)

# Deployment-vs-StatefulSet 

 Taking PostgreSQL as example, ... example: 

 What is the main difference: 

 - in a StatefulSet you declare the PVC's inside your `spec` as `volumeClaimTemplate` 
 - you don't declare `strategy`. This is a construct for Deployments 
 - the `template` part is equal in both implementations 

 Though it's quite easy to convert a Deployment to a StatefulSet in your definition or vice versa. 

 But keep in mind: 

 - like in the example down below it is not a good idea to scale up a PostgreSQL Deployment. This will cause some confusion, because you have to pods running on the same persistent after this. 
 - on the other hand: if you scale up the StatefulSet, the StatefulSet will create an additional PVC and will mount this on the second pod. This may be better, but not what you want.  
   You now have to independent databases and maybe a SVC pointing on both databases ;-). 


 ## StatefulSet 

 ```yaml 
 kind: StatefulSet 
 apiVersion: apps/v1 
 metadata: 
   name: postgresql 
 spec: 
   replicas: 1 
   serviceName: postgresql 
   selector: 
     matchLabels: 
       app: postgresql 
   template: 
     metadata: 
       creationTimestamp: null 
       labels: 
         app: postgresql 
     spec: 
       containers: 
         - name: postgresql 
           image: docker.io/centos/postgresql-12-centos8:latest 
           envFrom: 
             - secretRef: 
                 name: database 
           ports: 
             - name: postgresql 
               containerPort: 5432 
               protocol: TCP 
           resources: 
             requests: 
               cpu: "200m" 
               memory: "128Mi" 
             limits: 
               cpu: "400m" 
               memory: "256Mi" 
           readinessProbe: 
             tcpSocket: 
               port: 5432 
             timeoutSeconds: 1 
             periodSeconds: 10 
             successThreshold: 1 
             failureThreshold: 3 
           livenessProbe: 
             tcpSocket: 
               port: 5432 
             timeoutSeconds: 1 
             periodSeconds: 10 
             successThreshold: 1 
             failureThreshold: 3 
           volumeMounts: 
             - name: postgresql 
               mountPath: /var/lib/pgsql/data 
           terminationMessagePath: /dev/termination-log 
           terminationMessagePolicy: File 
           imagePullPolicy: Always 
       restartPolicy: Always 
       terminationGracePeriodSeconds: 10 
       dnsPolicy: ClusterFirst 
       securityContext: {} 
       schedulerName: default-scheduler 
   volumeClaimTemplates: 
     - metadata: 
         name: postgresql 
         labels: 
           app: postgresql 
       spec: 
         accessModes: 
           - ReadWriteOnce 
         storageClassName: changed-by-upper-kustomize 
         volumeMode: Filesystem 
         resources: 
           requests: 
             storage: 500Mi 
 ``` 

 ## Deployment 

 Here we have a split. We have to explicit declare the PVC: 

 ```yaml 
 --- 
 kind: Deployment 
 apiVersion: apps/v1 
 metadata: 
   name: postgresql 
 spec: 
   replicas: 1 
   selector: 
     matchLabels: 
       app: postgresql 
   template: 
     metadata: 
       labels: 
         app: postgresql 
     spec: 
       containers: 
         - name: postgresql 
           image: docker.io/centos/postgresql-12-centos8:latest 
           envFrom: 
             - secretRef: 
                 name: database 
           resources: 
             requests: 
               cpu: "200m" 
               memory: "128Mi" 
             limits: 
               cpu: "400m" 
               memory: "256Mi" 
           readinessProbe: 
             tcpSocket: 
               port: 5432 
             timeoutSeconds: 1 
             periodSeconds: 10 
             successThreshold: 1 
             failureThreshold: 3 
           livenessProbe: 
             tcpSocket: 
               port: 5432 
             timeoutSeconds: 1 
             periodSeconds: 10 
             successThreshold: 1 
             failureThreshold: 3 
           volumeMounts: 
             - name: postgresql 
               mountPath: /var/lib/pgsql/data 
           terminationMessagePath: /dev/termination-log 
           terminationMessagePolicy: File 
           imagePullPolicy: Always 
       restartPolicy: Always 
       terminationGracePeriodSeconds: 10 
       dnsPolicy: ClusterFirst 
       securityContext: {} 
       schedulerName: default-scheduler 
       volumes: 
       - name: postgresql 
         persistentVolumeClaim: 
           claimName: postgresql 
   strategy: 
     type: RollingUpdate 
     rollingUpdate: 
       maxUnavailable: 25% 
       maxSurge: 25% 
   revisionHistoryLimit: 10 
   progressDeadlineSeconds: 600 
 --- 
 kind: PersistentVolumeClaim 
 apiVersion: v1 
 metadata: 
   name: postgresql 
 spec: 
   accessModes: 
     - ReadWriteOnce 
   resources: 
     requests: 
       storage: 2Gi 
   storageClassName: changed-by-upper-kustomize 
   volumeMode: Filesystem 
 ```