k8s环境
kuboard 页面工具,后面可以使用页面的方式创建,当然我后面也会提供一份 yaml
的配置文件
如果不了解k8s中的存储的相关概念的,可以参考我的这篇文件 (六)k8s存储
k8s节点情况如下
角色 | 地址 |
---|---|
master | 192.168.160.170 |
node01 | 192.168.160.171 |
node02 | 192.168.160.172 |
1、因为在k8s安装中,如果你没有指定数据挂载的话,那么容器重启的时候,数据就丢失了。
2、而且我们在安装的时候,是不建议直接使用 hostPath
,因为如果下次镜像实例跑到另一个节点上去了,那么可能执行的结果回不同。
3、所以这里采用 PV + PVC 的方式,其中PV我们采用 NFS的方式,,存储卷的类型有如下几种方式
1、PV 支持多种存储驱动,不同存储驱动的 PV 配置方式是不同的,需要根据你的存储系统来配置 PV 参数。我这里用的是 NFS 存储(共享网络文件存储系统)
这里的PV你也可以使用 hostPath,但是不建议吧
1、安装nfs命令
# 每个机器都需要安装 包括k8s集群,不然不能使用挂载命令,因为后续如果重启,你不知道这个实例会跑到那个节点上去.
yum install -y nfs-common nfs-utils rpcbind
2、这里准备将nfs 放在 node01 也就是 192.168.160.171
上面,即在node01 上面执行如下命令,创建nfs
# 每个节点
mkdir /nfs1
chmod 777 /nfs1
chown nfsnobody /nfs1
vim /etc/exports
/nfs1 *(rw,no_root_squash,no_all_squash,sync)
# 如果重启失败,可以尝试 start
systemctl restart rpcbind
systemctl restart nfs
3、 nfs 挂载,即将master节点的 /test
挂载到 node01 的的/nfs1
目录
4、测试挂载是否成功,我们在 master节点上 对/test目录下创建修改删除文件,那么node1节点的nfs1目录下也会出现相同的数据
5、设置NFS 开机自启动,每一个节点都需要
systemctl enable rpcbind
systemctl enable nfs
1、这一部分使用,我们可以用 kuboard 这个页面工具来创建
2、点击创建后,如下
4、如果你想使用 yaml,创建,这里给出对应的文件,如下,你也可以参考前面文章里面提到的他也有给出 Kubernetes 部署 Mysql 8.0 数据库(单节点)
---
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/bound-by-controller: 'yes'
finalizers:
- kubernetes.io/pv-protection
name: nfs-pv-mysql-pv-nfs
resourceVersion: '2532545'
spec:
accessModes:
- ReadWriteMany
capacity:
storage: '20'
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: nfs-pvc-mysql-pv-nfs
namespace: kube-system
resourceVersion: '2532543'
uid: 262c36d1-d10d-47f0-a627-d97979e6d7f9
nfs:
path: /nfs1
server: 192.168.160.171
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-storageclass-provisioner
volumeMode: Filesystem
status:
phase: Bound
1、这一部分使用,我们还是可以用 kuboard 这个页面工具来创建
2、点击创建
4、如果你想使用 yaml,创建,这里给出对应的文件,如下,你也可以参考前面文章里面提到的他也有给出 Kubernetes 部署 Mysql 8.0 数据库(单节点)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
k8s.kuboard.cn/pvcType: Dynamic
finalizers:
- kubernetes.io/pvc-protection
name: mysql-pvc
namespace: test
resourceVersion: '2533536'
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: mysql-pv-nfs
volumeMode: Filesystem
status:
phase: Pending
1、因为MySQL启动的时候需要加载 my.cnf 文件,这个文件是肯定需要挂载出来的,但是这个文件,我们不是很想都去系统种找使用 vim
命令去修改,所以我们可以创建成configMap
的类型,后面创建MySQL的时候使用它就好了。
4、具体内容如下
[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
1、创建
docker pull mysql:8.0.27
MYSQL_ROOT_PASSWORD
3、配置就绪检查
mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping
4、配置存活检查
mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping
5、挂载卷配置
/var/lib/mysql # MySQL的数据目录
/etc/mysql/conf.d/my.cnf # MySQL的配置文件
5、(这一步骤可以不做)其中我们没有配置更新的策略,默认是滚动更新,并且最大超出副本数为25%,最大不可用副本数
也为 25% (这个参数就会导致在更新的时候,最多可能会出现一个实例不可用的情况。),如果你当初这里没有改,后续想要改,可以手动修改文件,或者通过页面修改
1、你也可以参考前面文章里面提到的他也有给出 Kubernetes 部署 Mysql 8.0 数据库(单节点)
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
k8s.kuboard.cn/displayName: 业务数据库mysql8
labels:
k8s.kuboard.cn/layer: db
k8s.kuboard.cn/name: mysql-bussiness
name: mysql-bussiness
namespace: test
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s.kuboard.cn/layer: db
k8s.kuboard.cn/name: mysql-bussiness
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
k8s.kuboard.cn/layer: db
k8s.kuboard.cn/name: mysql-bussiness
spec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
image: 'mysql:8.0.27'
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- mysqladmin
- '-uroot'
- '-p${MYSQL_ROOT_PASSWORD}'
- ping
failureThreshold: 1
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: mysql-bussiness-mysql8
readinessProbe:
exec:
command:
- mysqladmin
- '-uroot'
- '-p${MYSQL_ROOT_PASSWORD}'
- ping
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 3
timeoutSeconds: 5
volumeMounts:
- mountPath: /var/lib/mysql
name: volume-ype3p
- mountPath: /etc/mysql/conf.d/my.cnf
name: volume-z6icw
subPath: my.cnf
volumes:
- name: volume-ype3p
persistentVolumeClaim:
claimName: mysql-pvc
- configMap:
defaultMode: 420
name: mysql-config
name: volume-z6icw
1、我们知道,通过上述的操作,这个容器的数据是在 node01 的 /nfs1
目录,如下
2、如果你不小心,把这个目录删除了,那么mysql 在启动的时候就会说找不到这个nfs的挂载目录,从而会启动失败,这个时候,你只需要去手动创建这个文件夹就好。