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

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

单元测试


客户端连接MySQL,可以看到连接成功,密码测试成功:

[root@master mysql]# kubectl run -it --rm --image=mysql:5.7.23 --restart=Never mysql-client -- mysql -h mysql -ppassword
If you don't see a command prompt, try pressing enter.
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper
Connection id:    4
Current database: 
Current user:   root@10.244.1.25
SSL:      Cipher in use is DHE-RSA-AES256-SHA
Current pager:    stdout
Using outfile:    ''
Using delimiter:  ;
Server version:   5.7.23 MySQL Community Server (GPL)
Protocol version: 10
Connection:   mysql via TCP/IP
Server characterset:  latin1
Db     characterset:  latin1
Client characterset:  latin1
Conn.  characterset:  latin1
TCP port:   3306
Uptime:     10 min 19 sec
Threads: 1  Questions: 12  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 0.019
--------------

在node2节点,查看一下此数据库的数据目录是否存在:

[root@slave2 ~]# ll /mnt/mysql-data/
total 188484
-rw-r----- 1 polkitd ssh_keys       56 Sep  7 13:44 auto.cnf
-rw------- 1 polkitd ssh_keys     1679 Sep  7 13:45 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys     1107 Sep  7 13:45 ca.pem
-rw-r--r-- 1 polkitd ssh_keys     1107 Sep  7 13:45 client-cert.pem
-rw------- 1 polkitd ssh_keys     1679 Sep  7 13:45 client-key.pem
-rw-r----- 1 polkitd ssh_keys      407 Sep  7 15:28 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 Sep  7 15:28 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 Sep  7 15:28 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 Sep  7 13:44 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 Sep  7 15:28 ibtmp1
drwxr-x--- 2 polkitd ssh_keys     4096 Sep  7 13:44 mysql
drwxr-x--- 2 polkitd ssh_keys     8192 Sep  7 13:44 performance_schema
-rw------- 1 polkitd ssh_keys     1679 Sep  7 13:45 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys      451 Sep  7 13:45 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys     1107 Sep  7 13:45 server-cert.pem
-rw------- 1 polkitd ssh_keys     1679 Sep  7 13:45 server-key.pem
drwxr-x--- 2 polkitd ssh_keys     8192 Sep  7 13:44 sys

看一哈pv和pvc是否正常(其实也是扯淡了,已经看到数据库的数据了,当然没问题啦);

[root@master mysql]# k get pv,pvc,svc
NAME                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE
persistentvolume/mysql-pv   15Gi       RWO            Delete           Bound    default/mysql-pv-claim                           14m
NAME                                   STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/mysql-pv-claim   Bound    mysql-pv   15Gi       RWO                           14m
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP    11d
service/mysql        ClusterIP   None         <none>        3306/TCP   10m

小结


OK,现在一个最为简单的MySQL就部署好了, 那么,部署的这么一个数据库有什么问题吗?当然有啦,第一,数据库的密码以明文的形式存在pv建立的文件里,毫无秘密可言,第二,此数据库使用的是默认3306端口,也是毫无安全性,所有的配置都是默认,此数据库也可以说是一个没有任何定制的数据库,比如,慢查询,binlog也没有开启等等个性化的设置都没有全部默认,第三,现在仅仅是一个数据库服务,如果有N个服务,比如redis单或者集群实例,nginx实例等等其他服务,那么,持久化存储的管理就会给我们带来一个巨大的挑战(这个例子使用的是静态存储,需要一个动态存储来解放自己啦)。

因此,可以说,这样创建的数据库是完全不能使用在生产环境的,只能是作为一个测试或者学习的环境,是一个快速出环境的手段啦。

二,部署一个生产可用的MySQL


生产环境下的可用的MySQL所要求的东西更多一点,比如,安全性,可定制化性,可扩展性,这些虽然简简单单的就这么几句话,但,实际做起来你就会发现不是那么好搞的哦,下面我就详细讲讲如何实现一个可用于生产环境的MySQL单机版部署:

首先,需要一个动态存储类,也就是StorageClass,还需要一个secret,以保存敏感信息,主要是MySQL的密码,其次,需要一个configmap,此文件保存MySQL的配置文件。

(1)nfs的StorageClass类创建


就不在此文里说了,以我原来写的博文为主:kubernetes学习之持久化存储StorageClass(4)_zsk_john的博客-CSDN博客

(2)存放密码的secret文件:


secret文件内的密码是加密了,type: Opaque表示模糊模式,没什么太多意义,需要和pvc一个namespace。

root用户名使用base64加密,密码也是同样的加密方式,这里,我的密码就不演示加密了:

1. [root@master wordpress]# echo -n root |base64
2. cm9vdA==
[root@master mysql1]# cat  secret.yaml 
kind: Secret
apiVersion: v1
metadata:
  name: user-and-password
  namespace: database
type: Opaque
data:
  username: cm9vdA==
  password: c2hpZ3VhbmczMg==

(3)config文件


MySQL的主要配置文件,根据此配置文件,可定制MySQL:

这里的MySQL配置文件部分就可以实现端口号更改等等各种各样的需求,我写的这个是比较全的所有配置,但,基本都是默认的东西。

cm需要和secret以及pvc是一个namespace。

[root@master mysql1]# cat mysql-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: database
data:
  mysqld.cnf: |-
    [mysqld]
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
    log-error      = /var/log/mysql/error.log #haha
    symbolic-links=0
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    lock_wait_timeout = 3600
    open_files_limit    = 65535
    back_log = 1024
    max_connections = 512
    max_connect_errors = 1000000
    table_open_cache = 1024
    table_definition_cache = 1024
    thread_stack = 512K
    sort_buffer_size = 4M
    join_buffer_size = 4M
    read_buffer_size = 8M
    read_rnd_buffer_size = 4M
    bulk_insert_buffer_size = 64M
    thread_cache_size = 768
    interactive_timeout = 600
    wait_timeout = 600
    tmp_table_size = 32M
    max_heap_table_size = 32M

(3)存储清单文件---pvc


[root@master mysql1]# cat mysql-pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql
  namespace: database
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1.5Gi
  storageClassName: managed-nfs-storage

(4)服务文件


端口暴露的作用,为了后面的单元测试环节,和cm,secret,等一样的namespace。

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

(5)部署文件


该文件仍然是指定了namespace为database,并且挂载了cm和secret

[root@master mysql1]# cat deploy-mysql.yaml 
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
  namespace: database
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7.23
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef: 
              name: user-and-password
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
        - name: config-volume1                      
          mountPath: "/etc/mysql/mysql.conf.d/"  
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql
      - name: config-volume1                      
        configMap:                                
          name: mysql-config               

(6)部署命令


[root@master mysql1]# k apply  -f mysql-pvc.yaml -f mysql-svc.yaml -f secret.yaml -f mysql-cm.yaml -f deploy-mysql.yaml 
persistentvolumeclaim/mysql configured
service/mysql unchanged
secret/user-and-password unchanged
configmap/mysql-config unchanged
deployment.apps/mysql unchanged

(7)

单元测试


密码是设定在secret内的,现在密码校验通过,证明secret文件生效了。

[root@master mysql1]# kubectl run -it --rm --image=mysql:5.7.23 --restart=Never -n database mysql-client  -- mysql -h mysql -psecret
If you don't see a command prompt, try pressing enter.
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.23    |
+-----------+
1 row in set (0.00 sec)
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper

configmap的测试:


配置文件的查看(先进入容器,然后查看文件),和前面定义的配置文件匹配了,证明cm没有问题。

[root@master mysql1]# k exec -it mysql-bd8c75548-pk552 -n database -- /bin/bash
root@mysql-bd8c75548-pk552:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf 
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error      = /var/log/mysql/error.log #haha
symbolic-links=0
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
lock_wait_timeout = 3600
open_files_limit    = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
thread_stack = 512K
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
thread_cache_size = 768
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32Mroot

至此,一个自己可控的,具有一定安全性的单实例MySQL就部署完了。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
167 66
|
1天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
16 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
4天前
|
存储 Kubernetes 容器
K8S部署nexus
该配置文件定义了Nexus 3的Kubernetes部署,包括PersistentVolumeClaim、Deployment和服务。PVC请求20Gi存储,使用NFS存储类。Deployment配置了一个Nexus 3容器,内存限制为6G,CPU为1000m,并挂载数据卷。Service类型为NodePort,通过30520端口对外提供服务。所有资源位于`nexus`命名空间中。
|
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容器,从而为初学者提供一条清晰的学习路径。
|
29天前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
1月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
53 0
|
1天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
14 2