Statefulset控制器
什么是Statefulset
StatefulSet
是为了管理有状态服务的问题而设计的。
每个pod
都有自己的唯一标识,故障时,它只能被拥有同一个标识
的新实例所取代。
如果有必要,可以为每个pod配置专用的存储卷
,且只能是PVC格式
。通过pvc模板来为每个pod创建专用PV
。
Statefulset与其他控制器的区别
StatefulSet
是有状态的集合,管理有状态
的服务,它所管理的Pod
的名称不能随意变化
。数据持久化的目录也是不一样,每一个Pod
都有自己独有的数据持久化存储目录。比如MySQL主从、redis集群等。
RC
、Deployment
、DaemonSet
都是管理无状态
的服务,它们所管理的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一个唯一的名称。
-
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
-
StatefulSet
会为关联的Pod保持一个不变的Pod Name
StatefulSet中Pod的名字格式为$(StatefulSet name)-$(pod序号)
-
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都有自己专用的存储卷。Pod
、PVC
和 PV
对应的关系图如下:
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示例
-
编写资源清单
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
-
应用配置清单
root@k8s-master01:~/yaml/chapter08# kubectl apply -f demodb.yaml
service/demodb created
statefulset.apps/demodb created
-
查看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种方法:
-
修改资源配置清单后 apply
-
使用 kubectl set
命令 -
使用 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缩容
-
使用 patch
进行缩容
root@k8s-master01:~# kubectl patch statefulsets.apps demodb -p '{"spec":{"replicas":2}}'
statefulset.apps/demodb patched
# 此时多余的pod已经被删减
-
查看其所关联的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