[DAY12]就是要持久-Statefulset

一般来说,k8s中的container大多为无状态(stateless),这样子进行cotroller进行rollout、rollback、pod self health时不需要为了还在执行中的request额外进行处理(ex:存到redis或是db里面记录)。
如果使用者的需求是要pod有办法持久性时,就需要使用kind :Statefulset 这种模式进行部署。
Statefulset跟Deployment在pod建立之後有一个很明显的差异点

pod name

Deployment : pod name後缀会带一组乱数,pod 重启後会重新产生新的名称
Statefulset : pod name後缀为有序的数字(my-redis-0,my-redis-1),pod 重启名称不变

特性

  • 持久化储存资料,主要是使用PVC(Persistent Volume Claim) 就算是pod重启依然可以读到持久化资料,使用Deployment的话,重启资料就跟着原pod一起去了。
  • 网路标签不变,PodName和HostName不会随着POD重启改变。
  • 有序,Statefulset在部署时名称是从0到N,跟着目前序号延伸下去,基本上就是0,1,2,3,4....这样子排,删除时也一样,从後面删回去,然後部署或是扩pod时需要一个pod ready了才会继续做下去,不像Deployment会同时部署pod

从下面执行就可以看的出来Deployment跟Statefulset pod name很明显的差异性

kubectl get pods 
NAME                                 READY   STATUS    RESTARTS   AGE
my-app-66f5d9f844-8z54q               1/1     Running   0          1d
my-app-redis-0                        1/1     Running   0          1d
my-app-redis-7f6b9d4875-k27zl         1/1     Running   0          1d

动手写yaml

apiVersion: v1
kind: Service
metadata:
  name: my-app-redis
  labels:
    app: redis
spec:
  type: ClusterIP
  ports:
    - port: 6379
      targetPort: 6379
      protocol: TCP
      name: redis
  selector:
    app: my-app-redis
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-app-redis
spec:
  serviceName: "my-app-redis"
  replicas: 2
  selector:
    matchLabels:
      app: my-app-redis
  template:
    metadata:
      labels:
        app: my-app-redis
    spec:
      containers:
      - name: my-app-redis
        image: redis:5.0.5
        args: ["--appendonly", "yes", "--save", "600", "1"]
        ports:
          - name: redis
            containerPort: 6379
            protocol: TCP
        volumeMounts:
          - name: data
            mountPath: /data
        resources:{}
    volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 4Gi

Deployment最大差异点在於volumeClaimTemplates,定义了pvc,这样子pod就会把redis资料放进在pvc里面,就算是pod重启也没差,因为重启後,redis会把放在pvc里面的data重新载入回来,达成持久化的特性

心得

目前会用到Statefulset的主要是redis,但是根据redis pod的使用情境不同,也不一定需要用到Statefulset,如果redis的用途主要是做cache用,redis没资料时才会打到db,那也可以用Deployment就好,但是redis会存有状态的资料时,使用上还是要用Statefulset比较保险喔


<<:  this指向who(下)

>>:  Day5 - 关於订阅报价、订阅数上限及计算方式

Day 3:747. Largest Number At Least Twice of Others

今日题目 题目连结:747. Largest Number At Least Twice of Ot...

Day2 Let's ODOO: 开发者模式

当需要以管理者身份去修改ODOO的时候,我们就要打开开发者模式,流程如下: 1.点击Setting图...

[Day 24] Reactive Programming - Spring WebFlux(Router)

前言 接续上一篇RestController转成Reactive,可以看到逻辑的部分已经被抽到Han...

TailWind CSS 使用套件还是可以轻松客制化样式

这次2021 iThome铁人赛得奖名单出炉啦,看了 @搋兔 写的排版神器 Tailwind CSS...

想要拿到更多的分红,且无脑的完成任务

不要做没意义的事情来侵蚀自己的热忱 图形介面固然好用,但反覆操作同样的SOP,1次、10次,甚至是1...