k8s笔记之StatefulSet

StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括
1、稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
2、稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
3、有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现有序收缩,有序删除(即从N-1到0)

1.(提前准备好nfs存储,之前有提过)
创建四个目录作为pv,分别对应于pv01、pv02、pv03、pv04

[root@master-01 statefulset]# ls /data/

 pv-volume pv-volume2 pv-volume-test1 pv-volume-test2

2.创建pv

[root@master-01 statefulset]# cat pv.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01
  labels:
    nfs-label: pv01
    name: pv01
spec:
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 2Gi

  nfs:
    server: 10.1.1.10    
    path:  /data/pv-volume
  storageClassName: local-storage
---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02
  labels:
    nfs-label: pv02
    name: pv02
spec:
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 2Gi

  nfs:
    server: 10.1.1.10
    path:  /data/pv-volume2
  storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03
  labels:
    nfs-label: pv03
    name: pv03
spec:
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 2Gi

  nfs:
    server: 10.1.1.10
    path:  /data/pv-volume-test1
  storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv04
  labels:
    nfs-label: pv04
    name: pv04
spec:
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 2Gi

  nfs:
    server: 10.1.1.10
    path:  /data/pv-volume-test2
  storageClassName: local-storage

[root@master-01 statefulset]# kubectl apply -f pv.yaml 
persistentvolume/pv01 created
persistentvolume/pv02 created
persistentvolume/pv03 created
persistentvolume/pv04 created
[root@master-01 statefulset]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS    REASON   AGE
pv01   2Gi        RWX            Retain           Available           local-storage            5s
pv02   2Gi        RWX            Retain           Available           local-storage            5s
pv03   2Gi        RWX            Retain           Available           local-storage            5s
pv04   2Gi        RWX            Retain           Available           local-storage            5s

3.创建statefulset绑定pv

[root@master-01 statefulset]# cat myapp-stateful.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp-statefulset-test
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      imagePullSecrets:
      - name: regsecret
      containers:
      - name: myapp
        image: "harbor-ali.abc.com/k8s_img/myapp:v1"
        imagePullPolicy: Always
        ports:
        - name: http
          containerPort: 80
        volumeMounts:
        - name: myappdata
          mountPath: /usr/share/nginx/html
  serviceName: myapp
  selector:
    matchLabels:
      app: myapp
  volumeClaimTemplates:
  - metadata:
      name: myappdata
    spec:
      storageClassName: local-storage #存储卷名与pv的存储卷名对应
      accessModes: ["ReadWriteMany"]  
      resources:
        requests:
          storage: 2Gi
[root@master-01 statefulset]# kubectl apply -f myapp-stateful.yaml 
statefulset.apps/myapp-statefulset-test created
[root@master-01 statefulset]# kubectl get sts
NAME                     READY   AGE
myapp-statefulset-test   2/2     11s
[root@master-01 statefulset]# kubectl get pvc
NAME                                 STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS    AGE
myappdata-myapp-statefulset-test-0   Bound    pv04     2Gi        RWX            local-storage   27s
myappdata-myapp-statefulset-test-1   Bound    pv01     2Gi        RWX            local-storage   23s
[root@master-01 statefulset]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                        STORAGECLASS    REASON   AGE
pv01   2Gi        RWX            Retain           Bound       default/myappdata-myapp-statefulset-test-1   local-storage            6m31s
pv02   2Gi        RWX            Retain           Available                                                local-storage            6m31s
pv03   2Gi        RWX            Retain           Available                                                local-storage            6m31s
pv04   2Gi        RWX            Retain           Bound       default/myappdata-myapp-statefulset-test-0   local-storage            6m31s

从结果可以看出statfulset会自动创建pvc并与相应的pod绑定

查看创建的Pod,他们都是有序的

[root@master-01 statefulset]# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
myapp-statefulset-test-0               1/1     Running   0          3m17s
myapp-statefulset-test-1               1/1     Running   0          3m13s

可以pv的结果可以看到pv02/pv03是空闲未被绑定的
更新pod个数把副本数改为3,stateful会自动选择合适的pvc与之绑定

[root@master-01 statefulset]# kubectl patch statefulset myapp-statefulset-test -p '{"spec":{"replicas":3}}'

statefulset.apps/myapp-statefulset-test patched
[root@master-01 statefulset]# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
myapp-statefulset-test-0               1/1     Running   0          6m23s
myapp-statefulset-test-1               1/1     Running   0          6m19s
myapp-statefulset-test-2               1/1     Running   0          92s

[root@master-01 statefulset]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                        STORAGECLASS    REASON   AGE
pv01   2Gi        RWX            Retain           Bound       default/myappdata-myapp-statefulset-test-1   local-storage            11m
pv02   2Gi        RWX            Retain           Bound       default/myappdata-myapp-statefulset-test-2   local-storage            11m
pv03   2Gi        RWX            Retain           Available                                                local-storage            11m
pv04   2Gi        RWX            Retain           Bound       default/myappdata-myapp-statefulset-test-0   local-storage            11m

pv02已绑定到新的pod

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353