打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
K8S statefulset 详解

概述

StatefulSet
    RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。
StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。
在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。
除此之外,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为

   $(podname).(headless server name)      FQDN: $(podname).(headless server name).namespace.svc.cluster.local

StorageClass
    storageclass 是基于pv和pvc的扩展,可以帮助应用程序动态的创建pv和pvc,但是目前还不支持自动扩容。

以部署一个nginx为例子,Ceph的rbd磁盘为后端做列子

一.部署一个statefulset应用

rbac配置文件,这里为了防止出现权限的问题直接绑定了admin使用

kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: rbd-provision  namespace: xuyong-test-storagesubjects:- kind: ServiceAccount  name: rbd-provisioner  namespace: xuyong-test-storageroleRef:  kind: ClusterRole  name: cluster-admin  apiGroup: rbac.authorization.k8s.io---kind: ServiceAccountapiVersion: v1metadata:  name: rbd-provisioner  namespace: xuyong-test-storage

storage-class 配置文件

apiVersion: v1kind: Secretmetadata:  name: ceph-secret  namespace: xuyong-test-storagetype: kubernetes.io/rbd#type: kubernetes.io/rbddata:  key: ................#上面的key填写,base64编码之后的真实的ceph的key,要不然会报错---apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: rbd  namespace: xuyong-test-storageparameters:##这里的id填写ceph的用户  adminId: kubernetes-online  adminSecretName: ceph-secret  adminSecretNamespace: xuyong-test-storage  imageFormat: "2"  imagefeatures: layering  monitors: saas-ceph.internal.weimob.com:6789  pool: kubernetes-online  userId: kubernetes-online  userSecretName: ceph-secret  userSecretNamespace: xuyong-test-storage#类型默认provisioner: kubernetes.io/rbdreclaimPolicy: Delete

statefulset配置文件

apiVersion: v1kind: Servicemetadata:  name: nginx  namespace: xuyong-test-storage  labels:    app: nginxspec:  ports:  - port: 80    name: web  clusterIP: None  selector:    app: nginx---apiVersion: apps/v1kind: StatefulSetmetadata:  name: web  namespace: xuyong-test-storagespec:  selector:    matchLabels:      app: nginx # has to match .spec.template.metadata.labels  serviceName: "nginx"  #声明它属于哪个Headless Service.  replicas: 3 # by default is 1  template:    metadata:      labels:        app: nginx # has to match .spec.selector.matchLabels    spec:      terminationGracePeriodSeconds: 10      containers:      - name: nginx        image: ccr.ccs.tencentyun.com/weimob-public/nginx:1.16-centos7        ports:        - containerPort: 80          name: web        volumeMounts:        - name: www          mountPath: /usr/share/nginx/html  volumeClaimTemplates:   #可看作pvc的模板  - metadata:      name: www    spec:      accessModes: [ "ReadWriteOnce" ]      storageClassName: "rbd"  #存储类名,改为集群中已存在的      resources:        requests:          storage: 50Gi

注:rbd模式accessModes只支持 ReadWriteOnce和ReadonlyMany,且上面的service必须指定clusterip:none ,要不然会有问题。
查看效果:


排坑:

1.ecret的key必须base64编码
2.如果出现rbac问题,执行上面的rbac的文件
3.如果出现cpeh is not in $PATH这样的报错,这个是因为一个镜像拉不到,可以本地部署,使用本地部署的镜像,或者***拉镜像。
4.ceph-common的版本要同你服务器端使用的版本一致。


二.扩容磁盘

参考文档:https://www.520mwx.com/view/21456

由于statefulset默认不支持磁盘的扩容,所以需要利用ceph的接口来扩容磁盘,实施步骤如下:

1.查看pv对应的rbd image

[root@sh-saas-k8s1-master-pl-01 ceph-statefulset]# kubectl get pv pvc-ccb2ce5f-97e6-11e9-ac4b-52540006de2d -n=xuyong-test-storage -o yaml |grep image
image: kubernetes-dynamic-pvc-ccb7c9b1-97e6-11e9-be31-0a580afb018c

2.直接连接ceph需改rbd块大小

rbd resize --image kubernetes-dynamic-pvc-ccb7c9b1-97e6-11e9-be31-0a580afb018c --size 100000

3.找到pod所在的node节点,然后重新探测磁盘

blockdev --getsize64 /dev/rbd0
resize2fs /dev/rbd0

4.然后登入pod查看就能发现对应的磁盘大小已经被更改了

注:这个方法可以更改磁盘大小,但是pv和pvc还有storage-class的数据显示是假的,而且当是多个实例的时候,只能一个个改,比较麻烦。

来源:https://www.icode9.com/content-4-577801.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何在Kubernetes上部署MySQL数据库
Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
Using Existing Ceph Cluster for Kubernetes Persistent Storage
《基于Kubernetes的容器云平台实战》读书笔记
适合 Kubernetes 初学者的一些实战练习 (三)
Kubernetes 入门教程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服