zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    在实体属性上通过注解格式化日期
    @Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated
    两种根据关键字查询的方法SQL
    excel批量导入数据
    下载excel模板
    上传人员照片
    身份证校验类
    把字符串参数分割成数组 传入SQL foreach遍历查询
    使用Hibernate-Validator优雅的校验参数
    如何使用Graphics2D在一张图片上画线(包括箭头)
  • 原文地址:https://www.cnblogs.com/luoahong/p/13603163.html
Copyright © 2011-2022 走看看