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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 猿创征文|云原生|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搭建和管理企业级网站应用
目录
相关文章
|
20天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
109 60
|
21天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
126 62
|
4天前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
16 3
|
2天前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!
|
10天前
|
Kubernetes Cloud Native 开发者
探秘云原生计算:Kubernetes与Docker的协同进化
在这个快节奏的数字时代,云原生技术以其灵活性和可扩展性成为了开发者们的新宠。本文将带你深入了解Kubernetes和Docker如何共同塑造现代云计算的架构,以及它们如何帮助企业构建更加敏捷和高效的IT基础设施。
|
17天前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
19天前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
22天前
|
运维 Kubernetes Cloud Native
云原生时代的容器编排:Kubernetes入门与实践
【10月更文挑战第4天】在云计算的浪潮中,云原生技术以其敏捷、可扩展和高效的特点引领着软件开发的新趋势。作为云原生生态中的关键组件,Kubernetes(通常被称为K8s)已成为容器编排的事实标准。本文将深入浅出地介绍Kubernetes的基本概念,并通过实际案例引导读者理解如何利用Kubernetes进行高效的容器管理和服务部署。无论你是初学者还是有一定经验的开发者,本文都将为你打开云原生世界的大门,并助你一臂之力在云原生时代乘风破浪。
|
16天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
50 3
Mysql(4)—数据库索引
|
1天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
14 2