`
lykops
  • 浏览: 86296 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

在K8s中创建StatefulSet

 
阅读更多

在K8s中创建StatefulSet

遇到的问题:

使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个来保证可用性,但是由于是无状态的,Pod挂了的时候与之前的Volume的关系就已经断开了,新起来的Pod无法找到之前的Pod。但是对于用户而言,他们对底层的Pod挂了没有感知,但是当Pod挂了之后就无法再使用之前挂载的磁盘了。

解决方案

使用K8s v1.5版本推出的StatefulSet可以保留Pod的状态。

参考博客

因为Kubernetes1.5版本发布也没过多久,国内的资料相当的少,除了tonybai等大客上有一些StatefulSet的资料外,只能去外网上搜索了。通过在google上搜索StatefulSet的创建方式,最终发现了一篇英文博客,链接如下。对于这种新兴框架,还是要多去google啊。

https://thenewstack.io/deploy-highly-available-wordpress-instance-statefulset-kubernetes-1-5/

如何创建

在创建StatefulSet之前需要准备的东西,值得注意的是创建顺序非常关键,创建顺序如下:

  • 1、Volume
  • 2、Persistent Volume
  • 3、Persistent Volume Claim
  • 4、Service
  • 5、StatefulSet

Volume可以有很多种类型,比如nfs、glusterfs等,我们这里使用的ceph RBD来创建。

创建Volume

sudo rbd create {volume_name} --size 1024 -m {ceph-monitor-ip} -k /etc/ceph/ceph.client.admin.keyring
//禁止掉一些rdb的feature,否则挂载会失败
rbd feature disable volume101 exclusive-lock, object-map, fast-diff, deep-flatten

创建PersistentVolume

创建pv.yaml,内容如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: {pv_name}
  labels:
    {label_key}:{label_value}
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  rbd:
    monitors:
      - {ceph-monitor-ip}
    pool: rbd
    image: {volume_name}
    user: admin
    secretRef:
      name: ceph-secret
    fsType: ext4
    readOnly: false
  persistentVolumeReclaimPolicy: Recycle

使用

kubectl create -f pv.yaml

来创建PV。

创建PersistentVolumeClaim

这一步非常非常的关键,因为如果创建的PVC的名称和StatefulSet中的名称没有对应上,那么StatefulSet中的Pod就肯定创建不成功,我在这一步被卡了一天之久,还好看到上面那篇外文博客,才发现PVC和StatefulSet中的命名的规律。接下来细说一下需要注意的地方。

创建pvc.yaml如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-mysql-0
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

我们在这里创建了一个叫做db-mysql-0的PVC,这个名字是不是很奇怪,而且在这个yaml里并没有提到PV的名字,所以PV和PVC是怎么bound起来的呢?是通过labels标签下的key:value键值对来进行匹配的,我们在创建PV时指定了label的键值对,在PVC里通过selector可以指定label。

然后再回到这个PVC的名称定义:db-mysql-0,为什么叫这样一个看似有规律的名字呢,这里需要看一下下一小节创建StatefulSet中的yaml,首先我们看到StatefulSet的name叫mysql,设置的replicas为2个,volumeMounts和volumeClaimTemplates的name必须相同,为db,所以StatefulSet创建的第一个Pod的name应该为mysql-0,第二个为mysql-1。这里StatefulSet中的Pod与PVC之间的绑定关系是通过名称来匹配的,即:

PVC_name === volumeClaimTemplates_name + "-" + pod_name

所以这个问题就有点意思了,我们要先创建PVC,但是PVC的名称实际上是由StatefulSet来确定的。我真的是不知道K8S设计者咋想的·····而且官方文档里创建StatefulSet的例子是直接给了个yaml文件,并没有告诉说要先创建什么再创建什么。

创建Service 和 StatefulSet

在上一步中我们已经创建了名为db-mysql-0的PVC了,接下来创建一个service和statefulset,service的名称可以随意取,但是statefulset的名称已经定死了,为mysql,并且statefulset中的volumeClaimTemplates_name必须为db,volumeMounts_name也必须为db。只有这样,statefulset中的pod才能通过命名来匹配到PVC,否则会创建失败。

statefulset.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
spec:
  ports:
  - port: 80
    name: my-port
  clusterIP: None
  selector:
    app: mysql
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql-service"
  replicas: 2
  template:
    metadata:
      labels:
        app: mysql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mysqlpod
        image: mysql:latest
        ports:
        - containerPort: 80
          name: my-port
        volumeMounts:
        - name: db
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: db
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

运行以下命令:

kubectl create -f statefulset.yaml

就可以创建statefulset了。

分享到:
评论

相关推荐

    k8s中部署statefulset-MySQL.doc

    在Kubernetes (k8s) 环境中部署StatefulSet是为了解决需要持久化存储和有序、可预测网络标识的应用场景。本案例主要讲述了如何在k8s集群中利用StatefulSet部署MySQL数据库,同时使用NFS (Network File System) 提供...

    k8s部署有状态 nacos2.0.3,通过ingress外网访问

    在k8s中,有状态应用(StatefulSet)用于保证每个实例的唯一性、稳定的网络标识和持久化的存储卷。 3. **有状态应用部署**:与无状态应用相比,有状态应用需要保持数据的持久性和实例间的顺序关系。在k8s中,使用...

    k8s部署redis所需要的配置文件

    在K8S中,可以通过创建多个StatefulSet实例来实现。还要注意配置`cluster-config-file`,使得各个节点能识别彼此。 6. **健康检查与服务发现** 添加`livenessProbe`和`readinessProbe`以监控Redis节点的健康状态。...

    nacos-k8s-yaml.zip

    在Kubernetes(简称k8s)环境中,Nacos可以通过YAML文件进行部署,实现服务在容器集群中的高可用和动态管理。本文将深入探讨如何使用YAML文件在k8s上部署Nacos集群,以及如何结合NFS(Network File System)实现数据...

    k8s(kubernetes)常见故障处理总结-详细笔记文档总结

    1. k8s 资源配置错误:部署 deployment 和 statefulset 时,资源清单书写有问题,导致 pod 无法正常创建。 2. 代码问题:应用程序代码在容器启动后失败,需要通过检查代码找错误。 3. 网络问题:网络插件部署有问题...

    k8s下部署nginx集群部署方式(相关yaml文件的编写和说明)

    首先,让我们了解YAML文件在k8s中的作用。YAML是“Yet Another Markup Language”的缩写,是一种被广泛用于配置和定义k8s对象的数据格式,如Deployment、Service、PersistentVolume等。在描述中提到的`nginx-pv.yaml...

    kubernetes(k8s)内部署ambry,es,mongodb,mysql,orientdb,rocketmq集群模式的方法

    在k8s中部署Ambry集群,你需要创建一个Deployment来定义Pod的副本数量,以及使用StatefulSet确保持久化存储和有序的Pod标识。配置文件应包括环境变量、容器镜像、存储卷声明和Service定义,以便提供对外访问的端点。...

    k8s部署influxdb完整yaml部署文件.7z

    在Kubernetes(k8s)集群中部署InfluxDB是一个常见的需求,特别是在需要高效存储和处理时间序列数据的场景下。InfluxDB是一款专为监控、指标收集和分析设计的开源时序数据库。本篇文章将详细讲解如何使用提供的YAML...

    Kubernetes(k8s)2020版入门笔记和资料(尚).zip

    Kubernetes,简称k8s,是Google开源的一种容器编排系统,用于自动化容器化应用程序的部署、扩展和管理。本资源包含2020版的Kubernetes入门笔记和相关资料,对于初学者或希望深入理解k8s的IT从业者来说极具价值。 ...

    Go-EasyRollback-让你能够轻松回滚之前部署在k8s环境中的任何镜像

    在Kubernetes(k8s)环境中,容器化应用的部署和管理是一项复杂的工作,而Go-EasyRollback正是为了简化这一过程,特别是针对部署回滚的场景。它是一款用Go语言开发的工具,旨在帮助用户方便地回滚到之前部署在k8s...

    k8s-nfs安装部署

    在Kubernetes(简称k8s)环境中,NFS(Network File System)是一种常见的持久化存储解决方案,用于在集群内部提供共享文件系统。本教程将详细阐述如何在k8s中安装和部署NFS服务器,以便为Pods提供可挂载的数据存储...

    k8s 安装包快捷安装方式包

    Kubernetes(简称 k8s)是目前最流行的容器编排系统,用于自动化容器化的应用程序部署、扩展和管理。这个“k8s 安装包快捷安装方式包”很可能包含了一组脚本或工具,旨在简化 Kubernetes 集群的部署过程。在本文中,...

    k8s从入门到精通资料

    Kubernetes(简称k8s)是Google开源的一种...通过这些资料,你可以逐步掌握k8s的使用,从理解基础概念到实操演练,最后能够熟练地在生产环境中部署和管理容器化应用。学习过程中,建议结合实践操作,加深理解和记忆。

    阿里Kubernetes(k8s)详解

    通过阅读“阿里k8s文档.pdf”和参考“k8s中间件.jpg”,你可以更深入了解阿里云在Kubernetes实践中的具体案例、最佳实践以及中间件在K8s环境中的应用。不断学习和掌握Kubernetes,将有助于你在云原生时代构建高效、...

    flink-k8s部署.zip

    标题中的"flink-k8s部署.zip"表明这是一个关于在Kubernetes(k8s)集群上部署Apache Flink的资源包。Apache Flink是一个流行的开源流处理框架,它提供了低延迟、高吞吐量的数据处理能力。Kubernetes,通常简称为k8s...

    k8s课件k8s课件k8s课件k8s课件

    k8s是一种容器集群管理系统,由Google在2014年开源。k8s用于容器化应用程序的部署、扩展和管理,目标是让部署容器化应用简单高效。k8s集群架构主要包括kube-apiserver、kube-controller-manager、kube-scheduler、...

    kuboard版本通过k8s安装nacos2.0.4的yaml文件

    在本文中,我们将深入探讨如何使用Kuboard版本在Kubernetes (k8s) 集群中安装Nacos 2.0.4。Nacos 是一个阿里巴巴开源的分布式服务治理和配置中心,它提供了服务注册与发现、配置管理、元数据中心等功能。Kuboard 则...

    高级:K8S(kubernetes)云计算案例实战.rar

    本实践案例将深入探讨K8S的高级概念和技术,帮助读者理解如何在实际环境中部署、管理和优化Kubernetes集群。 一、Kubernetes基础 Kubernetes是由Google开源的容器管理系统,它旨在自动化容器化应用的部署、扩展和...

Global site tag (gtag.js) - Google Analytics