kubernetes学习控制器之StatefulSet控制器

StatefulSet介绍

一、StatefulSet概述
StatefulSet是用来管理stateful(有状态)应用的
StatefulSet管理Pod时,确保Pod有一个按序增长的ID
与Deployment最大的不同是StatefulSet始终将一系列不变的名字分配给Pod.这些Pod从一个模板创建,但是并不能相互替换
二、StatefulSet使用场景
对于有如下要求的应用程序,StatefulSet非常适用
需要稳定、唯一的网络标识(dnsname)
每个Pod始终对应各自的存储路径(PersistantVolumeClaimTemplate)
按顺序的增加副本、减少副本,并在减少副本时执行清理
安顺序自动的执行滚动更新

如果一个应用不需要一个稳定的网络标识,或者不需要按顺序部署、删除、增加副本,应该用deployment(无状态)控制器

三、StatefulSet的限制

Pod的存储要么由storage clas对应的PersistentVolume Provisioner提供,要么由集群管理员事先创建

删除或scale down一个StatefulSet将不会删除其对应的数据卷,这样保证数据安全

删除StatefulSet时,将无法保证Pod正常终止.如果要按顺序优雅的终止StatefulSet中的Pod,可以在删除StatefulSet之前,将scale down 到0 

当使用默认的Pod Management Policy(OrderedReady)进行滚动更新时,可能进入一个错误状态,并需要人工介入

用一个StatefulSet实例深入了解

创建StatefulSet实例

下面是一个StatefulSet的例子,由如下内容组成:

  • 一个名为nginx-service的Headless service,用于控制网络域
  • 一个名为web的StatefulSet,副本为2
apiVersion: v1
kind: Service
metadata:
  name: nginx-service    #headless service的名称
  labels:
    app: nginx   #自定义标签
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx   #关联app: nginx的pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web-d      #statefulset控制器的名称
spec:
  selector:
    matchLabels:
      app: nginx    #关联app: nginx的pod进行控制
  serviceName: "nginx-service" #指定headless service
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx  #pod的标签
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx   #pod里容器的名称
        image: nginx:1.7.9
        ports:
        - containerPort: 80
          name: web

Pod的标识

StatefulSet中的Pod具备一个唯一标识,该标识由以下几部分组成

  • 序号
  • 稳定的网络标识
  • 稳定的存储

序号

假设一个StatefulSet的副本数为N,其中每个Pod都会被分配一个需要,序号的取值范围从0开始,并且该需要在StatefulSet是唯一的.

Pod的Name是StatefulSet的Name + 序号;比如这个配置文件里,有两个副本,第一个Pod的Name就是web-d-0,第二个Pod的Name就是web-d-1

稳定的网络ID

1)StatefulSet中Pod的hostname格式为$(statefulSet name)-$(Pod序号),上面的例子将要创建2个Pod,第一个Pod的Name为:web-d-0,第二个Pod的Name为web-d-1

2)StatefulSet可以使用Headless service来控制其Pod所在的域;该域(domain)的格式为: $(service name).$(namespace).svc.cluster.local;

上面例子的域就是:nginx-service.defaule.svc.cluster.local

3)StatefulSet中每个Pod都被分配一个dnsNmae,格式为:$(pod name).$(所在域)

上面的例子 Pod的dnsName就是 web-d-0.nginx-server.default.svc.cluster.local,其他pod可以通过这个地址找到它

猜你喜欢

转载自www.cnblogs.com/chadiandianwenrou/p/11934700.html