智能医学工程-云计算技术与应用-实验08-Persistence Storage

273 阅读11分钟

一、实验目的

1、了解 Kubernetes 存储类;

2、掌握 NFS 共享存储的配置;

3、掌握Kubernetes NFS 存储类的基本应用。

二、实验学时

2学时

三、实验类型

设计性

四、实验任务

1、完成NFS共享存储的搭建;

2、完成集群使用NFS共享存储;

3、完成持久化服务应用发布;

4、完成Wordpress服务发布。

五、实验环境

1、硬件

本实验基于实验教学中心网络运维实验室服务器集群开展,每个实验小组分配集群中的1台物理服务器作为实验基础平台,提供云计算资源。每个人配备计算机1台。(学生可根据自身情况使用个人计算机)。

2、软件

Windows操作系统,或MacOS操作系统。

安装最新版本的浏览器,建议使用Edge、Chrome等。

3、网络

计算机使用无线网络接入局域网,能够访问实验教学中心网络运维实验室服务器集群,并支持对互联网的访问。

4、工具

六、实验内容步骤

云数据中心存储规划

(1)NFS服务器规划

共享存储服务器采用NFS,服务器使用虚拟机,配置信息如表8-1所示。

表8-1共享存储服务器配置信息

序号虚拟机配置操作系统配置
1虚拟机名称:Cloud-K8s-NFSCPU:2核内存:2GB硬盘:50GB(系统盘) + 5*20GB(共享存储)网卡:Class-Cloud-VM-Network主机名:Cloud-K8s-NFS操作系统:openEuler 24.03 LTS SP1IP地址:172.16.125.106子网掩码:255.255.255.0网关:172.16.125.1DNS:172.16.125.3

(2)NFS共享存储目录规划

使用1台虚拟机建设NFS服务器,虚拟机配置5个20GB硬盘用于发布NFS共享存储,在NFS服务器上创建5个目录作为挂载点,供K8s集群使用,允许5个K8s节点访问, 共享存储挂载规划如表8-2所示。

表8-2共享存储挂载规划表

序号存储名称挂载目录存储容量访问策略
1cloud-k8s-nfs-1/K8s-NFS-120GB允许5个节点访问
2cloud-k8s-nfs-2/K8s-NFS-220GB允许5个节点访问
3cloud-k8s-nfs-3/K8s-NFS-320GB允许5个节点访问
4cloud-k8s-nfs-4/K8s-NFS-420GB允许5个节点访问
5cloud-k8s-nfs-5/K8s-NFS-520GB允许5个节点访问

搭建NFS服务器

步骤1:安装NFS服务并创建共享目录

#安装NFS相关服务
[root@Cloud-K8s-NFS ~]# yum install -y nfs-utils rpcbind

#启动服务以及设置自启
[root@Cloud-K8s-NFS ~]# systemctl start nfs-server
[root@Cloud-K8s-NFS ~]# systemctl enable nfs-server
[root@Cloud-K8s-NFS ~]# systemctl start rpcbind
[root@Cloud-K8s-NFS ~]# systemctl enable rpcbind

#创建共享目录并授权
[root@Cloud-K8s-NFS ~]# mkdir /{K8s-NFS-1,K8s-NFS-2,K8s-NFS-3,K8s-NFS-4,K8s-NFS-5}
[root@Cloud-K8s-NFS ~]# chmod -R 777 /{K8s-NFS-1,K8s-NFS-2,K8s-NFS-3,K8s-NFS-4,K8s-NFS-5}

步骤2:格式化磁盘

#查看存储设备信息
[root@Cloud-K8s-NFS ~]# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0   50G  0 disk
├─sda1               8:1    0    1M  0 part
├─sda2               8:2    0    1G  0 part /boot
└─sda3               8:3    0   19G  0 part
  ├─openeuler-root 253:0    0   17G  0 lvm  /
  └─openeuler-swap 253:1    0    2G  0 lvm  [SWAP]
sdb                  8:16   0   20G  0 disk
sdc                  8:32   0   20G  0 disk
sdc                  8:48   0   20G  0 disk
sde                  8:64   0   20G  0 disk
sdf                  8:80   0   20G  0 disk
sr0                 11:0    1 1024M  0 rom

#格式化磁盘
[root@Cloud-K8s-NFS ~]# mkfs.ext4 /dev/sdb
mke2fs 1.47.0 (5-Feb-2023)
丢弃设备块:完成
创建含有 5242880 个块(每块 4k)和 1310720 个 inode 的文件系统
文件系统 UUID:964b918d-422e-474f-9d5a-e7710aaf9e74
超级块的备份存储于下列块:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

正在分配组表:完成
正在写入 inode表:完成
创建日志(32768 个块):完成
写入超级块和文件系统账户统计信息:已完成
#格式化其他磁盘
[root@Cloud-K8s-NFS ~]# mkfs.ext4 /dev/sdc
[root@Cloud-K8s-NFS ~]# mkfs.ext4 /dev/sdd
[root@Cloud-K8s-NFS ~]# mkfs.ext4 /dev/sde
[root@Cloud-K8s-NFS ~]# mkfs.ext4 /dev/sdf

步骤3:将磁盘挂载到共享目录

#进行挂载
[root@Cloud-K8s-NFS ~]# mount /dev/sdb /K8s-NFS-1
[root@Cloud-K8s-NFS ~]# mount /dev/sdc /K8s-NFS-2
[root@Cloud-K8s-NFS ~]# mount /dev/sdd /K8s-NFS-3
[root@Cloud-K8s-NFS ~]# mount /dev/sde /K8s-NFS-4
[root@Cloud-K8s-NFS ~]# mount /dev/sdf /K8s-NFS-5

#查看挂载情况
[root@Cloud-K8s-NFS ~]# lsblk

#修改配置文件
[root@Cloud-K8s-NFS ~]# cat >> /etc/exports <<EOF
> /K8s-NFS-1 172.16.125.0/24(rw,sync,no_root_squash)
> /K8s-NFS-2 172.16.125.0/24(rw,sync,no_root_squash)
> /K8s-NFS-3 172.16.125.0/24(rw,sync,no_root_squash)
> /K8s-NFS-4 172.16.125.0/24(rw,sync,no_root_squash)
> /K8s-NFS-5 172.16.125.0/24(rw,sync,no_root_squash)
> EOF
cat /etc/exports

#重启服务
systemctl restart nfs-server
showmount -e

3、为K8s集群添加NFS共享存储

步骤1:在每个集群节点上安装NFS客户端

#在每个集群节点上安装NFS客户端
yum install nfs-utils -y
systemctl start nfs-server
systemctl enable nfs-server

步骤2:为K8s集群添加NFS共享存储

(1)登录Kuboard,在“集群管理”的“概要”中,创建存储类,如图8-1、8-2所示。

(2)创建时,依据给出的测试命令,在主机上进行测试。

#在任意节点验证成功挂载该 NFS 服务
[root@k8s-worker3 ~]# mkdir /tmp/testnfs \
&& mount -t nfs 172.16.125.106:/K8s-NFS-2 /tmp/testnfs \
&& echo "hello nfs" >> /tmp/testnfs/test.txt \
&& cat /tmp/testnfs/test.txt
hello nfs

(3)测试通过后,保存应用并依次添加cloud-k8s-nfs-2、cloud-k8s-nfs-3、cloud-k8s-nfs-4、cloud-k8s-nfs-5存储资源,如图8-3所示。

4、创建用户和命名空间

步骤1:创建命名空间,如图8-4、8-5所示

步骤2:为每个命名空间绑定存储类,点击“存储资源”的“查看存储类”,选择“限定命名空间”并指定具体的命名空间,如图8-6、8-7所示。

步骤3:创建用户并为用户指定命名空间。

(1)创建用户user01-user05,如图8-8所示。

(2)创建用户组user,并关联到用户,点击“角色绑定(集群)”创建角色绑定,将用户组绑定到“sso-user”角色,此时用户组的用户可以访问到本地集群CloudK8s,如图8-9、8-10所示。

(3)进入集群概览页,设置访问控制的“第二阶段授权”,点击“用户”->“为新User授权”,选择用户user01,如图所示

(4)切换到 namspace01 名称空间,并点击 RoleBinding 后面的 添加 按钮,在RoleBinding页面选择命名空间为namspace01,关联的Role的name为admin,如图8-12、8-13所示。

(5)使用user01登录集群,只能选择命名空间namspace01,如图8-14所示。

步骤4:为每个用户的命名空间指定独立的pod网段

需要为每个用户创建一个地址池,该地址池设置的网段就是用户所在的pod网段,之后为命名空间指定地址池。

#查看当前存在的IP池
kubectl get ippools.crd.projectcalico.org

#查看地址池的详细信息
kubectl get ippools.crd.projectcalico.org pool-name -o yaml

#创建5个地址池
cat > ippools.yaml <<EOF
---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: ipv4-ippool01
spec:
  cidr: 192.168.1.0/24
  ipipMode: Always
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never

---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: ipv4-ippool02
spec:
  cidr: 192.168.2.0/24
  ipipMode: Always
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never

---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: ipv4-ippool03
spec:
  cidr: 192.168.3.0/24
  ipipMode: Always
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never

---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: ipv4-ippool04
spec:
  cidr: 192.168.4.0/24
  ipipMode: Always
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never

---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: ipv4-ippool05
spec:
  cidr: 192.168.5.0/24
  ipipMode: Always
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never
EOF
#应用ippools.yaml文件,创建地址池
[root@k8s-master ~]# kubectl apply -f ippools.yaml
ippool.crd.projectcalico.org/ipv4-ippool01 created
ippool.crd.projectcalico.org/ipv4-ippool02 created
ippool.crd.projectcalico.org/ipv4-ippool03 created
ippool.crd.projectcalico.org/ipv4-ippool04 created
ippool.crd.projectcalico.org/ipv4-ippool05 created

#为命名空间指定地址池
kubectl annotate namespace namspace01 "cni.projectcalico.org/ipv4pools"='["ipv4-ippool01"]'
kubectl annotate namespace namspace02 "cni.projectcalico.org/ipv4pools"='["ipv4-ippool02"]'
kubectl annotate namespace namspace03 "cni.projectcalico.org/ipv4pools"='["ipv4-ippool03"]'
kubectl annotate namespace namspace04 "cni.projectcalico.org/ipv4pools"='["ipv4-ippool04"]'
kubectl annotate namespace namspace05 "cni.projectcalico.org/ipv4pools"='["ipv4-ippool05"]'

5、部署并发布Nginx测试服务

步骤1:安装配置MetalLB。

修改kube-proxy代理模式

#修改两处
kubectl edit configmap kube-proxy -n kube-system
---------------------------
strictARP: true
mode: "ipvs"
---------------------------
#重启kube-proxy代理
kubectl rollout restart daemonset kube-proxy -n kube-system

安装MetalLB,并配置地址池

#安装负载均衡器MetalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-frr.yaml

#创建对外发布的地址池
vi matellbpool-l2.yaml
-----------------------------------
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-ip-pool
  namespace: metallb-system
spec:
  addresses:
  - 172.16.125.151-172.16.125.160
---

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default-l2
  namespace: metallb-system
spec:
  ipAddressPools:
  - default-ip-pool

#应用matellbpool-l2.yaml文件,创建地址池
[root@k8s-master ~]# kubectl apply -f matellbpool-l2.yaml
ipaddresspool.metallb.io/default-ip-pool created
l2advertisement.metallb.io/default-l2 created

步骤2:创建测试服务

[root@k8s-master ~]# cat matellbnginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/nginx:latest
        ports:
        - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: nginx-port
    protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

#查看服务地址
[root@k8s-master ~]# kubectl get svc
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes      ClusterIP      10.96.0.1      <none>           443/TCP        9h
nginx-service   LoadBalancer   10.98.176.99   172.16.125.151   80:30515/TCP   7m8s

💡

提醒:

此处发布测试服务主要验证发布服务所使用的地址是MetalLB从地址池中分配的IP地址,这里分配的IP地址是172.16.125.151。

使用浏览器访问http://172.16.125.151,可以看到nginx服务默认页,如图8-15所示。

6、部署并发布Wordpress服务

步骤1:用创建的用户user01登录Kuboard,进入命名空间namespace01。

步骤2:创建存储卷声明PVC,用于挂载MySQL的数据目录,点击“存储”->“创建存储卷声明”,配置如图8-16所示,保存并应用,如图8-17所示。

步骤3:创建MySQL工作负载。

(1)点击“常规操作”->“创建工作负载”,在“基本信息”选项卡中选择工作负载类型,填写工作负载名称,以及添加标签的配置如图8-18所示。

(2)在“容器信息”选项卡中,添加工作容器,设置容器名称、容器镜像为registry.cn-hangzhou.aliyuncs.com/my-common-images/mysql:8.4.3,选择镜像拉取策略、添加用于数据库初始化的环境变量 MYSQL_ROOT_PASSWORD MYSQL_DATABASE MYSQL_USER MYSQL_PASSWORD、以及添加容器端口为3306,配置信息如图8-19、8-20所示。

(3)在“挂载存储”选项卡中,定义存储卷名称、选择存储卷声明以及挂载到容器内的路径,配置信息如图8-21所示。

(4)在“服务/用于路由”选项卡中,点击“服务”复选框,展开服务发布,设置服务类型为ClusterIP,设置Port和targetPort的值为3306,配置信息如图8-22所示,点击保存、应用,等待镜像拉取并成功运行,如图8-23所示。

步骤4:创建wordpress工作负载并对外发布服务。

(1)创建wordpress工作负载,配置信息如图8-24所示。

(2)添加工作容器,设置连接数据库环境变量和容器端口,配置信息如图8-25所示。

(3)保存并应用,待成功创建wordpress工作负载,如图8-26所示。

(4)发布wordpress服务。在“服务”页面,点击YAML,通过yaml文件部署服务,如图8-27所示。

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    app: wordpress
  ports:
  - name: wordpress
    protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

💡

提醒:

通过Kuboard界面发布的服务类型只有Headless、ClusterIP、NodePort。所以LoadBalancer类型的服务只能使用yaml文件创建。

(5)发布完成后,点击wordpress服务后面的YAML查看分配的IP地址,这里分配的IP 地址是172.16.125.153,如图8-28所示。

(6)初始化WordPress。浏览器访问http://172.16.125.153,按照提示安装WordPress,如图8-29、8-30所示。

七、实验讲解

本实验配套讲解视频,访问课程学习平台。

八、实验考核

实验考核为【实验随堂查】。

实验随堂查:每个实验设置3-5考核点,学生现场进行演示和汇报讲解。

1、考核点

考核点1:完成NFS服务器搭建。(20分)

考核点2:完成为K8s集群添加NFS共享存储。(30分)

考核点3:创建用户和命名空间并设置用户访问范围。(20分)

考核点4:完成在K8s集群上部署数据持久化的WordPress服务。(30分)

2、考核方式

以实验小组为单位进行考核,每个小组由1位同学进行实验成果汇报,小组其他成员回答教师提问。根据汇报和答疑情况,对小组成员进行逐一打分。

由教师进行评分。