一、配置NFS服务
1. 服务器端安装 NFS与RPC 服务
yum install -y nfs-utils rpcbind
2. 其他工作节点需要安装nfs客户端
yum install -y nfs-utils
3. 启动 RPC 服务
systemctl start rpcbind
Systemctl enable rpcbind #服务开机自启
4. 查看 NFS 服务项 rpc 服务器注册的端口列表
rpcinfo -p localhost
5. 启动 NFS 服务
systemctl start nfs
Systemctl enable nfs #服务开机自启
6. 启动 NFS 服务后 rpc 服务已经启用了对 NFS 的端口映射列表
rpcinfo -p localhost
7. 在服务器端创建2个共享目录并设置权限:
mkdir -p /home/pvdata/mysql
mkdir -p /home/pvdata/wordpress
chmod 777 /home/pvdata/mysql
chmod 777 /home/pvdata/wordpress
#请注意:权限至少要授权可读写权限,要不然后面服务启动会报错;
8. 修改 NFS 配置文件 /etc/exports
vim /etc/exports
/home/pvdata/mysql *(rw,sync,insecure,no_subtree_check,no_root_squash)
/home/pvdata/wordpress *(rw,sync,insecure,no_subtree_check,no_root_squash)
9. NFS配置文件生效
exportfs -r
10. 查验NFS挂载的目录
exportfs
二、配置NFS PV持久化存储
1. 创建mysql pv卷
[root@k8s-node01 wordpree-mysql]# vim mysql-persistent-storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-persistent-storage #pv名称
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce #该卷能够以读写模式被加载到一个节点上
persistentVolumeReclaimPolicy: Recycle #删除pod后,文件自动删除
storageClassName: nfs
nfs:
path: /home/pvdata/mysql/ #对应上面NFS目录
server: 10.0.0.1 #对应NFS服务器IP
2. 创建wordpress pv卷
[root@k8s-node01 wordpree-mysql]# cat wordpress-persistent-storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-persistent-storage #pv名称
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce #该卷能够以读写模式被加载到一个节点上
persistentVolumeReclaimPolicy: Recycle #删除pod后,文件自动删除
storageClassName: nfs
nfs:
path: /home/pvdata/wordpress/ #对应上面NFS目录
server: 10.0.0.1
3. 应用pv yaml配置文件
kubectl apply -f mysql-persistent-storage.yaml
kubectl apply -f wordpress-persistent-storage.yaml
4. #查验部署好的PV存储卷
kubectl get pv -o wide
三、配置MySQL与WordPress Yaml文件
1. 创建独立的文件夹
mkdir -p /home/wordpree-mysql
2. 创建 kustomization.yaml、创建 Secret 生成器
通过以下命令在kustomization.yaml中添加一个 Secret 生成器:
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=Aa123ffbo #改成自己密码
EOF
3. MySQL 资源配置
官方可下载模型文件:curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
编辑修改Yaml文件
[root@k8s-node01 wordpree-mysql]# vim mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim #创建PV声明
metadata:
name: mysql-pv-claim #pvc名称
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce #需要与PV保护一致
resources:
requests:
storage: 10Gi
storageClassName: nfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
imagePullPolicy: IfNotPresent #本地有则使用本地镜像,可提前在node节点上下载好相关版本镜像,部署快!
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage #卷挂载名称
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage #对应卷挂载名称
persistentVolumeClaim:
claimName: mysql-pv-claim #对应创建好的PVC名称
4. wordpress 资源配置
官方可下载模型文件:curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
编辑修改Yaml文件:
[root@k8s-node01 wordpree-mysql]# vim wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim #创建PV声明
metadata:
name: wp-pv-claim #pvc名称
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce #需要与PV保护一致
resources:
requests:
storage: 10Gi
storageClassName: nfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:latest
name: wordpress
imagePullPolicy: IfNotPresent #本地有则使用本地镜像,可提前在node节点上下载好相关版本镜像,部署快!
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage #挂载卷名称
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage #对挂载卷名称名称
persistentVolumeClaim:
claimName: wp-pv-claim #对应创建好的PVC名称
5. 将以上两个文件补充到 kustomization.yaml 文件中
cat <<EOF >>./kustomization.yaml
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
EOF
四、应用和验证
1. 在wordpress-mysql目录下执行以下命令
kubectl apply -k ./
2. 通过运行以下命令验证 Secret 是否存在
kubectl get secrets
3. 验证是否已动态配置 PersistentVolume
kubectl get pvc
4. 通过运行以下命令来验证 Pod \server是否正在运行
kubectl get all -o wide
5. 查看wordpress服务运行日志
[root@k8s-node01 wordpree-mysql]# kubectl logs -f service/wordpress
6. 使用浏览器登录站点
http://172.25.83.131:31706/ #该IP地址对应node外网地址,端口对应WordPress服务对外的端口;
五、部署过程遇到的问题
1. 解析不到相应的IP地址、主机名
原因node pod节点间网络不通,需排查网络,确保mysql pod与wordpree pod之间能ping通;
2. Mysql or wordpree pod反复重启
原因: 文件写入pv卷失败,NFS目录没有写的权限,授权文件夹读写执行权限
3、在创建Pod过程中镜像Download失败
如本地网络不行,会造成Yaml部署失败,因此建议在其中一个Work node上提前下载相应镜像版本,具体操作过程如下:
a、下载镜像
Docker pull mysql:5.7
b、将下载好的镜像通过docker save 命令导出成镜像tar文件
docker save mysql:5.7 > /home/mysql.tar #保存在home目录下
c、通过SCP远程复制命令,将该文件拷贝到其他work node节点:
Scp /home/mysq.tar root@10.0.0.3:/home #将home目录下的mysql.tar文件,通过root账号传到node3 10.0.03节点/home目录下
d、对已经保存在本地的tar文件,通过docker load命令导入镜像
docker load -i mysql.tar
e、检查node节点镜像是否已经存在
docker images
注意:yaml 文件的的镜像下载策略设置为IfNotPresent
imagePullPolicy: IfNotPresent #本地有则使用本地镜像,没有则从远程镜像仓库下载
六、一键删除部署
运行一下命令删除您的 Secret,Deployments,Services and PersistentVolumeClaims:
kubectl delete -k ./
End.