Kubernetes控制器之StatefulSet

Statefulset控制器

什么是Statefulset

StatefulSet是为了管理有状态服务的问题而设计的。

每个pod都有自己的唯一标识,故障时,它只能被拥有同一个标识的新实例所取代。

如果有必要,可以为每个pod配置专用的存储卷,且只能是PVC格式。通过pvc模板来为每个pod创建专用PV

Statefulset与其他控制器的区别

StatefulSet是有状态的集合,管理有状态的服务,它所管理的Pod的名称不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独有的数据持久化存储目录。比如MySQL主从、redis集群等。

RCDeploymentDaemonSet都是管理无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的。个体对整体无影响,所有pod都是共用一个数据卷的,部署的tomcat就是无状态的服务,tomcat被删除,在启动一个新的tomcat,加入到集群即可,跟tomcat的名字无关。

StatefulSet是由什么组成的

  • Headless Service:用来定义pod网路标识,生成可解析的DNS记录
  • StatefulSet:管理pod的
  • volumeClaimTemplates:存储卷申请模板,创建pvc,指定pvc名称大小,自动创建pvc,且pvc由存储类供应。

什么是Headless service

Headless service不分配clusterIP,headless service可以通过解析service的DNS,返回所有Pod的dns和ip地址 (statefulSet部署的Pod才有DNS),普通的service,只能通过解析service的DNS返回service的ClusterIP。

为什么要用headless service

在使用Deployment时,创建的Pod名称是没有顺序的,是随机字符串,在用Statefulset管理pod时要求pod名称必须是有序的 ,每一个pod不能被随意取代,pod重建后pod名称还是一样的。因为pod IP是变化的,所以要用Pod名称来识别。pod名称是pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称。

  1. headless service 会为 service 分配一个域名
<service name>.$<namespace name>.svc.cluster.local

K8s中资源的全局FQDN格式:
  Service_NAME.NameSpace_NAME.Domain.LTD.
  Domain.LTD.=svc.cluster.local.     #这是默认k8s集群的域名。

FQDN 全称 Fully Qualified Domain Name
即全限定域名:同时带有主机名和域名的名称
FQDN = Hostname + DomainName
如 主机名是 Darius
域名是 baidu.com
FQDN= Darius.baidu.com

  1. StatefulSet 会为关联的Pod保持一个不变的 Pod Name
StatefulSet中Pod的名字格式为$(StatefulSet name)-$(pod序号)
  1. StatefulSet 会为关联的 Pod 分配一个 dnsName
$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local

为什么要用volumeClaimTemplate

对于有状态应用都会用到持久化存储,比如mysql主从,由于主从数据库的数据是不能存放在一个目录下的,每个mysql节点都需要有自己独立的存储空间。而在deployment中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,它们数据是同步的,而statefulset定义中的每一个pod都不能使用同一个存储卷,这就需要使用volumeClainTemplate,当在使用statefulset创建pod时,volumeClainTemplate会自动生成一个PVC,从而请求绑定一个PV,每一个pod都有自己专用的存储卷。PodPVCPV 对应的关系图如下:

Kubernetes控制器之StatefulSet

StatefulSet配置规范

apiVersion: apps/v1  # API群组及版本;
kind: StatefulSet  # 资源类型的特有标识
metadata:
  name <string>  # 资源名称,在作用域中要唯一
  namespace <string>  # 名称空间;StatefulSet隶属名称空间级别
spec:
  replicas <integer# 期望的Pod副本数,默认为1
  selector <object> # 标签选择器,须匹配Pod模板中的标签,必选字段
  template <object>  # Pod模板对象,必选字段
  revisionHistoryLimit <integer# 滚动更新历史记录数量,默认为10
  updateStrategy <Object> # 滚动更新策略
    type <string>  # 滚动更新类型,可用值有OnDelete和Rollingupdate
    rollingUpdate <Object>  # 滚动更新参数,专用于RollingUpdate类型
      partition <integer>  # 分区指示索引值,默认为0
  serviceName  <string>  # 相关的Headless Service的名称,必选字段
  volumeClaimTemplates <[]Object>  # 存储卷申请模板
    apiVersion <string>  # PVC资源所属的API群组及版本,可省略
    kind <string>  # PVC资源类型标识,可省略
    metadata <Object>  # 卷申请模板元数据
    spec <Object>  # 期望的状态,可用字段同PVC
  podManagementPolicy  <string> # Pod管理策略,默认的“OrderedReady”表示顺序创
                                     #建并逆序删除,另一可用值“Parallel”表示并行模式

StatefulSet资源清单示例

apiVersion: v1
kind: Service
metadata:
  name: demoapp-sts
  namespace: default
spec:
  clusterIP: None
  ports:
  - port: 80
    name: http
  selector:
    app: demoapp
    controller: sts-demo
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-demo
spec:
  serviceName: demoapp-sts
  replicas: 2
  selector:
    matchLabels:
      app: demoapp
      controller: sts-demo
  template:
    metadata:
      labels:
        app: demoapp
        controller: sts-demo
    spec:
      containers:
      - name: demoapp
        images: ikubernetes/demoapp:v1.0
        ports:
        - name: web
          containerPort: 80
        volumeMounts:
        - name: appdata
          mountPath: /app/data
  volumeClaimTemplates:
  - metadata:
      name: appdata
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: longhorn
      resources:
        requests:
          storage: 2Gi
        limits:
          storage: 5Gi

StatefulSet示例

  1. 编写资源清单
root@k8s-master01:~/yaml/chapter08# vim demodb.yaml
apiVersion: v1
kind: Service
metadata:
  name: demodb
  namespace: default
  labels:
    app: demodb
spec:
  clusterIP: None
  ports:
  - port: 9907
  selector:
    app: demodb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: demodb
  namespace: default
spec:
  serviceName: demodb
  selector:
    matchLabels:
      app: demodb
  replicas: 2
  template:
    metadata:
      labels:
        app: demodb
    spec:
      containers:
      - name: demodb-shard
        image: ikubernetes/demodb:v0.1
        ports:
        - containerPort: 9907
          name: db
        env:
        - name: DEMODB_DATADIR
          value: "/demodb/data"
        livenessProbe:
          initialDelaySeconds: 2
          periodSeconds: 10
          httpGet:
            path: /status
            port: db
        readinessProbe:
          initialDelaySeconds: 15
          periodSeconds: 30
          httpGet:
            path: /status?level=full
            port: db
        volumeMounts:
        - name: data
          mountPath: /demodb/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: longhorn
      resources:
        requests:
          storage: 2Gi
        limits:
          storage: 5Gi
  1. 应用配置清单
root@k8s-master01:~/yaml/chapter08# kubectl apply -f demodb.yaml
service/demodb created
statefulset.apps/demodb created
  1. 查看pod信息
root@k8s-master01:~/yaml/chapter08# kubectl get pods
NAME                                             READY   STATUS              RESTARTS   AGE
demodb-0                                         1/1     Running             0          3m
demodb-1                                         1/1     Running             0          2m
demodb-2                                         1/1     Running             0          1m

root@k8s-master01:~/yaml/chapter08# kubectl get sts
NAME     READY   AGE
demodb   3/3     4m

StatefulSet扩容

对镜像更新有3种方法:

  1. 修改资源配置清单后 apply
  2. 使用 kubectl set 命令
  3. 使用 kubectl patch 命令打补丁
# 对sts扩容
root@k8s-master01:~# kubectl patch statefulsets.apps demodb -p '{"spec":{"replicas":5}}'
statefulset.apps/demodb patched

# 查看扩容后的pod
root@k8s-master01:~# kubectl get pods -l 'app=demodb'
NAME       READY   STATUS    RESTARTS   AGE
demodb-0   1/1     Running   0          118m
demodb-1   1/1     Running   0          117m
demodb-2   1/1     Running   0          116m
demodb-3   1/1     Running   0          106s
demodb-4   0/1     Running   0          43s

StatefulSet缩容

  1. 使用 patch 进行缩容
root@k8s-master01:~# kubectl patch statefulsets.apps demodb -p '{"spec":{"replicas":2}}'
statefulset.apps/demodb patched
# 此时多余的pod已经被删减
  1. 查看其所关联的pvc
root@k8s-master01:~# kubectl get pvc
NAME                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-demodb-0           Bound    pvc-04997889-b711-4168-bb4c-54189c8f481f   2Gi        RWO            longhorn       3h30m
data-demodb-1           Bound    pvc-2d3e2083-659f-42ae-a289-99b2aa4199ea   2Gi        RWO            longhorn       3h29m
data-demodb-2           Bound    pvc-7017741e-4eef-42a2-8aba-409e6c680c3f   2Gi        RWO            longhorn       3h28m
data-demodb-3           Bound    pvc-2c82047a-8959-4f79-9cca-bcc0517d77da   2Gi        RWO            longhorn       93m
data-demodb-4           Bound    pvc-f5dc549c-1198-43aa-a39e-7dd36edea642   2Gi        RWO            longhorn       92m

# PVC依旧存在



原文始发于微信公众号(TechOps之窗):Kubernetes控制器之StatefulSet

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/290215.html

(0)
码上实战的头像码上实战

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!