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
可以看到名为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
可以看到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
可以看到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
可以看到名为mysql的service创建成功。
5.4 查看Deployment
kubectl get deploy
可以看到名为mysql的deployment创建成功。
5.5 查看pod运行情况
kubectl get pod
可以看到pod也是正常运行的。
6.测试mysql可用性
我们测试一下mysql的登录,尝试创建一张测试表,然后测试基本的增删改查。
6.1登录mysql
(1)进入容器内部
kubectl exec -it mysql-58cd545ccb-c8z8t -- /bin/bash
(2)连接mysql
mysql -uroot -p123456
可以看到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输入用户名密码:
可以连接成功,并且可以看到创建的测试库和表。
(2)远程插入数据
我们再navicat上插入一条数据:
然后在服务器上查询一下:
select * from stu_info;
可以查到数据,说明数据库是正常可用的。
6.3 查看数据目录
之前我们通过pv和pvc将数据目录保存在了nfs服务器上的/data/nfs目录,我们上去检查一下。
cd /data/nfs
ll
可以看到数据文件确实都在这里。
7.总结
今天在k8s集群中部署了一个mysql服务,并且测试了一下mysql的使用,因为是个单节点的mysql,对服务状态的要求不高,所以使用的资源类型是deployment,后续会使用statefulSet来部署一套mysql集群。