云原生|kubernetes| StateFulSets控制器详解(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 云原生|kubernetes| StateFulSets控制器详解

访问测试页面:

[root@k8s-master nfs-sc]# curl 10.244.1.6
wo shi web-0
[root@k8s-master nfs-sc]# curl 10.244.2.8
wo shi web-1
[root@k8s-master nfs-sc]# curl 10.244.0.6
wo shi web-2

删除pod,重新生成pod以改变它们的IP,测试看看nginx的首页文件还能否访问到:

可以看到,pod的IP如何改变不影响它对外提供服务,因为volume存储是不变的,

[root@k8s-master nfs-sc]# k delete pod web-0 web-1 web-2 -n web
pod "web-0" deleted
pod "web-1" deleted
pod "web-2" deleted
[root@k8s-master nfs-sc]# k get po -n web -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          6s    10.244.0.7   k8s-master   <none>           <none>
web-1   1/1     Running   0          5s    10.244.2.9   k8s-node2    <none>           <none>
web-2   1/1     Running   0          3s    10.244.1.7   k8s-node1    <none>           <none>
[root@k8s-master nfs-sc]# curl 10.244.0.7
wo shi web-0
[root@k8s-master nfs-sc]# curl 10.244.2.9
wo shi web-1
[root@k8s-master nfs-sc]# curl 10.244.1.7
wo shi web-2

二,StateFulSet方式部署MySQL


建立相关namespace,名字叫database:

cat > mysql-sts-ns.yaml <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: database
EOF

部署MySQL的清单文件:

cat > mysql-sts.yaml <<EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: database
spec:
  selector:
    matchLabels:
      app: mysql #必须匹配 .spec.template.metadata.labels
  serviceName: "mysql"  #声明它属于哪个Headless Service.
  replicas: 3 #副本数
  template:
    metadata:
      labels:
        app: mysql # 必须配置 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mysql
        image: mysql:5.7.23
        ports:
        - containerPort: 3306
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
        volumeMounts:
        - name: mysql-pvc
          mountPath: /var/lib/mysql
  volumeClaimTemplates:   #可看作pvc的模板
  - metadata:
      name: mysql-pvc
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "managed-nfs-storage"  #存储类名,改为集群中已存在的
      resources:
        requests:
          storage: 1Gi
EOF

部署完成后,查看pod的大体信息:

[root@k8s-master ~]# k get pod,pv,pvc  -n database -owide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod/mysql-0   1/1     Running   0          38m   10.244.2.10   k8s-node2    <none>           <none>
pod/mysql-1   1/1     Running   0          38m   10.244.0.8    k8s-master   <none>           <none>
pod/mysql-2   1/1     Running   0          37m   10.244.0.9    k8s-master   <none>           <none>
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS          REASON   AGE     VOLUMEMODE
persistentvolume/pvc-46e7893f-3b66-4899-ae13-f1400eb1ff7f   1Gi        RWO            Delete           Bound    database/mysql-pvc-mysql-2   managed-nfs-storage            37m     Filesystem
persistentvolume/pvc-96748d04-0e1c-4b70-8c93-baf6a1d857d3   1Gi        RWO            Delete           Bound    database/mysql-pvc-mysql-1   managed-nfs-storage            38m     Filesystem
persistentvolume/pvc-a7b73ac0-d881-4c96-9fdb-e8d71f60d848   1Gi        RWO            Delete           Bound    web/nginx-pvc-web-1          managed-nfs-storage            4h40m   Filesystem
persistentvolume/pvc-b939521e-1e4b-4ba4-92b7-94f96cdba9a1   1Gi        RWO            Delete           Bound    database/mysql-pvc-mysql-0   managed-nfs-storage            38m     Filesystem
persistentvolume/pvc-dabd8050-77f6-4655-8434-dac2f9a077eb   1Gi        RWO            Delete           Bound    web/nginx-pvc-web-2          managed-nfs-storage            4h40m   Filesystem
persistentvolume/pvc-eb159490-353c-4aea-9412-10056a29911d   1Gi        RWO            Delete           Bound    web/nginx-pvc-web-0          managed-nfs-storage            4h40m   Filesystem
NAME                                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE   VOLUMEMODE
persistentvolumeclaim/mysql-pvc-mysql-0   Bound    pvc-b939521e-1e4b-4ba4-92b7-94f96cdba9a1   1Gi        RWO            managed-nfs-storage   38m   Filesystem
persistentvolumeclaim/mysql-pvc-mysql-1   Bound    pvc-96748d04-0e1c-4b70-8c93-baf6a1d857d3   1Gi        RWO            managed-nfs-storage   38m   Filesystem
persistentvolumeclaim/mysql-pvc-mysql-2   Bound    pvc-46e7893f-3b66-4899-ae13-f1400eb1ff7f   1Gi        RWO            managed-nfs-storage   37m   Filesystem

测试:

首先安装一哈MySQL的客户端:

yum install mariadb -y

登录进数据库后,依次按pod名称建立相应的数据库名称以作标识(本例就做了一个):

账号是root,密码是123456

[root@k8s-master ~]# mysql -uroot -p -h10.244.2.10
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.23 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> create database mysql-0;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-0' at line 1
MySQL [(none)]> create database mysql0;
Query OK, 1 row affected (0.01 sec)

删除MySQL的相关pod,等待重建pod完成后,再次进入数据库查看前面建立的数据库标识是否存在:

可以看到,删除原pod后,重新建立了pod,pod的IP改变了,但登录进去后,标识用的数据库还是存在的。

[root@k8s-master ~]# k delete pod  mysql-0 mysql-1 mysql-2 -n database
pod "mysql-0" deleted
pod "mysql-1" deleted
pod "mysql-2" deleted
[root@k8s-master ~]# k get po -n database -owide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
mysql-0   1/1     Running   0          49s   10.244.2.11   k8s-node2    <none>           <none>
mysql-1   1/1     Running   0          40s   10.244.0.10   k8s-master   <none>           <none>
mysql-2   1/1     Running   0          38s   10.244.0.11   k8s-master   <none>           <none>
[root@k8s-master ~]# mysql -uroot -p123456 -h10.244.2.11
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.23 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mysql0             |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.03 sec)

总结:


StateFulSet控制器的两个显著特点,一,按顺序创建,pod名称包含有自增数字,这使得它的域名是可以固定的。二,由StateFulSet控制器通过StorageClass控制器来控制volume持久存储卷和pod的名称一一对应,从而使得pod更加的稳定。

其实,说人话就是StateFulSet控制器使得pod能够形成一组pod,这一组pod能够进行一定的序列化。因此,StateFulSet控制器常常使用在比较复杂的需要一定序列化特点的集群搭建方面,比如,MySQL主从复制集群,redis集群的部署基础都是StateFulSet控制器。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes 监控 Cloud Native
云原生入门:Kubernetes 集群部署与管理
【8月更文挑战第38天】在数字化浪潮中,云原生技术如同翱翔的雄鹰,引领着企业飞向灵活高效的未来。本文将带你一探究竟,从Kubernetes的基础概念到实际操作,深入浅出地介绍如何在云端构建和管理你的容器化应用。我们将一步步搭建起一个小型的Kubernetes集群,并通过代码示例和图解,让你轻松掌握云原生世界的钥匙。让我们一起开启这趟技术之旅,探索云原生的秘密花园,找到那把打开创新之门的金钥匙。
|
9天前
|
弹性计算 Kubernetes Cloud Native
云原生时代的航标:Kubernetes的灯塔作用
在数字化浪潮中,云原生技术如同海上的灯塔,指引着企业航行。本文将深入探讨Kubernetes如何成为云原生技术的领航者,揭示其在容器编排、自动化部署等方面的优势,并分享实践案例,为读者提供实用的操作建议和未来趋势的展望。
|
11天前
|
Kubernetes Cloud Native 开发者
探索云原生技术:从Docker到Kubernetes的旅程
【8月更文挑战第31天】云原生技术正在改变软件开发、部署和运维的方式。本文将带你了解云原生的核心概念,并通过实际代码示例,展示如何使用Docker容器化应用,并进一步通过Kubernetes进行集群管理。我们将一起构建一个简单的微服务架构,体验云原生带来的高效与便捷。
|
11天前
|
运维 Kubernetes 监控
自动化运维:使用Python脚本实现系统监控云原生技术实践:Kubernetes在现代应用部署中的角色
【8月更文挑战第31天】在现代IT运维管理中,自动化已成为提高效率和准确性的关键。本文将通过一个Python脚本示例,展示如何实现对服务器的自动监控,包括CPU使用率、内存占用以及磁盘空间的实时监测。这不仅帮助运维人员快速定位问题,也减轻了日常监控工作的负担。文章以通俗易懂的语言,逐步引导读者理解并实践自动化监控的设置过程。 【8月更文挑战第31天】本文旨在探索云原生技术的核心—Kubernetes,如何革新现代应用的开发与部署。通过浅显易懂的语言和实例,我们将一窥Kubernetes的强大功能及其对DevOps文化的影响。你将学会如何利用Kubernetes进行容器编排,以及它如何帮助你的
|
17天前
|
存储 Kubernetes Go
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
|
8天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
72 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
8天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
17 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
8天前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
24 7
|
8天前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
19 5
|
8天前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
25 2

热门文章

最新文章