Day17-维稳? StatefulSet介绍

在pod的生态中,本身就是一个小小世界,新旧pod之间通常不影响,当建立新的pod时,基本上不会跟被删除的pod有所关联。
因此当想要储存状态时就会很麻烦,只要pod重启,里面的内容就会消失,那麽这时该怎麽处理呢?
就是statefulset上场的时候了。

StatefulSets

需要用到StatefulSets的情况没那麽常见,但是当你服务拥有以下要求,就会需要StatefulSets了:

  1. 稳定&独立的网路标签(固定的pod name或 host name)
  2. 稳定的persistent storage(当关掉电源後资料不会因此消失,还是能存取相同资料的储存库,挥发式储存库的相反(Volatile storage 当电源关闭後,资料就会消失))
  3. 有序 逐一缓慢地扩充(scaling)和部属(deployment)的pod
  4. 有序 自动地滚动更新(rolling updates)的pod

上面这些情境都适合StatefulSets。

限制

使用StatefulSets会有以下限制

  1. pod的储存必须PersistentVolume Provisioner基於storage class或者管理者事先提供。
  2. 基於资料安全,扩充(scaling)以及删除不会删掉相关的储存卷(volumes)。
  3. 需要Headless Service来处理pod的network identity。

范例

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi

(来源:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)

上面的范例有几个重点:

  1. 名为nginx的Headless Service,用於控制网路的domain。
  2. 名为web的StatefulSet,依照spec可看出会有三个nginx的容器被建立在独立的pod中。
  3. volumeClaimTemplates透过PersistentVolume Provisioner提供稳定的储存库。

上面这种yaml档就可以建立出StatefulSet了,在这章简单带过StatefulSet的使用情境以及yaml,下一章则会介绍StatefulSet内pod的Identity和扩充以及更新策略。


<<:  【Day14】[资料结构]-二元树走访Binary Tree Traversal

>>:  Angular ngIf 与 Async Pipe

D29. 学习基础C、C++语言

D29. C++字串 C++ string的特别用法 str.size():字串长度。 str.em...

【把玩Azure DevOps】Day25 接收Azure DevOps的通知:Microsoft Teams频道中的连结器

我相信如果是使用微软产品的公司,大多数也都有使用Microsoft Teams作为公司内部的IM讯息...

Day 11 - Confusion Matrix 混淆矩阵-模型的好坏 (1)

如何验证正确率, 或如何辨别机器学习模型的好坏? 我们常使用Confusion Matrix[混淆矩...

Day-27 : Model 一对多

续上一篇,今天要来讲的是一对多 还记得吗?我们昨天说的 我们希望每一间商店可以贩售许多种商品,这就是...

Day 18 实作表单 (1)

前言 今天我们要开始使用 Flask-WTF 来做表单,我们要做的表单还不少,但我们每个都会实作。他...