Kubernetes-mysql-nfs单机版部署
背景
简单的在kubernetes上部署单例的mysql数据库
一、环境准备,安装kubernetes集群
当前节点base、master、slave1、slave2
kubernetes安装不在此赘述,请参考参考资料进行安装
kubernetes安装nfs不在此赘述,请参考参考资料进行安装
参考资料
1-Kubernetes基于Centos7构建基础环境(一)
2-Kubernetes基于Centos7构建基础环境(二)
3-Kubernetes基于Centos7构建基础环境(三)
4-Kubernetes-基于Centos7安装面板及监控(四)
1-kubernetes-nfs动态存储部署
| 集群名称 | 集群域名 | 说明 |
|---|---|---|
| base | base.xincan.cn | 部署harbor、nfs等服务 |
| master | master.xincan.cn | kubernetes主节点,做污点容忍,排除业务资源,nfs客户端等 |
| slave1 | slave1.xincan.cn | kubernetes从节点,nfs客户端等 |
| slave2 | slave2.xincan.cn | kubernetes从节点,nfs客户端等 |
二、总体流程:
- 找一台虚拟机部署harbor、nfs服务,我这里不在赘述,请参照前面的文档;
- 在nfs服务端创建mysql数据存储挂载本地位置;
- 在kubernetes主节点上某个目录下创建mysql-single文件夹,也可以自定义,主要保证内部kubernetes资源定义文件一样即可;
- 进入此文件夹之后,复制一下文档中列出的kubernetes资源并保存到此目录下,所有资源如下列表;
[root@master mysql-single]# ll
mysql-single
├── 1-mysql-namespace.yaml
├── 2-mysql-pv.yaml
├── 3-mysql-pvc.yaml
├── 4-mysql-configmap.yaml
├── 5-mysql-secret.yaml
├── 6-mysql-deployment.yaml
└── 7-mysql-service.yaml
- 资源创建;
- 效果展示;
- 连接测试;
三、资源创建
- 创建MySQL的命名空间Namespace,名称为:mysql
- 将所有的资源挂载到此命名空间下;
[root@master mysql-single]# vim 1-mysql-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mysql
labels:
app: mysql
- 创建MySQL的存储资源PersistentVolume,名称为:mysql-pv
[root@master mysql-single]# vim 2-mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
namespace: mysql
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: mysql-pvc
namespace: mysql
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs/data/mysql-single
server: 172.16.124.130
volumeMode: Filesystem
- 创建MySQL的存储匹配资源PersistentVolumeClaim,名称为:mysql-pvc
[root@master mysql-single]# vim 3-mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: mysql
labels:
app: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
- 创建MySQL的配置资源ConfigMap,名称为:mysql-config
[root@master mysql-single]# vim 4-mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
namespace: mysql
labels:
app: mysql
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
max_connections=2000
secure_file_priv=/var/lib/mysql
bind-address=0.0.0.0
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'
-
创建MySQL的配置资源Secret,名称为:mysql-secret
-
通过echo对数据库密码123456进行
base64加密,默认用户是root,后续用到; -
echo -n "123456" | base64
-
[root@master mysql-single]# vim 5-mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: mysql
labels:
app: mysql
type: Opaque
data:
user: cm9vdA== # echo -n "root" | base64
password: MTIzNDU2 # echo -n "123456" | base64
- 创建MySQL实例资源Deployment,名称为:mysql
[root@master mysql-single]# vim 6-mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: base.xincan.cn/library/mysql:v5.7.28
imagePullPolicy: IfNotPresent
args:
- --datadir
- /var/lib/mysql/data
env:
- name: MYSQL_ROOT_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: user
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- name: mysql
containerPort: 3306
livenessProbe:
exec:
command: ["mysqladmin", "ping", "-u${MYSQL_ROOT_USER}", "-p${MYSQL_ROOT_PASSWORD}"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
readinessProbe:
exec:
command: ["mysqladmin", "ping", "-u${MYSQL_ROOT_USER}", "-p${MYSQL_ROOT_PASSWORD}"]
initialDelaySeconds: 5
periodSeconds: 2
timeoutSeconds: 1
resources:
requests:
cpu: 500m
memory: 1Gi
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
- name: config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
- name: localtime
mountPath: /etc/localtime
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
- name: config
configMap:
name: mysql-config
- name: localtime
hostPath:
type: File
path: /etc/localtime
- 创建MySQL对外暴露资源,名称为:mysql
[root@master mysql-single]# vim 7-mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
spec:
type: NodePort
selector:
app: mysql
ports:
- name: http
protocol: TCP
port: 3306
targetPort: 3306
nodePort: 30336
- 创建资源
- 进入mysql-single执行命令:kubectl apply -f ../mysql-single/
- 监听Pod创建命令:kubectl -n mysql get pod -w -o wide
- 撤销进程命令:control+z
- 删除所有资源命令:kubectl delete -f ../mysql-single/
[root@master mysql-single]# kubectl apply -f ../mysql-single/
namespace/mysql created
persistentvolume/mysql-pv created
persistentvolumeclaim/mysql-pvc created
configmap/mysql-config created
secret/mysql-secret created
deployment.apps/mysql created
service/mysql created
[root@master mysql-single]#
[root@master mysql-single]# kubectl -n mysql get pod -w -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-57584b878c-xs76l 1/1 Running 0 60s 192.168.226.25 slave1.xincan.cn <none> <none>
[root@master mysql-single]# kubectl delete -f ../mysql-single/
namespace "mysql" deleted
persistentvolume "mysql-pv" deleted
persistentvolumeclaim "mysql-pvc" deleted
configmap "mysql-config" deleted
secret "mysql-secret" deleted
deployment.apps "mysql" deleted
service "mysql" deleted
[root@master mysql-single]#
四、效果展示
- 通过
kubectl -n mysql get secret,cm,pv,pvc,查询mysql命名空间下对应的secret加密资源,pv(persistentvolume)数据挂载资源,pvc等等资源
[root@master mysql-single]# kubectl -n mysql get secret,sc,cm,pv,pvc,pod,svc
NAME TYPE DATA AGE
secret/default-token-2hqcl kubernetes.io/service-account-token 3 40m
secret/mysql-secret Opaque 2 40m
NAME DATA AGE
configmap/kube-root-ca.crt 1 40m
configmap/mysql-config 1 40m
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mysql-pv 5Gi RWO Retain Bound mysql/mysql-pvc nfs 40m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-pvc Bound mysql-pv 5Gi RWO 40m
NAME READY STATUS RESTARTS AGE
pod/mysql-57584b878c-hqdtj 1/1 Running 0 40m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql NodePort 10.1.4.178 <none> 3306:30336/TCP 40m
[root@master mysql-single]#
五、测试内部连接、navicat外部连接
- 命令方式测试quit; 退出容器
[root@master mysql-single]# kubectl -n mysql exec -it mysql-57584b878c-mgrtt -- mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.7.28 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> quit;
Bye
[root@master mysql-single]#
至此单机版Kubernetes部署mysql单机版完成