一、实验目的
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共享存储挂载规划表
| 序号 | 存储名称 | 挂载目录 | 存储容量 | 访问策略 |
|---|---|---|---|---|
| 1 | cloud-k8s-nfs-1 | /K8s-NFS-1 | 20GB | 允许5个节点访问 |
| 2 | cloud-k8s-nfs-2 | /K8s-NFS-2 | 20GB | 允许5个节点访问 |
| 3 | cloud-k8s-nfs-3 | /K8s-NFS-3 | 20GB | 允许5个节点访问 |
| 4 | cloud-k8s-nfs-4 | /K8s-NFS-4 | 20GB | 允许5个节点访问 |
| 5 | cloud-k8s-nfs-5 | /K8s-NFS-5 | 20GB | 允许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位同学进行实验成果汇报,小组其他成员回答教师提问。根据汇报和答疑情况,对小组成员进行逐一打分。
由教师进行评分。