2-Kubernetes-mysql-nfs单机版部署

553 阅读5分钟

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动态存储部署

集群名称集群域名说明
basebase.xincan.cn部署harbor、nfs等服务
mastermaster.xincan.cnkubernetes主节点,做污点容忍,排除业务资源,nfs客户端等
slave1slave1.xincan.cnkubernetes从节点,nfs客户端等
slave2slave2.xincan.cnkubernetes从节点,nfs客户端等

二、总体流程:

  1. 找一台虚拟机部署harbor、nfs服务,我这里不在赘述,请参照前面的文档;
  2. 在nfs服务端创建mysql数据存储挂载本地位置;
  3. 在kubernetes主节点上某个目录下创建mysql-single文件夹,也可以自定义,主要保证内部kubernetes资源定义文件一样即可;
  4. 进入此文件夹之后,复制一下文档中列出的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
  1. 资源创建;
  2. 效果展示;
  3. 连接测试;

三、资源创建

  1. 创建MySQL的命名空间Namespace,名称为:mysql
    • 将所有的资源挂载到此命名空间下;
[root@master mysql-single]# vim 1-mysql-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: mysql
  labels:
    app: mysql
  1. 创建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
  1. 创建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
  1. 创建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'
  1. 创建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
  1. 创建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
  1. 创建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
  1. 创建资源
    • 进入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]#

四、效果展示

  1. 通过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外部连接

  1. 命令方式测试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单机版完成