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: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rbd-provision
  namespace: xuyong-test-storage
subjects:
- kind: ServiceAccount
  name: rbd-provisioner
  namespace: xuyong-test-storage
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
---
kind: ServiceAccount
apiVersion: v1
metadata:
  name: rbd-provisioner
  namespace: xuyong-test-storage

storage-class 配置文件

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
  namespace: xuyong-test-storage
type: kubernetes.io/rbd
#type: kubernetes.io/rbd
data:
  key: xxxxxxxxxxxx
#上面的key填写,base64编码之后的真实的ceph的key,要不然会报错
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rbd
  namespace: xuyong-test-storage
parameters:
##这里的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/rbd
reclaimPolicy: Delete

statefulset配置文件

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: xuyong-test-storage
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: xuyong-test-storage
spec:
  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

[[email protected] 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://blog.51cto.com/8341475/2453303

时间: 2024-07-30 15:15:28

K8S statefulset 详解的相关文章

kubernetes之StatefulSet详解

概述 RC.Deployment.DaemonSetStatefulSet都是面向无状态的服务,它们所管理的Pod的IP.名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态的服务,比如MySQL.MongoDB集群等.StatefulSet本质上是Deployment的一种变体,它是t是为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识,还必须要用到共享存储,在v1.9版本中

k8s 配置文件 详解

apiVersion: v1 # [必须]版本号kind: Pod # [必选]Podmetadata: # [必选-Object]元数据 name: String # [必选] Pod的名称 namespace: String # [必选] Pod所属的命名空间 labels: # [List] 自定义标签列表 - name: String annotations: # [List] 自定义注解列表 - name: Stringspec: # [必选-Object] Pod中容器的详细定义 c

k8s应用配置详解

1. 概述 k8s主要通过Object定义各种部署任务(例如:部署应用.部署Ingress路由规则.部署service等等),通过kubectl命令远程操作k8s集群. Object的定义通常以Yaml格式进行描述. Yaml是一种直观的数据序列化格式,主要通过缩进的方式组织数据. Yaml例子: # 注释 house: family: name: Doe parents: # - 开始,表示数组元素 - John - Jane children: - Paul - Mark - Simone

k8s之yaml详解

k8s之yaml详解 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: web04-pod #资源的名字,在同一个namespace中必须唯一 labels: #设定资源的标签 k8s-app: apache version: v1 kubernetes.io/cluster-service: "true" annotations: #自

从零开始入门 K8s| 详解 Pod 及容器设计模式

作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 一.为什么需要 Pod 容器的基本概念 我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调度单位,但是为什么我们会需要这样一个概念呢?在使用容器 Docker 的时候,也没有这个说法.其实,如果想要理解 Pod,首先要理解容器,所以来回顾一下容器的概念: 容器的本质实际上是一个进程,是一个视图被隔离,资源受限的进程. 容器里面 PID=1 的进程就是应用本身,这意味着管理虚拟机等于管理基础设

kubernetes资源创建详解【持续完善中】

目录 资源创建详解 一:Pod及常用参数 1.简介 2.模板 3.删除pod 4.设置Pod主机名 5.镜像拉取策略(ImagePullPolicy) 二:RC 1.简介 2.模板 三:Deployment 1.简介 2.模板 四:HPA 1.简介 2.模板 五:StatefulSet 1.简介 2.模板 六:PV和PVC 八:扩展 8.1.Pod调度到指定的Node 资源创建详解 一:Pod及常用参数 1.简介 2.模板 3.删除pod 示例流程如下: 用户发送删除pod的命令,默认宽限期是3

详解 Kubernetes Pod 的实现原理

Pod.Service.Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用.工作负载.网络和磁盘资源,共同定义了集群的状态.Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合. Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元,想要彻底和完整的了解 Kubernetes 的实现原理,我们必须要清楚 Pod 的实现原理以及最佳实践. 在这里,我们将分两个部分对 Pod 进行解析,第一部分主要会从

Kubernetes之yaml文件详解-v1.15.x

Kubernetes之yaml文件详解 K8S 创建资源的方式 K8S有两种创建资源的方式:kubectl 命令和 yaml 配置文件. kubectl命令行:最为简单,一条命令就OK,但缺点也很明显,你并不知道这条命令背后到底做了哪些事!yaml配置文件:提供了一种让你知其然更知其所以然的方式.优势如下: 完整性:配置文件描述了一个资源的完整状态,可以很清楚地知道一个资源的创建背后究竟做了哪些事:灵活性:配置文件可以创建比命令行更复杂的结构:可维护性:配置文件提供了创建资源对象的模板,能够重复

Kubernetes YAML 文件全字段详解

Kubernetes YAML 文件全字段详解 Deployment yaml 其中主要参数都在podTemplate 中,DaemonSet StatefulSet 中的pod部分一样. apiVersion: v1 kind: Deployment metadata: name: <deploy-name> namespace: <ns-name> labels: <key>: <value> spec: replicas: 2 selector: ma