针对有状态的应用,多数是数据有状态,例如mongodb副本集等,我们希望数据能够在pod扩容、缩容时磁盘数据不会被丢弃,能够复用磁盘。我们使用StatefulSet完成这些。
# cat kubia-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet #使用了stateful
metadata:
name: kubia
spec:
serviceName: kubia
replicas: 2
selector:
matchLabels:
app: kubia
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: luksa/kubia-pet
ports:
- name: http
containerPort: 8080
volumeMounts:
- name: data
mountPath: /var/data
volumeClaimTemplates: #为每个pod申请了磁盘
- metadata:
name: data
spec:
resources:
requests:
storage: 20Gi
accessModes:
- ReadWriteOnce
storageClassName: "alicloud-disk-available"
$ k create -f kubia-statefulset.yaml
statefulset.apps/kubia created
$ k get all
NAME READY STATUS RESTARTS AGE
pod/kubia-0 1/1 Running 0 61s
pod/kubia-1 1/1 Running 0 46s
NAME READY AGE
statefulset.apps/kubia 2/2 61s
$ k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-kubia-0 Bound d-j6c3dilgxismppu271ed 20Gi RWO disk 7m39s
data-kubia-1 Bound d-j6c9x6t7z31woktn8jl3 20Gi RWO disk 7m24s
这样他们在随着容量变化时,总是能够对号入座,是不是很简单呢?另外StatefulSet相比ReplicaSet,操作基本都是相同的,所以扩缩容等管理我们就不重复了
# 如
$ kubectl scale statefulset kubia --replicas=3 1 ↵
statefulset.apps/kubia scaled