𝑰’𝒎 𝒉𝒉𝒈, 𝑰 𝒂𝒎 𝒂 𝒈𝒓𝒂𝒅𝒖𝒂𝒕𝒆 𝒔𝒕𝒖𝒅𝒆𝒏𝒕 𝒇𝒓𝒐𝒎 𝑵𝒂𝒏𝒋𝒊𝒏𝒈, 𝑪𝒉𝒊𝒏𝒂.
前置知识你需要知道的,不然部署文件看不懂的。前置知识,在之前的几个博客里面都有的。我最后会列出来的。
所有节点安装NFS服务
yum install -y nfs-common nfs-utils rpcbind
在宿主机上创建共享文件夹,并且修改文件夹的访问权限
mkdir /data/nfsData
chmod 755 /data/nfsData/
设置NFS文件夹的可访问权限。192.168.88.0 是允许这个网段的去访问这个nfs目录。
/data/nfsData 192.168.88.0/24(rw,sync,no_root_squash,no_all_squash)
启动服务,并且设置开机自启
sudo systemctl enable rpcbind
sudo systemctl enable nfs
sudo systemctl start rpcbind
sudo systemctl start nfs
客户端验证
[root@k8s-node11 ~]# mkdir /nfs
[root@k8s-node11 ~]# mount -t nfs 192.168.88.130:/data/nfsData /nfs
[root@k8s-node11 ~]# df -Th
192.168.88.130:/data/nfsData nfs4 46G 7.7G 39G 17% /nfs
在宿主机创建一个文件,同时在客户机上看见就说明NFS没问题了。因为我是事后记录的,可能忘记了什么东西。可以再找找,其他人的教程。
到这里我们就在宿主机上有一个NFS目录了。
从Docker过来我们都知道,配置文件需要外置,这样修改起来也很方便,配置也不会丢失,那么K8S里面我们同样可以用configMap去实现这个。,用 ConfigMap 存储,然后挂载进入镜像内部。这样,只要修改 ConfigMap 里面的配置,再重启应用就能很方便就能够使应用重新加载新的配置,很方便。
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
labels:
app: mysql
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
default-time_zone = '+8:00'
[mysqld]
max_connections = 2000
secure_file_priv=/var/lib/mysql
部署命令
kubectl create -f mysql-config.yaml
docker里面我们用的是用宿主机映射到docker容器里面,这样即使容器出现了问题,MySQL里面的数据也是不会丢失的,那么我们在k8s里面怎么实现呢?
kubernetes 部署的应用一般都是无状态应用,部署后下次重启很可能会漂移到不同节点上,所以不能使用节点上的本地存储,而是需要网络存储对应用数据持久化,PV 和 PVC 是 Kubernetes 用于与储空关联的资源,可与不同的存储驱动建立连接,存储应用数据,所以接下来我们要创建 Kubernetes PV、PVC 资源。
关于PV和PVC可以参考:缺省
PV,PVC定义
这里我们PV存储在NFS服务器上,这就是为什么一开始要先部署NFS,可能是我刚接触到这一个,其他存储方式还不了解。
## PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql
labels:
app: mysql #设置 pv 的 label 标签
spec:
capacity:
storage: 5Gi #设置 pv 存储资源大小
accessModes:
- ReadWriteOnce
# mountOptions:
# - hard
# - nfsvers=4.1
nfs: #指定使用 NFS 存储驱动
server: 192.168.88.130 #指定 NFS 服务器 IP 地址
path: /data/nfsData/mysql #/nfs/mysql #指定 NFS 共享目录的位置,且需提前在该目录中创建 mysql 目录
persistentVolumeReclaimPolicy: Retain
---
## PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql
spec:
resources:
requests:
storage: 5Gi #设置 pvc 存储资源大小
accessModes:
- ReadWriteOnce
selector:
matchLabels:
app: mysql #根据 Label 选择对应 PV
部署pv/pvc
kubectl create -f mysql-storage.yaml
创建用于 Kubernetes Deployment 来配置部署 Mysql 的参数,需要配置 Mysql 的镜像地址、名称、版本号,还要配置其 CPU 与 Memory 资源的占用,通过环境变量配置 Mysql 的 root 用户默认密码,配置探针监测应用可用性,配置 Volume 挂载之前创建的 PV、PVC、ConfigMap 资源等等,内容如下:
## Service
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: NodePort
ports:
- name: mysql
port: 3306 # 集群内部访问service的端口
targetPort: 3306 # 容器映射在pod上面的端口
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: 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 # 数据文件,用的NFS
- name: config
mountPath: /etc/mysql/conf.d/my.cnf # mysql的配置文件
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
参数简介:
注意为什么volume中用的subPath是因为不加的话,会对容器/etc/mysql/conf.d/这个目录,进行全覆盖,也就是容器里面的所有的文件都没了,但是我们只需要把configMap里面的一个key-value映射进去,并且名字叫my.cnf,这里就可以这么做。我会在configMap讲解中,再次说明这个问题,同时subPath有一个弊端,就是configMap修改之后,subPath是不会自动更新的,必须要手动更新。这跟普通的挂载整个目录是有区别的。你可以修改一下试试看
可以通过改annotations的方法去强制更新。
kubectl patch deployment mysql --patch '{"spec": {"template": {"metadata": {"annotations": {"update": "2" }}}}}'
部署
kubectl create -f mysql-deploy.yaml
看一眼配置里面的MySQL正确设置没有就行,并且进入pod里面,输入date看映射的hostpath有没有成功更改容器系统的时区。