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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 云原生|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控制器。


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1天前
|
运维 Kubernetes Cloud Native
构建高效云原生运维体系:Kubernetes最佳实践
【5月更文挑战第9天】 在动态和快速演变的云计算环境中,高效的运维是确保应用稳定性与性能的关键。本文将深入探讨在Kubernetes环境下,如何通过一系列最佳实践来构建一个高效且响应灵敏的云原生运维体系。文章不仅涵盖了容器化技术的选择与优化、自动化部署、持续集成/持续交付(CI/CD)流程的整合,还讨论了监控、日志管理以及灾难恢复策略的重要性。这些实践旨在帮助运维团队有效应对微服务架构下的复杂性,确保系统可靠性及业务的连续性。
|
1天前
|
Kubernetes Cloud Native 持续交付
构建高效稳定的云原生应用:容器编排与微服务治理实践
【5月更文挑战第14天】 随着企业数字化转型的深入,云原生技术以其弹性、敏捷和可扩展的特性成为现代应用开发的首选模式。本文将探讨如何通过容器编排工具如Kubernetes以及微服务架构的有效治理,构建和维护高效且稳定的云原生应用。我们将分析容器化技术的优势,并结合案例讨论在多云环境下实现持续集成、持续部署(CI/CD)的最佳实践,同时解决微服务带来的分布式复杂性问题。通过本文的阐述,读者将获得一套提升系统可靠性和业务连续性的策略框架。
7 0
|
1天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
1天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
32 1
|
1天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
54 1
|
1天前
|
消息中间件 Cloud Native 开发者
电子好书发您分享《阿里云云原生开源开发者沙龙北京站 PPT 合集 》
**阿里云开源沙龙PPT合集:北京站聚焦云原生技术** 探索云原生领域的深度与广度,[阿里云](https://developer.aliyun.com/ebook/8334/116563?spm=a2c6h.26392459.ebook-detail.5.da096cf6t38G15)分享了北京开发者沙龙的精彩内容,涵盖微服务、消息队列等主题,助力开发者洞悉行业趋势。![image](https://ucc.alicdn.com/pic/developer-ecology/cok6a6su42rzm_67b12f6cad6e4b2786859b3a668b3351.png)
46 3
|
1天前
|
人工智能 监控 Cloud Native
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
|
1天前
阿里云云原生恭祝大家新年快乐!
阿里云云原生恭祝大家新年快乐!
|
1天前
|
人工智能 监控 Cloud Native
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态
|
1天前
|
Cloud Native Serverless 开发者
阿里云助力开发者创新:探索云原生技术的新境界
阿里云开发者社区推动云原生技术发展,提供丰富产品(如容器服务、Serverless、微服务架构、服务网格)与学习平台,助力企业数字化转型。开发者在此探索实践,共享资源,参与技术活动,共同创新,共创云原生技术新篇章。一起加入,开启精彩旅程!
168 2

热门文章

最新文章