遇到的问题:
使用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了。
http://www.cnblogs.com/puyangsky/p/6677308.html
相关推荐
在Kubernetes (k8s) 环境中部署StatefulSet是为了解决需要持久化存储和有序、可预测网络标识的应用场景。本案例主要讲述了如何在k8s集群中利用StatefulSet部署MySQL数据库,同时使用NFS (Network File System) 提供...
在k8s中,有状态应用(StatefulSet)用于保证每个实例的唯一性、稳定的网络标识和持久化的存储卷。 3. **有状态应用部署**:与无状态应用相比,有状态应用需要保持数据的持久性和实例间的顺序关系。在k8s中,使用...
在K8S中,可以通过创建多个StatefulSet实例来实现。还要注意配置`cluster-config-file`,使得各个节点能识别彼此。 6. **健康检查与服务发现** 添加`livenessProbe`和`readinessProbe`以监控Redis节点的健康状态。...
在Kubernetes(简称k8s)环境中,Nacos可以通过YAML文件进行部署,实现服务在容器集群中的高可用和动态管理。本文将深入探讨如何使用YAML文件在k8s上部署Nacos集群,以及如何结合NFS(Network File System)实现数据...
1. k8s 资源配置错误:部署 deployment 和 statefulset 时,资源清单书写有问题,导致 pod 无法正常创建。 2. 代码问题:应用程序代码在容器启动后失败,需要通过检查代码找错误。 3. 网络问题:网络插件部署有问题...
首先,让我们了解YAML文件在k8s中的作用。YAML是“Yet Another Markup Language”的缩写,是一种被广泛用于配置和定义k8s对象的数据格式,如Deployment、Service、PersistentVolume等。在描述中提到的`nginx-pv.yaml...
在k8s中部署Ambry集群,你需要创建一个Deployment来定义Pod的副本数量,以及使用StatefulSet确保持久化存储和有序的Pod标识。配置文件应包括环境变量、容器镜像、存储卷声明和Service定义,以便提供对外访问的端点。...
在Kubernetes(k8s)集群中部署InfluxDB是一个常见的需求,特别是在需要高效存储和处理时间序列数据的场景下。InfluxDB是一款专为监控、指标收集和分析设计的开源时序数据库。本篇文章将详细讲解如何使用提供的YAML...
Kubernetes,简称k8s,是Google开源的一种容器编排系统,用于自动化容器化应用程序的部署、扩展和管理。本资源包含2020版的Kubernetes入门笔记和相关资料,对于初学者或希望深入理解k8s的IT从业者来说极具价值。 ...
在Kubernetes(k8s)环境中,容器化应用的部署和管理是一项复杂的工作,而Go-EasyRollback正是为了简化这一过程,特别是针对部署回滚的场景。它是一款用Go语言开发的工具,旨在帮助用户方便地回滚到之前部署在k8s...
在Kubernetes(简称k8s)环境中,NFS(Network File System)是一种常见的持久化存储解决方案,用于在集群内部提供共享文件系统。本教程将详细阐述如何在k8s中安装和部署NFS服务器,以便为Pods提供可挂载的数据存储...
Kubernetes(简称 k8s)是目前最流行的容器编排系统,用于自动化容器化的应用程序部署、扩展和管理。这个“k8s 安装包快捷安装方式包”很可能包含了一组脚本或工具,旨在简化 Kubernetes 集群的部署过程。在本文中,...
Kubernetes(简称k8s)是Google开源的一种...通过这些资料,你可以逐步掌握k8s的使用,从理解基础概念到实操演练,最后能够熟练地在生产环境中部署和管理容器化应用。学习过程中,建议结合实践操作,加深理解和记忆。
通过阅读“阿里k8s文档.pdf”和参考“k8s中间件.jpg”,你可以更深入了解阿里云在Kubernetes实践中的具体案例、最佳实践以及中间件在K8s环境中的应用。不断学习和掌握Kubernetes,将有助于你在云原生时代构建高效、...
标题中的"flink-k8s部署.zip"表明这是一个关于在Kubernetes(k8s)集群上部署Apache Flink的资源包。Apache Flink是一个流行的开源流处理框架,它提供了低延迟、高吞吐量的数据处理能力。Kubernetes,通常简称为k8s...
k8s是一种容器集群管理系统,由Google在2014年开源。k8s用于容器化应用程序的部署、扩展和管理,目标是让部署容器化应用简单高效。k8s集群架构主要包括kube-apiserver、kube-controller-manager、kube-scheduler、...
在本文中,我们将深入探讨如何使用Kuboard版本在Kubernetes (k8s) 集群中安装Nacos 2.0.4。Nacos 是一个阿里巴巴开源的分布式服务治理和配置中心,它提供了服务注册与发现、配置管理、元数据中心等功能。Kuboard 则...
本实践案例将深入探讨K8S的高级概念和技术,帮助读者理解如何在实际环境中部署、管理和优化Kubernetes集群。 一、Kubernetes基础 Kubernetes是由Google开源的容器管理系统,它旨在自动化容器化应用的部署、扩展和...