在k8s中部署单节点mysql

社区K8s

0.前言

之前已经和大家讲了很多k8s的基础知识,并且也写了一些简单的案例,但之讲解的案例中的服务都是无状态的服务。今天我们基于Deployment在k8s中搭建一个单节点的mysql,来看看在k8s集群中如何部署和使用有状态的服务。

1.准备工作

需要创建的资源类型有:
(1)ConfigMap: MySQL配置文件信息;
(3)Service:MySQL访问方式;
(4)pv和pvc:数据存储;
(5)StatefulSet:管理MySQL服务。

3.ConfigMap

3.1 创建声明式文件

cd /data/mysql
cat mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  labels:
    app: mysql
  namespace: mysql  
data:
  my.cnf: |-
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld] 
    max_connections = 2000
    secure_file_priv=/var/lib/mysql
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

3.2 创建ConfigMap

kubectl apply -f mysql-configmap.yaml

3.3 查看ConfigMap

kubectl get cm -n mysql

picture.image 可以看到名为mysql的ConfigMap创建成功。

4.pv和pvc

4.1 创建pv的声明文件

cd /data/mysql
cat mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql
  labels:
    app: mysql             #设置 pv 的 label 标签
spec:
  capacity:          
    storage: 2Gi          #设置 pv 存储资源大小 
  accessModes:       
  - ReadWriteOnce
  mountOptions:
  - hard
  - nfsvers=4.1    
  nfs:                        #指定使用 NFS 存储驱动
    server: 192.168.159.166   #指定 NFS 服务器 IP 地址
    path: /data/nfs           #指定 NFS 共享目录的位置
  persistentVolumeReclaimPolicy: Retain

4.2 创建pv

kubectl apply -f mysql-pv.yaml

4.3 查看pv

kubectl get pv

picture.image 可以看到pv创建成功。

4.4 创建pvc声明文件

cd /data/mysql
cat mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql
spec:
  resources:
    requests:
      storage: 2Gi        #设置 pvc 存储资源大小
  accessModes:
  - ReadWriteOnce
  selector:
    matchLabels:
      app: mysql           #根据 Label 选择对应 PV

4.5 创建pvc

kubectl apply -f mysql-pvc.yaml

4.6 查看pvc

kubectl get pvc |grep mysql

picture.image 可以看到pvc创建成功,并且处于Bound状态。

5.Deployment

5.1 创建声明文件

cd /data/mysql
cat mysql-deploy.yaml
## Service
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  type: NodePort
  ports:
  - name: mysql
    port: 3306
    targetPort: 3306
    nodePort: 30336
  selector:
    app: mysql
---
## Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:     
      containers:
      - name: mysql
        image: docker.m.daocloud.io/library/mysql:8.0.19
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD    ## 配置Root用户默认密码
          value: "123456"
        resources:
          limits:
            cpu: 2000m
            memory: 512Mi
          requests:
            cpu: 2000m
            memory: 512Mi
        livenessProbe:
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
          exec:
            command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
        readinessProbe:  
          initialDelaySeconds: 10
          periodSeconds: 10
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
          exec:
            command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
        - name: config
          mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
        - name: localtime
          readOnly: true
          mountPath: /etc/localtime
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: mysql
      - name: config      
        configMap:
          name: mysql-config
      - name: localtime
        hostPath:
          type: File
          path: /etc/localtime

5.2 创建Deployment

kubectl apply -f mysql-deploy.yaml

5.3 查看service

kubectl get svc

picture.image

可以看到名为mysql的service创建成功。

5.4 查看Deployment

kubectl get deploy

picture.image 可以看到名为mysql的deployment创建成功。

5.5 查看pod运行情况

kubectl get pod

picture.image 可以看到pod也是正常运行的。

6.测试mysql可用性

我们测试一下mysql的登录,尝试创建一张测试表,然后测试基本的增删改查。

6.1登录mysql

(1)进入容器内部

kubectl exec -it mysql-58cd545ccb-c8z8t -- /bin/bash

(2)连接mysql

mysql -uroot -p123456

picture.image 可以看到mysql连接成功。

6.2 测试基本功能

(1)创建测试库和表

create database student;
use student;
create table stu_info(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL);

测试库和表都创建成功,我们再从外部连接一下数据库,使用navicat输入用户名密码:

picture.image
可以连接成功,并且可以看到创建的测试库和表。

(2)远程插入数据
我们再navicat上插入一条数据: picture.image

然后在服务器上查询一下:

select * from stu_info;

picture.image 可以查到数据,说明数据库是正常可用的。

6.3 查看数据目录

之前我们通过pv和pvc将数据目录保存在了nfs服务器上的/data/nfs目录,我们上去检查一下。

cd /data/nfs
ll

picture.image 可以看到数据文件确实都在这里。

7.总结

今天在k8s集群中部署了一个mysql服务,并且测试了一下mysql的使用,因为是个单节点的mysql,对服务状态的要求不高,所以使用的资源类型是deployment,后续会使用statefulSet来部署一套mysql集群。

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论