环境准备
首先你需要一个k8s环境,可以参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122
什么是PV和PVC
我们可以简单看一下官网的描述:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/#introduction
持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。
持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。
本篇文章就用上面提到的nfs来搭建pv和pvc并部署mysql
环境准备
首先我们需要搭建一个k8s集群,并且准备一台nfs服务器,为了方便我就使用k8s的主节点作为nfs服务器,服务器列表如下表:
IP地址 | 服务器用途 |
192.168.1.160 | k8s-master,k8s的主节点和nfs服务器 |
192.168.1.161 | k8s-node01,k8s的第一个工作节点 |
192.168.1.162 | k8s-node02,k8s的第二个工作节点 |
配置nfs
安装nfs
首先我们需要在三台服务器单中都需要安装nfs软件包,使用如下命令进行安装:
yum install -y nfs-utils • 1
如图三台服务器都需要安装:
配置nfs服务端
然后我们需要在nfs的主服务器暴露一个 /data/nfs/mysql 目录,我们需要修改 /etc/exports 配置文件,需要将这一行加在里面:
/data/nfs/mysql *(rw,sync,no_root_squash)
可以直接执行这行命令,第一行为创建这个目录,第二行为修改文件
mkdir -p /data/nfs/mysql cat >> /etc/exports << EOF /data/nfs/mysql *(rw,sync,no_root_squash) EOF
然后我们需要启动nfs服务,只需要在nfs服务器上执行:
systemctl enable --now nfs-server
然后我们执行这行命令,看目录是否暴露:
showmount -e nfs服务器地址
可以看到目录暴露成功:
创建命名空间
我们需要创建一个命名空间,当然也可以越过这一步,这里创建命名空间的目的只是为了更接近生产环境,创建命名空间的yaml文件:
apiVersion: v1 kind: Namespace metadata: name: deploy-test spec: {} status: {}
上面的yaml文件创建了一个名为 deploy-test 的命名空间,可以查看创建结果:
配置pv和pvc
pv的yaml文件
注意按照提示修改内容:
apiVersion: v1 kind: PersistentVolume metadata: name: deploy-mysql-nfs-pv # pv的名字 namespace: deploy-test # 这里为命名空间的名字 spec: capacity: storage: 1Gi # 申请的硬盘大小为1GB,可修改 accessModes: - ReadWriteMany # 权限为多节点读写 nfs: # 注意修改nfs服务器地址 server: 192.168.1.160 # 注意修改目录的地址 path: /data/nfs/mysql storageClassName: "nfs" # 存储类型选择nfs
pvc的yaml文件
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: deploy-mysql-nfs-pvc # 为pvc取一个好听的名字 namespace: deploy-test # 命名空间名字 spec: accessModes: - ReadWriteMany # 权限为多节点读写 storageClassName: "nfs" # 存储类型为nfs resources: requests: storage: 1Gi # 申请大小容量为1GB volumeName: deploy-mysql-nfs-pv # 绑定的pv名字
执行后我们可以查看创建的状态:
部署mysql
创建mysql的root密码的secret
前面准备工作都做好了,接下来我们就可以开始部署mysql了,但是之前我们还需要创建一个secret,执行命令获取yaml文件内容:
# 命令说明 kubectl create secret generic mysql-password --from-literal=mysql_root_password=mysql的root密码 -n 命名空间 --dry-run=client -o=yaml # 命令示例 kubectl create secret generic mysql-password --from-literal=mysql_root_password=root -n deploy-test --dry-run=client -o=yaml
生成如图所示:
创建mysql部署的yaml
apiVersion: v1 kind: Service metadata: name: deploy-mysql-svc # mysql暴露服务的名字 namespace: deploy-test # 命名空间 labels: app: mysql spec: ports: - port: 3306 # 暴露给外部3306端口 name: mysql targetPort: 3306 # 内部目标3306端口 nodePort: 30306 # 外部访问集群nodeport的30306端口 selector: app: mysql type: NodePort sessionAffinity: ClientIP --- apiVersion: apps/v1 kind: StatefulSet # 创建一个StatefulSet有状态的控制器 metadata: name: deploy-mysql # 部署的名字 namespace: deploy-test # 命名空间 spec: selector: matchLabels: app: mysql serviceName: "deploy-mysql-svc" # 注意指定上面的那个服务名称 replicas: 1 template: metadata: labels: app: mysql spec: terminationGracePeriodSeconds: 10 containers: - args: # 新增一些启动参数 - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --lower_case_table_names=1 - --default-time_zone=+8:00 name: mysql # image: docker.io/library/mysql:5.7.43 image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43 # 因为dockerhub上镜像经常拉取失败,所以使用此镜像 ports: - containerPort: 3306 # 容器内部暴露3306端口 name: mysql volumeMounts: - name: mysql-data # 引用pvc挂载的名字 mountPath: /var/lib/mysql # 这个是容器内部存放数据的文件夹目录,需要挂在到pvc当中 env: - name: MYSQL_ROOT_PASSWORD valueFrom: # mysql的密码引用上面创建的secret secretKeyRef: key: mysql_root_password name: mysql-password volumes: - name: mysql-data # pvc的挂载名称 persistentVolumeClaim: claimName: deploy-mysql-nfs-pvc # 指定使用那个pvc
部署mysql
整体的yaml文件内容为:
apiVersion: v1 kind: Namespace metadata: name: deploy-test spec: {} status: {} --- apiVersion: v1 kind: PersistentVolume metadata: name: deploy-mysql-nfs-pv namespace: deploy-test spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.1.160 path: /data/nfs/mysql storageClassName: "nfs" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: deploy-mysql-nfs-pvc namespace: deploy-test spec: accessModes: - ReadWriteMany storageClassName: "nfs" resources: requests: storage: 1Gi volumeName: deploy-mysql-nfs-pv --- apiVersion: v1 data: mysql_root_password: cm9vdA== kind: Secret metadata: name: mysql-password namespace: deploy-test --- apiVersion: v1 kind: Service metadata: name: deploy-mysql-svc namespace: deploy-test labels: app: mysql spec: ports: - port: 3306 name: mysql targetPort: 3306 nodePort: 30306 selector: app: mysql type: NodePort sessionAffinity: ClientIP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: deploy-mysql namespace: deploy-test spec: selector: matchLabels: app: mysql serviceName: "deploy-mysql-svc" replicas: 1 template: metadata: labels: app: mysql spec: terminationGracePeriodSeconds: 10 containers: - args: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --lower_case_table_names=1 - --default-time_zone=+8:00 name: mysql # image: docker.io/library/mysql:5.7.43 image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43 ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-data mountPath: /var/lib/mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: key: mysql_root_password name: mysql-password volumes: - name: mysql-data persistentVolumeClaim: claimName: deploy-mysql-nfs-pvc
执行以下命令部署:
kubectl apply -f deploy-mysql.yaml
创建结果:
执行下面这行命令监控部署:
watch kubectl get all -o wide -n deploy-test
看到下面这个代表创建成功:
当我们查看nfs当中挂在出来的mysql目录的时候:
ll /data/nfs/mysql/
文件夹内容:
链接mysql
外部链接
在我们创建mysql的时候我们就规定了一个NodePort端口,如图:
我们直接使用集群当中任意一个节点的30306端口即可链接这个数据库:
mysql -uroot -h192.168.1.160 -p -P30306
查看结果:
内部链接
在集群里面访问我们可以通过主机名,主机名格式如下:
<pod名称>.<service名称>.<命名空间名称>.svc.cluster.local
执行命令查看:
kubectl get all -o wide -n deploy-test
各类名称如图所示:
所以我们此次访问mysql的主机名如下:
deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local
我们此次就不建立其他的pod来验证是否能够安装上了,我们直接检查集群内的dns解析是否正常就知道这个域名是否正常了,使用以下命令查看k8s集群当中的dns服务的地址:
kubectl get svc -o wide -n kube-system | grep dns
查看dns服务地址:
直接通过 nslookup 尝试解析查看是否解析到正确的IP地址上:
# 安装nslookup命令所在的软件包 yum install -y bind-utils # 解析域名 nslookup deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local 10.96.0.10
发现域名解析是正常的:
好了,k8s上部署mysql完成了,下课