Kubernetes进阶实战读书笔记:StatefulSet控制器(一)

一、状态和存储的关系

状态是进程的时间属性、无状态意味着一个进程不必跟踪过去的交互操作、本质上可以说它是一个纯粹的功能性行为、对应,有状态则以为桌进程存储了以前交互过程的记录、并且可以给予它对新的请求进行相应、至于状态信息被保存在内存中或者持久保存于磁盘上、则是另外一个问题

存储是标书持久保存数据的方法、现今通常是指机械硬盘或SSD设备。若进程仅需操作内存中的数据、则表示其无须进行磁盘I/O操作、则通常意味着数据的只读访问或读写访问行为

 

 

 

象限A中是那些具有读写磁盘需求的有状态应用程序、如支持事物功能的各种RDBMS存储系统、另外各种分布式存储系统也是此类应用程序的典型、如redis cluster MongoDB、Zookeeper和Cassandra等

象限B中包含两类应用程序:

  一类是那些具有读写磁盘需求的无状态应用程序、如具有幂等性的文件上传类服务程序;
  另一类是仅需只读类I/O访问的无状态应用程序、例如:从外部存储加载静态资源以相应用户请求的web服务程序

象限C中是无磁盘访问需要的无状态应用程序、如地理坐标转换器应用

象限D中是无磁盘访问需求的有状态应用程序、如电子商城程序中的购物车系统

设计有状态应用程序时需要着重考虑的另一个方面是数据持久存储的位置

二、StatefulSet控制器概述

1、ReplicaSetStatefulSet对比

ReplicaSet 管控下的pod资源更像是一群"家禽"、他们无状态、每个个体均被重构亦能保证不变、因此也就可在任意时刻被另一个具有不同标识的同类失误所取代、

而StatefulSet控制器下的pod资源更像是多个"宠物(pet)" 每一个实力都有着其特有的状态、即使被重构、也的与其前任拥有想用的表示、事实上在云原声用用的体系里有两组常用的近义词、第一组是无状态(stateless)、牧畜(cattle)、无名(nameless)和可丢弃(disposable)、它们都不可用于表述无状态应用、另一组是有状态(stateful)、宠物(pet)、具有(non-disposable),它们则都是可用于称呼有状态应用

2、StatefulSet的特性

  1. 稳定且唯一的网络标识符
  2. 稳定且持久的存储
  3. 有序、优雅地部署和扩展
  4. 有序、优雅地删除和中指
  5. 有序而自动地滚动更新

3、一个典型的StatefulSet组成

Headless Service
volumeClaimTemplates
StatefulSet

三、pv环境准备

1、pv配置清单

[root@master chapter7]# cat pv-demo.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path:  "/data/volumes/v1"
    server: node2
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path:  "/data/volumes/v2"
    server: node2
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path:  "/data/volumes/v3"
    server: node2
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path:  "/data/volumes/v4"
    server: node2
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path:  "/data/volumes/v5"
    server: node2
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 10Gi[root@master chapter7]# 

2、创建验证

[root@master chapter7]# kubectl apply -f pv-demo.yaml 
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created
[root@master chapter7]# kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                  STORAGECLASS   REASON   AGE
pv001         5Gi        RWO,RWX        Retain           Available                                                  6s
pv002         5Gi        RWO            Retain           Available                                                  6s
pv003         5Gi        RWO,RWX        Retain           Available                                                  6s
pv004         10Gi       RWO,RWX        Retain           Available                                                  6s
pv005         10Gi       RWO,RWX        Retain           Available                                                  6s

3、创建pv挂在目录

[root@node2 ~]# mkdir /data/volumes/v{1..5}
[root@node2 ~]# ls /data/volumes/
v1  v2  v3  v4  v5

 刚开始没有创建导致等待了近20分钟

四、创建StatefulSet对象

1、资源清单

[root@master chapter9]# cat stateful-demo.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  serviceName: myapp
  replicas: 2
  selector:
    matchLabels:
      app: myapp-pod
  template:
    metadata:
      labels:
        app: myapp-pod
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v5
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myappdata
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: myappdata
    spec:
      accessModes: ["ReadWriteMany","ReadWriteOnce"]
      resources:
        requests:
          storage: 2Gi

2、创建

[root@master chapter9]# kubectl apply -f stateful-demo.yaml 
service/myapp-svc created
statefulset.apps/myapp created

3、观察pod资源的顺次生成过程

[root@master ~]# kubectl get pods -l app=myapp-pod -w
NAME      READY   STATUS    RESTARTS   AGE
myapp-0   0/1     Pending   0          0s
myapp-0   0/1     Pending   0          0s
myapp-0   0/1     Pending   0          2s
myapp-0   0/1     ContainerCreating   0          2s
myapp-0   1/1     Running             0          5s
myapp-1   0/1     Pending             0          0s
myapp-1   0/1     Pending             0          0s
myapp-1   0/1     Pending             0          2s
myapp-1   0/1     ContainerCreating   0          2s
myapp-1   1/1     Running             0          5s
myapp-2   0/1     Pending             0          0s
myapp-2   0/1     Pending             0          0s
myapp-2   0/1     Pending             0          2s
myapp-2   0/1     ContainerCreating   0          2s
myapp-2   1/1     Running             0          14s

4、查看状态是否就绪

[root@master ~]# kubectl get statefulsets myapp
NAME    READY   AGE
myapp   2/2     19m
posted @ 2020-09-05 23:15  活的潇洒80  阅读(274)  评论(0编辑  收藏  举报