vlambda博客
学习文章列表

k8s实战之MySQL单实例部署

前面我们学习了k8s入门系列文章,了解了k8s的一些基础概念以及怎么使用。本篇文章将进行一个小小的实战,使用k8s来部署单机版的mysql数据库,基本涵盖到前面讲到的Namespace、Pod、Deployment、Service、PV、PVC、Secret等资源对象。

我们先画一张结构图来表示整个部署的逻辑流程,如图所示:



一、一步一步来规划

1.创建namespace,把mysql部署在单独的名称空间中

名称空间的用法可以参考文章:

kubectl create namespace dev

2.创建持久卷PV,用来存储mysql数据文件

PV的用法可以参考文章:

(1)定义一个容量大小为1GB的PV,挂载到/nfs/data/01目录,需手动创建该目录

mkdir -p /nfs/data/01

(2)编写mysql-pv.yaml文件内容,要创建的pv对象名称:pv-1gi

# 定义持久卷信息
apiVersion: v1
kind: PersistentVolume
metadata:
# pv是没有namespace属性的,它是一种跨namespace的共享资源
name: pv-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
# 存储类,具有相同存储类名称的pv和pvc才能进行绑定
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 192.168.59.110

(3)创建该PV对象

kubectl create -f mysql-pv.yaml

(4)查看创建结果

k8s实战之MySQL单实例部署


3.创建持久卷声明PVC

PVC的用法可以参考文章:

声明存储大小为1Gb的PVC资源,k8s会根据storageClassName存储类名称找到匹配的PV对象进行绑定。

(1)编写mysql-pvc.yaml文件内容,要创建的pvc对象名称是:mysql-pvc

# 定义mysql的持久卷声明信息
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
# 存储类,具有相同存储类名称的pv和pvc才能进行绑定
storageClassName: nfs

(2)创建该PVC对象

kubectl create -f mysql-pvc.yaml

(3)查看创建结果

可以看到mysql-pvc对象已经和pv-1gi对象绑定上了。

k8s实战之MySQL单实例部署


4.创建Secret对象用来保存mysql的root用户密码

Secret的用法可以参考文章:

(1)设置密码为123456,执行创建命令

kubectl create secret generic mysql-root-password --from-literal=password=123456 -n dev

(2)查看创建结果

k8s实战之MySQL单实例部署


5.创建Deployment和Service

Deployment的用法可以参考文章:

Service的用法可以参考文章:

(1)编辑mysql-svc.yaml文件内容

service使用NodePort类型,指定暴露的nodePort端口为31234,我们会在宿主机使用navicat客户端对mysql进行访问

# 定义mysql的Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
namespace: dev
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:8.0
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-root-password
key: password
# 如果你不想使用secret对象保存mysql登录密码,可以直接使用下面的方式指定,简单粗暴未尝不可
#value: "123456"
ports:
- containerPort: 3306
volumeMounts:
- name: mysqlvolume
mountPath: /var/lib/mysql
volumes:
- name: mysqlvolume
# 使用pvc
persistentVolumeClaim:
claimName: mysql-pvc
---
#定义mysql的Service
apiVersion: v1
kind: Service
metadata:
labels:
app: svc-mysql
name: svc-mysql
namespace: dev
spec:
selector:
app: mysql
type: NodePort
ports:
- port: 3306
protocol: TCP
targetPort: 3306
nodePort: 31234

(2)执行创建命令

kubectl create -f mysql-svc.yaml

(3)查看创建结果

可以看到mysql的pod已处于运行状态

k8s实战之MySQL单实例部署


二、测试

在宿主机通过Navicat客户端来连接部署好的mysql服务,IP是三台虚拟节点的任意一台IP,端口是在创建Service时手动指定的31234。

1.连接数据库服务

k8s实战之MySQL单实例部署


2.创建数据库与表数据

k8s实战之MySQL单实例部署


3.查看nfs目录

k8s实战之MySQL单实例部署


4.你可以删掉服务,然后重新创建,之前的mysql数据并不会丢失