一般来说,k8s中的container大多为无状态(stateless),这样子进行cotroller进行rollout、rollback、pod self health时不需要为了还在执行中的request额外进行处理(ex:存到redis或是db里面记录)。
如果使用者的需求是要pod有办法持久性时,就需要使用kind :Statefulset 这种模式进行部署。
Statefulset跟Deployment在pod建立之後有一个很明显的差异点
Deployment : pod name後缀会带一组乱数,pod 重启後会重新产生新的名称
Statefulset : pod name後缀为有序的数字(my-redis-0,my-redis-1),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
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比较保险喔
今日题目 题目连结:747. Largest Number At Least Twice of Ot...
当需要以管理者身份去修改ODOO的时候,我们就要打开开发者模式,流程如下: 1.点击Setting图...
前言 接续上一篇RestController转成Reactive,可以看到逻辑的部分已经被抽到Han...
这次2021 iThome铁人赛得奖名单出炉啦,看了 @搋兔 写的排版神器 Tailwind CSS...
不要做没意义的事情来侵蚀自己的热忱 图形介面固然好用,但反覆操作同样的SOP,1次、10次,甚至是1...