前面有特別提到,redis這類應用程式如果需要保持資料持久化,不會因為重啟pod造成資料消失,就必須要建立statefulset,那麼這邊就來介紹如何建立redis的statefulsets。
要建立Statefulset,就要先建立headless service。
apiVersion: v1
kind: Service
metadata:
name: redis-service
labels:
app: redis
spec:
ports:
- name: redis-port
port: 6379
clusterIP: None
selector:
app: redis
appCluster: redis-cluster
再來建立有 statefulset 的 redis
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
selector:
matchLabels:
app: redis
serviceName: "redis"
replicas: 1
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
command: ["redis-server", "--appendonly", "yes"]
ports:
- containerPort: 6379
name: web
volumeMounts:
- name: redis-aof
mountPath: /data
volumeClaimTemplates:
- metadata:
name: redis-aof
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "gp2"
resources:
requests:
storage: 1Gi
這邊特別提一下這段設定
- name: redis
image: redis
command: ["redis-server", "--appendonly", "yes"]
可以看到command那邊提到appendonly,這個是什麼呢?
redis要持久化,除了pod設定改成statefulset外,也必須特別設定持久化。
有兩種方式:
RDB(Redis DataBasa file):
已指定間隔對資料進行snapshot儲存,然後在進行操作時,會fork出一個process進行操作,fork完成後主process就可以不受影響,不過由於其間隔複製的特性,有時會丟失資料。
AOF(Append-Only File):
透過fsync策略進行備份,有三種模式可以選:
在這邊介紹完了Statefulset範例後,也順便了解了redis持久化的設定,而除了Statefulset和ReplicaSet外,還有一個DaemonSet,因此下一章會介紹DaemonSet。