statefulset控制器

deployment控制器:无状态应用的pod对象可以随时由其他由同一模板创建的pod平滑替代

statefulset控制器:k8s系统专门用于控制有状态应用

statefulset表示一组具有唯一持久身份和稳定主机名的pod对象,任何指定该类型pod的状态信息和其他弹性数据都存放在与该statefulset相关的永久性磁盘存储空间中。

适合部署kafka,mysql,redis,zookeeper以及其他需要唯一持久性身份和稳定主机名的应用

多数有状态应用都不支持规模性安全快速缩减操作,因此statefulset不支持并行缩容机制,而是严格遵循一次仅能终止一个pod资源的法则。

一个典型的完整可用的statefulset资源由2部分组成,headless service 和statefulset资源。前者用于为各pod固定唯一的标识符,生成可解析的dns资源记录,后者用于编排pod对象,并借助volumeClaimTemplate以静态或者动态的PV供给方式为各pod资源提供专有且固定的存储资源。删除pod对象或者statefulset控制器,并不会删除其相关的PV资源以确保数据可用性。

[root@k8s-master01 ~]# cat /yaml/demodb-statefulset.yaml 
apiVersion: v1
kind: Service
metadata:
  name: demodb
  namespace: statefulset
  labels:
    app: demodb
spec:
  clusterIP: None
  ports:
  - port: 9907
  selector:
    app: demodb

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: demodb
  namespace: statefulset
spec:
  selector:
    matchLabels:
      app: demodb
  serviceName: "demodb"
  replicas: 4
  template: 
    metadata:
      labels:
        app: demodb
    spec:
      containers:
      - name: demodb
        image: ikubernetes/demodb:v0.1
        ports:
        - containerPort: 9907
          name: db
        env:
        - name: DEMODB_DATADIR
          value: "/demodb/data"
        livenessProbe:
          initialDelaySeconds: 5
          periodSeconds: 10
          httpGet:
            path: /status
            port: db
        readinessProbe:
          initialDelaySeconds: 15
          periodSeconds: 30
          httpGet:
            path: /status?level=full
            port: db
        volumeMounts:
        - name: data
          mountPath: /demodb/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "rbd"
      resources:
        requests:
          storage: 1Gi


[root@k8s-master01 ~]# 
[root@k8s-master01 ~]# kubectl describe statefulsets/demodb -n statefulset
Name:               demodb
Namespace:          statefulset
CreationTimestamp:  Sun, 29 Aug 2021 15:39:31 +0800
Selector:           app=demodb
Labels:             <none>
Annotations:        <none>
Replicas:           4 desired | 1 total
Update Strategy:    RollingUpdate
  Partition:        0
Pods Status:        0 Running / 1 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=demodb
  Containers:
   demodb:
    Image:      ikubernetes/demodb:v0.1
    Port:       9907/TCP
    Host Port:  0/TCP
    Liveness:   http-get http://:db/status delay=5s timeout=1s period=10s #success=1 #failure=3
    Readiness:  http-get http://:db/status%3Flevel=full delay=15s timeout=1s period=30s #success=1 #failure=3
    Environment:
      DEMODB_DATADIR:  /demodb/data
    Mounts:
      /demodb/data from data (rw)
  Volumes:  <none>
Volume Claims:
  Name:          data
  StorageClass:  rbd
  Labels:        <none>
  Annotations:   <none>
  Capacity:      1Gi
  Access Modes:  [ReadWriteOnce]
Events:
  Type    Reason            Age   From                    Message
  ----    ------            ----  ----                    -------
  Normal  SuccessfulCreate  14m   statefulset-controller  create Pod demodb-0 in StatefulSet demodb successful

创建了4个副本,由于没有存储类rbd,导致pod没有运行,上面就只有一个处于waitting状态,因为statefulset控制器是在上一个pod运行起来才创建下一个pod副本

 

posted @ 2021-08-30 18:58  拥抱大海,面向天空  阅读(72)  评论(0)    收藏  举报