在K8s中创建StatefulSet

本文介绍如何在Kubernetes中使用StatefulSet解决Pod无状态问题,确保Pod重启后能继续使用原有的持久化存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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了。

<think>好的,我需要帮助用户了解如何在服务器上重新安装Debian系统。首先,我需要查看用户提供的引用资料,看看有没有相关的步骤或注意事项。引用[2]提到了安装Debian 10 Buster的方法,包括下载ISO文件、创建启动盘以及在虚拟环境或物理硬件上的安装步骤。引用[4]也提到了Debian 9的最小服务器安装,可能部分步骤类似。不过用户需要的是重装,可能需要先备份数据,然后进行安装。 接下来,我应该整理出一个清晰的步骤流程。首先,备份数据非常重要,避免数据丢失。然后,准备安装介质,比如使用Etcher工具制作启动盘。启动服务器并进入安装界面,可能涉及修改引导顺序。在分区时需要注意选择手动分区,特别是如果用户希望完全重装,可能需要格式化原有分区。安装基本系统后,配置网络和用户账户,最后安装必要的软件和服务,比如SSH、Web服务器等,如引用[3]提到的安装Apache2、PHP等。 还要考虑用户可能的疑问,比如如何确保数据安全,如何处理旧系统的配置,以及如何恢复备份。需要提醒用户在重装前确认备份完成,并验证启动介质的正确性。此外,分区步骤需要谨慎,避免误删其他数据。最后,安装后的配置可以参考引用[1]和[3],安装所需的服务程序。 现在需要将这些步骤结构化,用中文清晰表达,确保每个步骤都有必要的细节,同时引用相关的引用资料。例如,在备份数据时,可以引用[2]提到的使用可启动USB的方法。在安装软件时,引用[3]中的服务程序列表。最后,生成相关问题,帮助用户进一步了解优化和应用场景。</think>### 在服务器上重新安装Debian系统的教程 #### **步骤1:备份数据** 重装系统会清除硬盘数据,因此需提前备份重要文件(如配置文件、数据库、网站数据等)。可通过以下方式备份: - 使用`rsync`或`scp`将数据复制到另一台服务器。 - 若服务器支持热插拔硬盘,可挂载外部存储设备直接备份[^2]。 --- #### **步骤2:准备安装介质** 1. **下载Debian ISO镜像** 访问[Debian官方下载页面](https://www.debian.org/download),选择适合服务器硬件的ISO文件(如`Debian 12 Bookworm`)。 2. **制作启动盘** 使用工具如`Etcher`或`dd`命令将ISO写入U盘或虚拟介质。示例命令: ```bash sudo dd if=debian-12.0.0-amd64-DVD-1.iso of=/dev/sdX bs=4M status=progress ``` 其中`/dev/sdX`为目标磁盘设备。 --- #### **步骤3:启动服务器并进入安装程序** 1. 插入启动盘,重启服务器。 2. 在启动时按`F12`、`Delete`或对应键进入引导菜单,选择从U盘/ISO启动。 3. 进入Debian安装界面,选择`Install`或`Graphical Install`(建议文本模式以节省资源)。 --- #### **步骤4:系统安装配置** 1. **语言和地区设置** - 选择语言(如英语)、时区(如`Asia/Shanghai`)。 2. **网络配置** - 设置主机名(如`debian-server`)、域名(可选)。 - 配置静态IP(服务器通常需要固定IP): ```plaintext IP地址:192.168.1.100 子网掩码:255.255.255.0 网关:192.168.1.1 DNS:8.8.8.8 ``` 3. **分区与格式化** - 选择`手动分区`(Manual Partitioning),删除原有分区并新建: - `/`(根分区):建议50GB,文件系统`ext4`。 - `swap`(交换分区):大小为内存的1-2倍。 - `/home`(可选):根据需求分配空间。 - **确认格式化**以清除旧系统数据[^4]。 4. **安装基本系统** - 选择`仅安装SSH服务`和`标准系统工具`,其他软件后续按需安装。 --- #### **步骤5:安装后配置** 1. **设置root密码和用户账户** - 输入root密码,并创建一个普通用户(如`admin`)。 2. **更新软件包** ```bash sudo apt update && sudo apt upgrade -y ``` 3. **安装必要服务** - 参考需求安装Web服务器、数据库等(如Nginx、MySQL): ```bash sudo apt install nginx mysql-server php-fpm ``` 具体配置可参考[^1][^3]。 --- #### **步骤6:恢复数据与验证** 1. 将备份数据复制回服务器。 2. 重启服务器,检查服务是否正常运行: ```bash systemctl status nginx mysql ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值