一、配置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通;

docker swarm使用nfs文件系统挂载 docker部署nfs_kubernetes

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.