在K8s中创建StatefulSet

时间:2022-04-26 08:04:14

在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的更多相关文章

  1. 【Kubernetes】在K8s中创建StatefulSet

    在K8s中创建StatefulSet 遇到的问题: 使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个 ...

  2. 【转】K8S中部署Helm

    K8S中的包管理工具 1. 客户端Helm(即Helm)  通过脚本安装:curl https://raw.githubusercontent.com/helm/helm/master/scripts ...

  3. 转 docker创建私有仓库和k8s中使用私有镜像

    docker私有仓库建立 环境说明我们选取192.168.5.2做私有仓库地址yum install docker -y1.启动docker仓库端口服务 docker run -d -p 5000:5 ...

  4. k8s中yaml文常见语法

    在k8s中,所有的配置都是 json格式的.但为了读写方便,通常将这些配置写成yaml 格式,其运行的时候,还是会靠yaml引擎将其转化为json,apiserver 也仅接受json的数据类型. y ...

  5. Prometheus K8S中部署Alertmanager

    Prometheus K8S中部署Alertmanager 设置告警和通知的主要步骤如下:一.部署Alertmanager二.配置Prometheus与Alertmanager通信三.配置告警 1. ...

  6. 如何在K8S中优雅的使用私有镜像库 (Docker版)

    前言 在企业落地 K8S 的过程中,私有镜像库 (专用镜像库) 必不可少,特别是在 Docker Hub 开始对免费用户限流之后, 越发的体现了搭建私有镜像库的重要性. 私有镜像库不但可以加速镜像的拉 ...

  7. k8s负载资源StatefulSet工作解析

    在k8s中工作负载资源StatefulSet用于管理有状态应用. 什么是无状态? 组成一个应用的pod是对等的,它们之前没有关联和依赖关系,不依赖外部存储. 即我们上篇小作文中deployment创建 ...

  8. k8s中部署springcloud

    安装和配置数据存储仓库MySQL 1.MySQL简介 2.MySQL特点 3.安装和配置MySQL 4.在MySQL数据库导入数据 5.对MySQL数据库进行授权 1.MySQL简介 MySQL 是一 ...

  9. K8S中如何跨namespace 访问服务?为什么ping不通ClusterIP?

    1.K8S中如何跨namespace 访问服务? 2.在Pod中为什么ping不通ClusterIP? 简述: Rancher2.0中的一个用户,在K8S环境中,创建两个namespace,对应用进行 ...

随机推荐

  1. sphinx全文检索功能 | windows下测试 (二)

    sphinx 数据库检索需要对数据库重新生成索引,为自己所用,然后按照拆词匹配

  2. 30道四则运算题目---课堂作业--软件工程c++

    问题:设计一程序,给二年级小学生随机产生四则运算题目. 一.设计思考问题: 1.四则运算需要俩个运算数和一个运算符. 2.如何产生随机数? 3.如何实现随机产生四则运算? 4.题目是否符合小学生学习范 ...

  3. appium 并发测试

    Android并发测试 Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现. 启动多个Android会话的重要指令包括: - ...

  4. 《JavaScript网页经典特效300例》

    <JavaScript网页经典特效300例> 基础篇 进阶篇 高级篇

  5. hdu 5893 &lpar;树链剖分&plus;合并&rpar;

    List wants to travel Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  6. Servlet工作原理解析 《深入分析java web 技术内幕》第九章

    参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...

  7. 在浏览器端获取文件的MD5值

    前几天接到一个奇怪的需求,要在web页面中计算文件的md5值,还好这个项目是只需兼容现代浏览器的,不然要坑死了. 其实对文件进行md5,对于后端来说是及其简单的.比如使用Node.js,只要下面几行代 ...

  8. SSM 框架 ---项目整合

    一.SSM框架理解 Spring(业务层) Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象. Spring的核心思想是IoC(控 ...

  9. Flex Cairngorm框架知识整理

    简介: Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex RIA开发的最好框架之一.使用Cairngorm框架可以大大提高开发和维护的效率. Ca ...

  10. Oracle的动态SQL

    例1:传递表名,和Where条件删除数据 CREATE OR REPLACE PROCEDURE raise_emp_salary (column_value NUMBER, emp_column V ...