猿创征文|云原生|kubernetes实务---部署MySQL--实战(1.1)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 猿创征文|云原生|kubernetes实务---部署MySQL--实战

导读


kubernetes集群搭建其实仅仅是第一步,不是为了部署而部署,当然是需要实战使用啦。在实际的生产活动中和测试活动中,kubernetes的使用是不相同的,本文试图从一个贴近实际的生产活动来讲述如何优雅的,正确的使用kubernetes。

部署前的相关知识简介:

由于是单实例的MySQL,因此,本文暂时不使用StatefulSet.。

StatefulSet的简介

在本文中,我们将在Kubernetes中部署数据库,因此我们必须了解什么是StatefulSet。是用于管理有状态应用程序的工作负载。它管理一组Pod的实现和扩展,并保证这些Pod的顺序和唯一性。

像Deployment一样,StatefulSet也管理具有相同容器规范的一组Pod。由StatefulSets维护的Pod具有唯一的,持久的身份和稳定的主机名,而不用管它们位于哪个节点上。如果我们想要一个跨存储的持久性,我们可以创建一个持久性卷并将StatefulSet用作解决方案的一部分。即使StatefulSet中的Pod容易发生故障,存储卷与新Pod进行匹配也很容易。

StatefulSet对于需要以下一项或多项功能的应用程序很有价值:

  • 稳定的唯一网络标识符。
  • 稳定,持久的存储。
  • 有序,顺畅的部署和扩展。
  • 有序的自动滚动更新。

在Kubernetes上部署数据库时,我们需要使用StatefulSet,但是使用StatefulSet有一些局限性:

  • 需要使用持久性存储卷为Pod提供存储。
  • 删除副本或按比例缩小副本将不会删除附加到StatefulSet的存储卷。存储卷确保数据的安全性。
  • StatefulSet当前需要Headless Service 来负责Pod的网络标识。
  • 与Deployment 不同,StatefulSet不保证删除StatefulSet资源时删除所有Pod,而Deployment在被删除时会删除与Deployment关联的所有Pod。在删除StateFul之前,你必须将pod副本数量缩小到0 。

实践正文


一,部署一个使用本地存储卷的单机MySQL


MySQL版本是5.7.23----通常用在测试环境,生产是不允许这样做的哦

这个部署示例将使用最为简单的本地存储,MySQL的相关配置文件和相关账号密码等敏感信息将使用明文存储在资源清单文件内,部署方式为deployment。

(1)StorageClass---存储类


这个可以不使用,因为我们下面将使用的是静态存储

[root@master mysql]# cat mysql-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner   # no-provisioner代表不会自动创建PV,创建PV步骤不可省略
volumeBindingMode: immutable     #立刻绑定

(2)pv---存储卷定义


在node2节点,新建目录,mkdir -p /mnt/mysql-data,因为在此文件内做了亲和度调度,指定是在node2存储数据卷。

  • volumeMode: Filesystem 这个其实是默认的,可以不写,但写了也没错。
  • persistentVolumeReclaimPolicy: Delete 数据卷回收策略,这里是删除,也就是pvc删除了,数据卷跟随删除,是默认策略,但不建议使用这个,建议使用Retain。
  • persistentVolumeReclaimPolicy: Recycle:不保留数据。经测试pvc删除后,在nfs服务端的数据也会随机删除。只有hostPath和NFS支持这种方式
  • Retain:不清理保留数据。即删除pvc或者pv后,在插件上的数据(nfs服务端)不会被删除。这种方式是最常用的,可以避免误删pvc或者pv而造成数据的丢失。
  • 本例使用了节点亲和度,这里比较容易出错的地方是,如果有亲和度策略,该pv无法更新,只能删除重新生成。说人话就是,比如,上面的删除策略想要调整,OK,必须删除pv,不能patch它,然后重新执行清单文件才可以,否则报错报到你怀疑人生。
cat mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 15Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
#  storageClassName: local-storage
  local:       # 指定它是一个 Local Persistent Volume
    path: /mnt/mysql-data  # PV对应的本地磁盘路径
  nodeAffinity:     # 亲和性标志
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
            - k8s-node1   # 必须部署在node1上

(3)pvc---存储卷需求清单


没什么好说的了,只需要记住这个name: mysql-pv-claim,一会部署的时候引用这个名字即可。

[root@master mysql]# cat mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
 # storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

(4)deployment方式部署


数据库密码是password

strategy:

   type: Recreate


是一种部署方式,停止旧版本部署新版本,说人话就是,旧的去了,新的就来。当然,本例无所谓了。


strategy:

   type: RollingUpdate

   rollingUpdate:

     maxSurge: 1  -->一次可以添加多少个实例

     maxUnavailable: 0  -->能够容忍多少个实例无法使用,0表示不容忍

rollingupdae是另一种部署方式--见名思意,滚动更新通过逐个替换实例来逐步部署新版本的应用,直到所有实例都被替换完成为止。它通常遵循以下过程:在负载均衡器后面使用版本 A 的实例池,然后部署版本 B 的一个实例,当服务准备好接收流量时(Readiness Probe 正常),将该实例添加到实例池中,然后从实例池中删除一个版本 A 的实例并关闭。


通常生产环境是使用滚动更新或者蓝绿更新策略。


- image: mysql:5.7.23
        imagePullPolicy: IfNotPresent


镜像拉取策略是本地有就用本地的,如果没有该镜像就去网络上拉取,通常生产环境也是用这个的,毕竟很多项目是在内网中的,获取镜像是有问题的。


 

- name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim


这个name写了两次,保证一致就可以,但可以随便定义, claimName: mysql-pv-claim这个是引用的上面的pvc的名字,不能乱写。

[root@master mysql]# cat deploy-mysql.yaml 
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7.23
        imagePullPolicy: IfNotPresent
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

(5)编写服务清单

这个service的作用只是一会测试的时候使用,端口暴露3306,集群内部使用。

[root@master mysql]# cat mysql-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None

应用这些文件(这个顺序是建立顺序,注意,StorageClass文件不需要执行,因为,我已经将关于它的地方注释掉了):

k apply -f mysql-pv.yaml -f mysql-pvc.yaml  -f deploy-mysql.yaml


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
97 2
|
1月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
167 66
|
1天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
16 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
27天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
1月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
65 1
|
1月前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####

推荐镜像

更多