单元测试:
客户端连接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就部署完了。