BRICS-FS-11_云计算赛项样题

2022 年金砖国家职业技能大赛BRICS-FS-11_云计算赛项样题

校验:@Zelas2Xerath

勘误:leancode@189.cn

A 场次题目:OpenStack 平台部署与运维

业务场景:

某企业拟使用openstack 搭建一个企业云平台,用于部署各类企业应用对外对内服务。云平台可实现IT 资源池化、弹性分配、集中管理、性能优化以及统一安全认证等。企业云平台的搭建使用竞赛平台提供的两台云服务器,配置如下表:

设备名称 主机名 接口 IP 地址 说明
云服务器1 Controller eth0
eth1
172.17.x.10/24
172.18.x.10/24
Vlan 1x0
Vlan 2x0
云服务器2 Compute eth0
eth1
172.17.x.20/24
172.18.x.20/24
Vlan 1x0
Vlan 2x0

任务 1 私有云平台环境初始化(5 分)

1.初始化操作系统

使用提供的用户名密码,登录竞赛云平台。根据表1 中的IP 地址规划,设置各服务器节点的IP 地址,确保网络正常通信,设置控制节点主机名为Controller,计算节点主机名为 Compute,并修改 hosts 文件将IP 地址映射为主机名,设置 SELinux 为 Permissive 模式并设置永久关闭。请查看控制节点和计算节点主机名,使用命令查看 SELinux 状态,使用 head 命令、tail 命令或 cat 命令提取出永久关闭 SELinux 的关键信息。

将以上命令及返回结果提交到答题框。【2 分】

Controller:

1
2
3
4
5
6
nmcli con add con-name ens32 type ethernet ifname ens32 ipv4.address 172.17.2.10/24 ipv4.method static autoconnect yes
nmcli con add con-name ens33 type ethernet ifname ens33 ipv4.address 172.18.2.10/24 ipv4.method static autoconnect yes ipv4.gateway 172.18.2.2 ipv4.dns 172.18.2.2
nmcli con up ens32
nmcli con up ens33
hostnamectl set-hostname --static controller
bash

Compute:

1
2
3
4
5
6
nmcli con add con-name ens32 type ethernet ifname ens32 ipv4.address 172.17.2.20/24 ipv4.method static autoconnect yes
nmcli con add con-name ens33 type ethernet ifname ens33 ipv4.address 172.18.2.20/24 ipv4.method static autoconnect yes ipv4.gateway 172.18.2.2 ipv4.dns 172.18.2.2
nmcli con up ens32
nmcli con up ens33
hostnamectl set-hostname --static compute
bash

Controller & Compute:

1
2
3
4
5
6
7
8
9
cat >> /etc/hosts << EOF
172.17.2.10 controller
172.18.2.10 controller
172.17.2.20 compute
172.18.2.20 compute
EOF
systemctl disable firewalld --now
setenforce 0
sed -i 's/SELINUX=enforcing/=SELINUX=disabled/g'
1
2
3
hostnamectl
getenforce
cat /etc/selinux/config | grep SELINUX=disabled

2.挂载安装光盘镜像

将提供的CentOS-7-x86_64-DVD-1804.iso 和chinaskills_cloud_iaas.iso 光盘镜像上传到 Controller 节点/root 目录下,然后在/opt 目录下使用一条命令创建/centos 目录和 /iaas 目录,并将镜像文件CentOS-7-x86_64-DVD-1804.iso 挂载到 /centos 目录下,将镜像文件 chinaskills_cloud_iaas.iso 挂载到 /iaas 目录下。

请将以上命令及返回结果返回到答题框。【1 分】

Controller

1
2
3
4
5
6
7
8
9
10
scp CentOS-7-x86_64-DVD-1804.iso chinaskills_cloud_iaas.iso root@172.17.2.10:/root
mkdir /opt/centos /opt/iaas /mnt/iso
mount -o loop CentOS-7-x86_64-DVD-1804.iso /opt/centos
mount -o loop chinaskills_cloud_iaas.iso /opt/iaas
mount /dev/sr0 /mnt/iso
cp -rvf /mnt/iso/* /opt/iaas/
umount /mnt/iso
mount /dev/sr1 /mnt/iso
cp -rvf /mnt/iso/* /opt/centos
umount /mnt/iso

3.设置 yum 源

将ftp 仓库设置为 /opt/,为 controller 节点设置本地yum 源,yum 源文件名为local.repo;为 compute 配置 ftp 源,yum 源文件名称为 ftp.repo,其中ftp 服务器地址为 controller 节点IP。

请将两个节点的yum 源文件内容提交到答题框。【0.5 分】

Controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mv /etc/yum.repos.d/* /media/
cat > /etc/yum.repos.d/local.repo << EOF
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
[iaas]
name=iaas
baseurl=file:///opt/iaas/iaas-repo
gpgcheck=0
enabled=1
EOF

yum clean all
yum makecache
yum repolist

Compute:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mv /etc/yum.repos.d/* /media/
cat > /etc/yum.repos.d/local.repo << EOF
[centos]
name=centos
baseurl=ftp://172.17.2.10/centos
gpgcheck=0
enabled=1
[iaas]
name=iaas
baseurl=ftp://172.17.2.10/iaas/iaas-repo
gpgcheck=0
enabled=1
EOF

yum clean all
yum makecache
yum repolist

4.搭建文件共享服务器

在 Controller 节点上安装 vsftp 服务器,设置开机自启动,请将以上命令及返回结果提交到答题框。【0.5 分】

Controller:

1
2
3
4
5
6
yum install -y vsftpd
anonymous yes
cat >> /etc/vsftpd/vsftpd.conf << EOF
anon_root=/opt
EOF
systemctl enable vsftpd --now

5.部署时间同步服务器

在Controller 节点上部署chrony 服务器,允许其他节点同步时间,启动服务并设置为开机启动;在compute 节点上指定controller 节点为上游NTP 服务器,重启服务并设为开机启动。

请在控制节点上使用chronyc 命令同步控制节点的系统时间。【1 分】

Controller :

1
2
3
4
5
cat >> /etc/chrony.conf << EOF
server 172.17.2.10 iburst
allow all
EOF
systemctl enable chronyd --now

Compute:

1
2
3
4
5
6
cat >> /etc/chrony.conf << EOF
server 172.17.2.10 iburst
EOF
systemctl enable chronyd --now
systemctl restart chronyd
chronyc -a makestep

任务 2 OpenStack 搭建任务(10 分)

1.修改变量文件

在控制节点和计算节点上分别安装iaas-xiandian 软件包,修改配置脚本文件中基本变量(配置脚本文件为/etc/xiandian/openrc.sh)。修改完成后使用命令生效该变量文件,然后执行 echo $INTERFACE_IP 命令。

请将命令和返回结果提交到答题框。【0.5 分】

1
yum install -y iaas-xiandian

Controller:

1
2
3
4
5
6
# 手动填充剩余部分
> vim /etc/xiandian/openrc.sh
:%s/^#//g
:%s/PASS=/PASS=000000/g
> source /etc/xiandian/openrc.sh
> echo $INTERFACE_IP

Compute:

1
2
3
4
5
6
> scp /etc/xiandian/openrc.sh root@172.17.2.20:/etc/xiandian/openrc.sh
> vi /etc/xiandian/openrc.sh
:set num
# 修改第69行的IP地址为Compute地址
> source /etc/xiandian/openrc.sh
> echo $INTERFACE_IP

2.搭建数据库组件

使用提供的脚本框架 iaas-install-mysql.sh , 在controller 节点上安装 mariadb 、mencached、rabbitmq 等服务并完成相关配置。完成后修改配置文件将 mencached 最大连接数修改为2048。

请将修改后的配置文件提交到答题框。【1 分】

controller & compute:

1
iaas-pre-host.sh

controller :

1
2
3
4
5
iaas-install-mysql.sh
sed -i 's/1024/2048/g' /etc/sysconfig/memcached
systemctl enable memcached --now
systemctl restart memcached
ps -ef | grep memcached

3.搭建认证服务组件

使用提供的脚本框架 iaas-install-keystone.sh 填充脚本,在 controller 节点上安装 keystone 服务并完成相关配置。完成后使用 openstack 命令请求一个 token。

请将以上命令和返回结果提交到答题框。【1 分】

controller :

1
2
3
iaas-install-keystone.sh
source /etc/keystone/admin-openrc.sh
openstack token issue

4.搭建镜像服务组件

使用提供的脚本框架 iaas-install-glance.sh 填充脚本,在 controller 节点上安装 glance 服务并完成相关配置。完成后请将 cirros-0.3.4-x86_64-disk.img 上传到控制节点的 /root 目录下,然后使用 openstack 命令将该镜像上传到 openstack 平台镜像命名为 cirros。

请将镜像上传的操作命令和返回结果提交到答题框。【1 分】

controller :

1
2
3
iaas-install-glance.sh
scp cirros-0.3.4-x86_64-disk.img root@172.17.2.10:/root
openstack image create --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare cirrors

5.搭建计算服务组件

使用提供的脚本框架 iaas-install-nova-controller.sh 和 iaas-install-nova-compute.sh 填充脚本,在 controller 和 compute 节点上安装 nova 服务并完成配置。完成后请将控制节点的计算资源也加入集群。然后使用 openstack 命令列出能提供计算资源的节点。

将列出计算资源的命令和返回结果提交到答题框。【1.5 分】

controller:

1
2
3
4
5
iaas-install-nova-controller.sh
sed -i 's/#virt_type=kvm/virt_type=qemu/g' /etc/nova/nova.conf
systemctl restart *nova*
openstack hypervisor list #查看虚拟化节点列表
openstack compute service list #在控制节点查看计算服务的工作状态

compute:

1
iaas-install-nova-compute.sh

6.搭建网络组件并初始化网络

使用提供的脚本框架 iaas-install-neutron-controller.sh 和 iaas-install-neutron-compute.sh,填充脚本,在controller 和compute 节点上安装neutron 服务并完成配置。创建云主机外部网络 ext-net,子网为 ext-subnet,云主机浮动IP 可用网段为172.18.x.100172.18.x.200,网关为 172.18.x.1。创建云主机内部网络int-net1,子网为int-subnet1,云主机子网 IP 可用网段为 10.0.0.10010.0.0.200,网关为 10.0.0.1;创建云主机内部网络int-net2,子网为 int-subnet2,云主机子网IP 可用网段为 10.0.1.100 ~ 10.0.1.200,网关为 10.0.1.1。添加名为 ext-router 的路由器,添加网关在ext-net 网络,添加内部端口到int-net1 网络,完成内部网络int-net1 和外部网络的连通。

请使用openstack 命令完成以下任务,完成后将命令和返回结果提交到答题框。【4 分】

controller

1
2
3
4
5
6
7
8
9
iaas-install-neutron-controller.sh
openstack network create --external ext-net
openstack subnet create ext-subnet --network ext-net --gateway 172.18.2.1 --allocation-pool start=172.18.2.100,end=172.18.2.200 --subnet-range 172.18.2.0/16
openstack network create int-net1
openstack subnet create int-subnet --network int-net1 --gateway 10.0.0.1 --allocation-pool start=10.0.0.100,end=10.0.0.200 --subnet-range 10.0.0.0/24
openstack network create int-net2
openstack subnet create int-subnet --network int-net2 --gateway 10.0.1.1 --allocation-pool start=10.0.1.100,end=10.0.1.200 --subnet-range 10.0.1.0/24
openstack router create ext-router
openstack router add subnet ext-router int-subnet

compute

1
iaas-install-neutron-compute.sh

7.搭建图形化界面

使用提供的脚本框架iaas-install-dashboard.sh,填充脚本,在controller 节点上安装 dashboard 服务并完成相关配置。

请使用 curl 指令获取 dashboard 首页信息,将获取到的首页信息提交到答题框。【1 分】

controller

1
2
iaas-install-dashboard.sh
curl http://172.17.2.10/dashboard/

任务 3 OpenStack 运维任务

1.用户管理

在keystone 中创建用户testuser,密码为password。创建好之后,使用命令修改 testuser 密码为 000000,并查看 testuser 的详细信息。添加将该用户添加到 admin 项目并赋予普通用户权限,完成后测试登录。

使用 testuser 用登录系统完成后截图并提交到答题框。【1 分】

controller

1
2
3
4
openstack user create --domain demo --password password testuser
openstack user set --password 000000 testuser
openstack user show testuser
openstack role add --project admin --user testuser user

2.服务查询

使用命令列出服务目录和端点,查看glance 服务的端点。将以上命令和返回结果提交到答题框。【0.5 分】

1
2
openstack catalog list
openstack catalog show glance

3.镜像管理

登录 controller 节点, 使用 glance 相关命令, 上传镜像, 源使用CentOS_6.5_x86_64_XD.qcow2,名字为 testone,然后使用 openstack 命令修改这个镜像名改为 examimage,然后给这个镜像打一个标签,标签名字为 lastone 改完后使用 openstack命令查看镜像列表。

将以上命令和返回结果提交到答题框。【2 分】

1
2
3
openstack image create --disk-format qcow2 --container-format bare --file CentOS_6.5_x86_64_XD.qcow2 --name testone
openstack image set --name examimage --tag lastone testone
openstack image show examimage

4.后端配置文件管理

进入到glance 后端存储目录中,使用 qemu 命令查看任意的一个镜像信息。使用du命令查看nova 主配置文件大小。

将以上命令和返回结果提交到答题框。【0.5 分】

1
2
3
cd /var/lib/glance/images
qemu-img info <image-name>
du /etc/nova/nova.conf

5.存储服务管理

创建一个卷类型,然后创建一块带这个卷类型标识的云硬盘,查询该云硬盘的详细信息。将该云硬盘挂载到虚拟机中,将该云硬盘格式化为xfs。创建一个文件文件名为工位号内容为工位号,然后将该云硬盘卸载,使用openstack 命令将该云硬盘修改为只读状态,再次挂载后查看是否存在原始文件,然后再次向该云硬盘中创建一个文件,文件名为工位号_02。

将返回结果及解题过程提交到答题框。【2 分】

controller

1
2
3
4
5
6
7
iaas-install-cinder-controller.sh 
openstack volume create --type lvm --size 1 unit
openstack volume show unit
openstack server create --image examimage --flavor m1.small --nic net-id=<id> centos
openstack server add unit examimage centos
# >>>
openstack volume set -read-only unit

compute

1
iaas-install-cinder-compute.sh 

centos

1
2
3
4
mkfs.xfs /dev/vdb
mount /dev/vdb /mnt/
touch /mnt/2
umount /dev/vdb

6.存储服务管理

使用命令创建一个5GB 的云硬盘,名称为disk-2,将云硬盘挂载到云虚拟机内,然后格式化为ext4,挂载到虚拟机的/mnt/ 目录下,使用df -h 将命令和返回信息提交到答题框。将该云硬盘使用命令卸载,使用命令将该云硬盘扩容到10GB,使用命令将云硬盘挂载到云主机上,将命令及返回信息提交到答题框。进入云主机使用命令扩容文件系统,扩容后再次挂载到/mnt/。

使用df -hT 命令并将命令和返回信息提交到答题框。【2 分】

Controller

1
2
3
4
5
6
openstack volume create --type lvm --size 5 disk-2
openstack server add disk-2 examimage centos
# >>>
openstack server remove volume disk-2
openstack volume set disk-2 --size 10
openstack server add disk-2 examimage centos

centos

1
2
3
4
5
6
7
8
# <<<
mkfs.ext4 /dev/vdb
mount /dev/vdb /mnt/
df -Th
umount /mnt/
# >>>
mount /dev/vdb /mnt/
df -Th

7.对象存储管理

使用swift 相关命令,创建一个容器,然后往这个容器中上传一个文件(文件可以自行创建),上传完毕后,使用命令查看容器。

将以上命令和返回结果提交到答题框。【0.5 分】

Controller

1
2
3
4
swift post test
openstack container list
swift upload test <filename>
openstack object show test

8.安全组管理

使用命令创建名称为 group_web 的安全组该安全组的描述为工位号,为该安全组添加一条规则允许任意ip 地址访问web 流量,完成后查看该安全组的详细信息。

将以上命令和返回结果提交到答题框。【2 分】

Controller

1
2
3
openstack security group create group_web --description 2 
openstack security group rule create rule1 --protocol tcp --egress
openstack security group show group_web

9.网络管理

使用命令将int-net1 网络设置为共享,然后查看int-net1 网络的详细信息。将命令和返回信息提交到答题框。【0.5 分】

Controller

1
2
openstack network set int-net1 --share
openstack network show int-net1

10.网络管理

使用 dashboard 界面使用 centos7.5 镜像创建一台云主机,云主机命名为 test-01,使用命令查看浮动IP 地址池,使用命令创建一个浮动IP,然后将浮动IP 绑定到云主机上。

将命令和返回信息提交到答题框。【1 分】

Controller

1
2
3
4
openstack image create --disk-format qcow2 --container-format bare --file Centos-7.5.img net-centos
openstack server create --image net-centos --flavor m1.medium --nic net-id=<id> centos2
openstack floating ip create ext-net
openstack server add floating ip centos7.5 <floating_ip>

11.虚拟机管理

使用opentack 命令利用centos7.5 镜像创建一台云主机,连接int-net1 网络,云主机名称为test-02。创建成功后使用命令查看云主机详细信息,确定该云主机是处于计算节点还是控制节点。如果云主机处于控制节点上请将其冷迁移到计算节点,如果如果云主机处于计算节点上请将其冷迁移到控制节点。

本题全部流程请使用命令完成,请将全部命令和结果粘贴到答题框。【3 分】

controller

1
2
3
4
5
openstack server create --image net-centos --flavor m1.medium --nic net-id=<id> test-02
openstack server show test-02
# >>>
mysql -u root
update instances set host='controller', node='controller' where uuid='<sv-uuid>';

compute

1
2
# <<<
scp /var/lib/nova/instances/<sv> Controller:/var/lib/nova/instances/

B 场次题目:容器的编排与运维

某企业计划使用k8s 平台搭建RuoYi 后台管理系统,以实现完成公司内部日常工作管理,例如OA 管理,用户管理,客户关系管理等业务。

设备名称 主机名 接口 IP 地址
云服务器1 Master eth0 10.0.0.100/24
云服务器2 Node1 eth0 10.0.0.110/24
云服务器3 Node2 eth0 10.0.0.120/24
云服务器4 Harbor eth0 10.0.0.130/24

任务 1 容器云平台环境初始化(5 分)

1.容器云平台的初始化

根据表1 中的IP 地址规划,创建云服务器,镜像使用CentOS_7.5_x86_64_XD.qcow,确保网络正常通信。按照表1 设置主机名节点并关闭swap,同时永久关闭 selinux 以及防火墙,并修改hosts 映射。请将master 节点hosts 文件内容提交到答题框。【1 分】

ALL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
nmcli con add con-name ens32 ifname ens32 type ethernet ipv4.address 10.0.0.100/24 ipv4.method static autoconnect yes
nmcli con up ens32
nmcli con add con-name ens32 ifname ens32 type ethernet ipv4.address 10.0.0.110/24 ipv4.method static autoconnect yes
nmcli con up ens32
nmcli con add con-name ens32 ifname ens32 type ethernet ipv4.address 10.0.0.120/24 ipv4.method static autoconnect yes
nmcli con up ens32
nmcli con add con-name ens32 ifname ens32 type ethernet ipv4.address 10.0.0.130/24 ipv4.method static autoconnect yes
nmcli con up ens32
hostnamectl set-hostname --static Master
hostnamectl set-hostname --static Node1
hostnamectl set-hostname --static Node2
hostnamectl set-hostname --static Harbor
swapoff -a
sed -i 's|dev/mapper/centos-swap|#/dev/mapper/centos-swap|g' /etc/fstab
cat /etc/fstab
cat >> /etc/hosts << EOF
10.0.0.100 Master
10.0.0.110 Node1
10.0.0.120 Node2
10.0.0.130 Harbor
EOF
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
cat /etc/selinux/config |grep SELINUX=
systemctl disable firewalld --now

2.Yum 源数据的持久化挂载

将提供的CentOS-7-x86_64-DVD-1804.iso 和chinaskills_cloud_paas.iso 光盘镜像上传到 master 节点/root 目录下,然后在/opt 目录下使用命令创建/centos 目录和/paas 目录,并将镜像文件CentOS-7-x86_64-DVD-1804.iso 挂载到/centos 目录下, 将镜像文件 chinaskills_cloud_paas.iso 挂载到/paas 目录下。

请设置永久开机自动挂载,并将设置的永久开机自动挂载的文件内容提交到答题框。【1分】

1
2
3
4
5
mkdir /opt/centos /opt/paas
mount CentOS-7-x86_64-DVD-1804.iso /opt/centos
mount chinaskills_cloud_paas.iso /opt/paas
echo "CentOS-7-x86_64-DVD-1804.iso /opt/centos" >> /etc/rc.local
echo "mount chinaskills_cloud_paas.iso /opt/paas" >>/etc/rc.local

3.Yum 源的编写

为master 节点设置本地yum 源,yum 源文件名为centos.repo,安装ftp 服务,将ftp 仓库设置为/opt/,为其他节点配置ftp 源,yum 源文件名称为ftp.repo,其中ftp 服务器地址为master 节点IP。

请将其它节点的yum 源文件内容提交到答题框。【1 分】

Master:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mv /etc/yum.repos.d/* /media/
cat > /etc/yum.repos.d/centos.repo << EOF
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
[paas]
name=paas
baseurl=file:///opt/paas/kubernetes-repo
gpgcheck=0
enabled=1
EOF
yum clean all
yum makecache
yum install vsftpd vim bash-completion -y
cat >> /etc/vsftpd/vsftpd.conf << EOF
anon_root=/opt
EOF
systemctl enable vsftpd --now
systemctl restart vsftpd

Others:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mv /etc/yum.repos.d/* /media/
cat >> /etc/yum.repos.d/ftp.repo << EOF
[centos]
name=centos
baseurl=ftp://Master/centos
gpgcheck=0
enabled=1
[paas]
name=paas
baseurl=ftp://Master/paas/kubernetes-repo
gpgcheck=0
enabled=1
EOF
yum clean all
yum makecache
yum repolist

4.设置时间同步服务器

在master 节点上部署chrony 服务器,允许其他节点同步时间,启动服务并设置为开机启动;在其他节点上指定master 节点为上游NTP 服务器,重启服务并设为开机启动。请在master 节点上使用chronyc 命令同步控制节点的系统时间。【1 分】

Master:

1
2
3
4
5
6
7
cat >> /etc/chrony.conf << EOF
server Master iburst
allow 10.0.0.0/24
local stratum 10
EOF
systemctl enable chronyd --now
systemctl restart chronyd

Others:

1
2
3
4
cat >> /etc/chrony.conf << EOF
server Master iburst
EOF
chronyc makestep

5.设置免密登录

为四台服务器设置免密登录,保证3 台服务器能够互相免密登录。请使用scp 命令将master 节点的hosts 文件发送到所有节点的/etc/hosts。

将以上所有命令和返回结果提交到答题框。【1 分】

1
2
3
4
5
6
7
ssh-keygen
ssh-copy-id root@Node1
ssh-copy-id root@Node2
ssh-copy-id root@Harbor
scp /etc/hosts root@Node1:/root/hosts
scp /etc/hosts root@Node2:/root/hosts
scp /etc/hosts root@Harbor:/root/hosts

任务 2 k8s 搭建任务(10 分)

1.安装 docker 应用

在所有节点上安装 dokcer-ce。并在harbor 节点安装harbor 仓库,显现正常登录 horbor仓库,登录密码设置为“test_工位号”。

请将登录后截图提交到答题框。【1 分】

Master:

1
2
3
4
5
6
yum install -y docker
systemctl enable docker --now
scp /opt/paas/k8s_harbor_install.sh root@Harbor:/root
scp -r /opt/paas/docker-compose root@Harbor:/opt
scp -r /opt/paas/images root@Harbor:/opt
scp -r /opt/paas/harbor root@Harbor:/opt

Node:

1
yum install -y docker-ce

Harbor:

1
2
3
sed -i '89i\
\sed -i "s/harbor_admin_password: Harbor12345/harbor_admin_password: test_02/g" harbor.yml' k8s_harbor_install.sh
./k8s_harbor_install.sh

2.搭建 horbor 仓库

修改默认docker 仓库为harbor 地址,修改docker 启动引擎为systemd。安装完成后执行docker verison 命令返回结果以及将 daemon.json 文件内容提交。【2 分】

ALL:

1
2
3
4
5
6
7
8
9
cat > /etc/docker/daemon.json << EOF
{
"insecure-registries":["10.0.0.130"],
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF
docker version
systemctl daemon-reload
systemctl restart docker

3.安装 docker-compose

在 master 节点上使用 /opt/paas/docker-compose/v1.25.5-docker-compose-Linux-x86_64 下的文件安装 docker-compose。安装完成后执行docker-compose version 命令,请将程序返回结果提交到答题框。【0.5 分】

Master:

1
2
3
cp /opt/paas/docker-compose/v1.25.5-docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version

4.上传 docker 镜像

在master 节点使用/opt/paas/ k8s_image_push.sh 将所有镜像上传至docker 仓库。完成后将Harbor 仓库 library 中镜像列表截图,请将以上截图提交到答题框。【1 分】

Master:(可替代的方案)

1
# scp /opt/paas/k8s_image_push.sh root@Harbor:/root/push.sh

Harbor:

1
2
for i in `ls /opt/images/`;do docker image load -i $i;done;
docker image list

5.安装 kubeadm 工具

在master 及node 节点安装Kubeadm 工具并设置开机自动启动,安装完成后使用rpm命令配合grep 查看Kubeadm 工具是否正确安装。

将rpm 命令配合grep 返回结果提交到答题框。【0.5 分】

Master:

1
2
3
4
5
6
7
8
# yum install -y kubeadm
# rpm -qa | grep kube
cp /opt/paas/k8s_master_install.sh master.sh
scp /opt/paas/k8s_node_install.sh root@Node1:/root/node.sh
scp /opt/paas/k8s_node_install.sh root@Node2:/root/node.sh
./master.sh
export KUBERNETES_MASTER=master
rpm -qa | grep kube

Node:

1
2
./node.sh
export KUBERNETES_MASTER=master

6.计算节点获取必备镜像

在所有node 节点中使用docker 命令拉取安装kubernetes 基础镜像,拉取完成后使用 docker 命令查看镜像列表。【1 分】

1
2
3
4
5
6
7
8
docker pull 10.0.0.4/library/kube-apiserver:v1.18.1
docker pull 10.0.0.4/library/kube-controller-manager:v1.18.1
docker pull 10.0.0.4/library/kube-scheduler:v1.18.1
docker pull 10.0.0.4/library/kube-proxy:v1.18.1
docker pull 10.0.0.4/library/pause:3.2
docker pull 10.0.0.4/library/etcd:3.4.3-0
docker pull 10.0.0.4/library/coredns:1.6.7
docker images list

7.kubeadm 安装 master

使用 kubeadm 命令初始化 master 节点, 设置kubernetes 虚拟内部网段地址为10.244.0.0/16,然后使用kube-flannel.yaml 完成控制节点初始化设置,完成后使用命令查看集群状态和所有pod

Master:(可替代的方案)

1
2
3
# export KUBECONFIG=/etc/kubernetes/admin.conf
# source /etc/profile
# kubeadm init --kubernetes-version=1.18.1 --apiserver-advertise-address=192.168.20.10 --image-repository 10.0.0.130/library --pod-network-cidr=10.244.0.0/16
1
2
kubectl cluster-info 
kubectl get pods -A

8.安装 kubernetes 网络插件

使用 kube-flannel.yaml 安装 kubernetes 网络插件,安装完成后使用命令查看节点状态。完成后使用命令查看集群状态。

将集群状态查看命令和返回结果提交到答题框。【0.5 分】

Master:(可替代的方案)

1
2
# sed -i "s/quay.io\/coreos/10.0.0.130\/library/g" /opt/yaml/flannel/kube-flannel.yaml		# 需要修改
# kubectl apply -f /opt/yaml/flannel/kube-flannel.yaml
1
kubectl cluster-info 

9.kubernetes 图形化界面的安装

安装 kubernetes dashboard 界面,完成后查看首页然后将 kubernetes dashboard 界面截图提交到答题框。【1 分】

Master:(可替代的方案)

1
2
3
4
5
6
7
8
9
10
# mkdir dashboard-certs
# cd dashboard-certs/
# kubectl create namespace kubernetes-dashboard
# openssl genrsa -out dashboard.key 2048
# openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'
# openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
# sed -i "s/kubernetesui/10.0.0.130\/library/g" /opt/yaml/dashboard/recommended.yaml #需要修改
# kubectl apply -f /opt/yaml/dashboard/recommended.yaml
# kubectl apply -f /opt/yaml/dashboard/dashboard-adminuser.yaml

Web:

1
2
3
# >> http://10.0.0.100
# 获取token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')

10.扩展计算节点

在master 节点上使用kubeadm 命令查看token,在所有node 节点上使用kubeadm 命令将node 节点加入kubernetes 集群。完成后在master 节点上查看所有节点状态。

将集群状态查看命令和返回结果提交到答题框。【0.5 分】

Master:(可替代的方案)

1
2
3
4
5
kubeadm token create --print-join-command
kubeadm token list

kubeadm join 192.168.20.10:6443 --token z636b2.aybrn1srspf8jgxl \
--discovery-token-ca-cert-hash sha256:2426de68ac6fa11b30d74fd73a9712c65e4df10729331a5dfc212da64de8c3b8
1
kubectl get node

任务三K8s 运维任务(15 分)

1.使用dockerfile 构建dokcer 镜像

以 mysql:5.7 镜像为基础镜像,制作一个mysql 镜像,可以将提供的 sql 文件初始化到mysql 数据库中,然后使用编写的dockerfile 文件将镜像制作出来,名称为mysql:latest,并将该镜像上传至前面所搭建的 harbor 仓库中,编写 YAML 文件,验证数据库内容。

完成后将dockerfile 文件内容及harbor 仓库镜像列表、数据库内容提交到答题框。【1 分】

init.sql

1
2
3
4
5
6
7
create database `test`;
SET character_set_client = utf8;
use test;
create table user(
`id` int(4) primary key,
`name` varchar(20)
)engine=innodb charset=utf8;
1
2
3
4
5
6
7
8
9
10
11
12
mkdir build
mv init.sql build/
cd build
cat > Dockerfile <<EOF
FROM 10.0.0.130/library/mysql:5.7
MAINTAINER chinaskill
WORKDIR /docker-entrypoint-initdb.d
ENV LANG=C.UTF-8
ADD init.sql .
EOF
docker build -t mysql:latest .
docker push 10.0.0.130/library/mysql:latest

2.持久化存储

搭建 NFS 共享存储,配 置nfs-provisioner,创建 storageclass,通过storageclass 动态生成 pvc,大小为1Gi,修改标准 nfs-deployment.yaml 文件,编写 storageclass.yaml 和 pvc.yaml文件,将最终 pvc 状态截图和 yaml 文件提交至答题框。【2 分】

rbac.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get","list","watch","create","delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get","list","watch","update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create","update","patch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: leader-locking-nfs-client-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get","list","watch","create","update","patch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner

roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io

deployment.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: 10.0.0.130/library/nfs-client-provisioner
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-client
- name: NFS_SERVER
value: 10.0.0.100
- name: NFS_PATH
value: /root/nfs
volumes:
- name: nfs-client-root
nfs:
server: 10.0.0.100
path: /root/nfs

storageclass.yml

1
2
3
4
5
6
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: storage-test
provisioner: nfs-client

pvc.yml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: storage-test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yum -y install nfs-utils
systemctl enable rpcbind nfs --now
mkdir nfs
cat >> /etc/exports <<EOF
/root/nfs 10.0.0.0/24(rw,sync,no_root_squash)
EOF
exportfs -v
exportfs -r
showmount -e localhost
# >>>
kubectl apply -f rbac.yml
kubectl apply -f deployment.yaml
kubectl apply -f storageclass.yaml
kubectl apply -f pvc.yaml

kubectl get deployment
kubectl get pvc

3.编写deployment 文件

将提供的nginx:latest 镜像上传至harbor 镜像仓库,使用该镜像编写deployment 文件,要求将已创建的pvc 挂载至/html 目录下,副本数1,实现资源限制:需求内存300Mi,需求CPU 300M,限制内存450Mi,限制CPU450M,将POD 状态截图和yaml 文件提交至答题框。【3 分】

nginx-deployment.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: 10.0.0.130/library/nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: container-port
containerPort: 80
resources:
requests:
memory: 300Mi
cpu: 300m
limits:
memory: 450Mi
cpu: 450m
volumes:
- name: pvc
persistentVolumeClaim:
claimName: pvc
1
2
kuectl apply -f nginx-deployment.yml
kubectl get pods -n default

4.创建 service 服务,提供对外访问接口

基于nginx 的 pod 服务,编写一个service 名称为 nginx-svc,代理 nginx 的服务端口,端口类型为 nodeport,创建成功后可以通过该 service 访问nginx。完成后提交 yaml 文件及访问截图至答题框。【3 分】

service.yml

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 8000
targetPort: 80
protocol: TCP
type: NodePort

pod.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: 10.0.0.130/library/nginx:latest
ports:
- containerPort: 80
1
2
3
4
5
kubectl apply -f service.yml
kubectl apply -f pod.yml
kubectl get pod -n default -o wide
kubectl get svc
curl <ip:port>

5.配置metrics-server 实现资源监控

将已提供的metrics-server 镜像上传至harbor,修改components.yaml,创建 metrics-server,完成后,将 metrics-server 状态截图提交至答题框。【2 分】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改components.yaml文件,搜索image,将image地址改为harbor仓库地址
# 在args参数下添加
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls

kubectl get pods -A | grep metrics-server
vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --enable-aggregator-routing=true

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
systemctl restart kubelet
kubectl get pod -n kube-system | grep metrics-server
kubectl describe svc metrics-server -n kube-system
kubectl get pods -A | grep metrics-server

6.配置弹性伸缩

编写deployment-nginx-hpa.yaml 文件,要求最小副本数1,最大副本数3,当整体的资源利用率超过80%的时候实现自动扩容,将yaml 文件提交至答题框。【2 分】

deployment-nginx-pod.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
maxReplicas: 3
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
targetCPUUtilizationPercentage: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: 10.0.0.130/library/nginx:latest
ports:
- containerPort: 80
resources:
requests:
cpu: 250m
memory: 300Mi
1
2
3
4
5
6
7
kubectl apply -f deployment-nginx-pod.yaml
kubectl scale deployment nginx --replicas=5
kubectl get pods
# Max 3
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
nginx-hpa Deployment/nginx 0%/80% 1 3 3

7.压力测试

安装httpd-tools 工具,通过service 提供的对外访问接口进行压力测试,验证HPA 弹性伸缩功能,将HPA 状态和POD 状态截图提交至答题框。【2 分】

1
2
3
4
yum -y install httpd-tools
ab -t 600 -n 1000000 -c 1000 <ip:port>
kubectl get hpa
kubectl get pod

C 场次题目:企业级应用的自动化部署和运维

主机名 IP地址 角色
Master 私有云下发 Prometheus,grafana,ansible
Node1 私有云下发 agent
Node2 私有云下发 agent

任务1 企业级应用的自动化部署(15 分)

1.ansible 自动化运维工具的安装【3 分】

请使用提供的软件包在master 节点安装ansible,安装完成后使用 ansible --version 命令验证是否安装成功。为所有节点添加 test 用户,设置用户密码为000000。为test 用户设置免密sudo,配置ssh 免密登录,使master 节点能够免密登录所有节点的test 用户。

ansible --version 命令和回显粘贴到答题框。

Master:

1
2
3
4
5
6
7
8
9
10
11
12
yum install ansible -y
useradd test
echo "000000" | passwd --stdin test
cat >> /etc/sudoers <<EOF
test ALL=(ALL) NOPASSWD: ALL
EOF

ssh-keygen
ssh-copy-id test@Node1
ssh-copy-id test@Node2
ssh-copy-id test@Master
ansible --version

Node1:

1
2
3
4
5
useradd test
echo "000000" passwd --stdin test
cat >> /etc/sudoers <<EOF
test ALL=(ALL) NOPASSWD: ALL
EOF

Node2:

1
2
3
4
5
useradd test
echo "000000" passwd --stdin test
cat >> /etc/sudoers <<EOF
test ALL=(ALL) NOPASSWD: ALL
EOF

2.ansible 自动化运维工具的初始化【3 分】

创建 /root/ansible 目录作为工作目录,在该目录内创建 ansible.cfg 文件并完成以下配置,清单文件位置为 /root/ansible/inventory,登录用户为test,登录时不需要输入密码。设置并行主机数量为 2,允许 test 用户免密提权到 root。
将 ansible.cfg 文件内容粘贴到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir /root/ansible
cd ansible
cat > ansible.cfg <<EOF
[defaults]
inventory = /root/ansible/inventory
remote_user = test
ask_pass = false
forks = 2

[privilege_escalation]
become = true
become_user = root
become_method = sudo
become_ask_pass = false

EOF

3.主机清单的编写【2 分】

编写主机清单文件,创建 master 用户组,master 用户组内添加 master 主机;创建node用户组,node 组内添加node1 和node2 主机,主机名不得使用 IP 地址。

完成后执行ansible-inventory --listansible all -m pingansible all -a "id" 命令,将这三条命令返回结果粘贴到答题框。

1
2
3
4
5
6
7
8
9
cat > inventory <<EOF
[master]
Master

[node]
Node1
Node2

EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ansible-inventory --list
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"master",
"node",
"ungrouped"
]
},
"master": {
"hosts": [
"Master"
]
},
"node": {
"hosts": [
"Node1",
"Node2"
]
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ansible all -m ping
Node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Master | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
1
2
3
4
5
6
7
ansible all -a "id"
Node2 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Node1 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Master | CHANGED | rc=0 >>
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

4.使用自动化工具对 master 节点进行初始化【2 分】

请编写 prometheus.yml 控制 master 主机组,使用对应模块将 SELinux 临时状态和开机启动状态也设置为 disabled。请使用 ansible 对应模块安装时间同步服务,使用文本编辑模块将该服务的作用域设置为 0.0.0.0/0,并设置状态为启动和开机自动启动。首先将提供的 prometheus-2.37.0.linux-amd64.tar.gz 使用文件拷贝模块将该压缩包拷贝到目标主机的 /usr/local/ 下,使用 shell 模块解压该压缩包。

prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
- name: 'Init Master'
hosts: master
vars:
- package: chrony
svc: chronyd
tasks:
- name: Disable SELinux
selinux:
state: disabled
- name: Install Chrony
yum:
name:
- "{{ package }}"
state: latest
- name: Configure chrony
lineinfile:
dest: /etc/chrony.conf
line: 'allow 0.0.0.0/0'
- name: set chrony service
service:
name: "{{ svc }}"
state: started
enabled: true
- name: CP file
copy:
src: 'prometheus-2.37.0.linux-amd64.tar.gz'
dest: '/usr/local/prometheus-2.37.0.linux-amd64.tar.gz'
- name: uzip file
shell: 'tar -zxvf /usr/local/prometheus-2.37.0.linux-amd64.tar.gz chdir=/usr/local/'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@Master ansible]# ansible-playbook prometheus.yml 

PLAY [Init Master] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************
ok: [Master]

TASK [Diable SELinux] *********************************************************************************************************************
[WARNING]: SELinux state change will take effect next reboot
ok: [Master]

TASK [Install Chrony] *********************************************************************************************************************
ok: [Master]

TASK [Configure chrony] *********************************************************************************************************************
ok: [Master]

TASK [set chrony service] *********************************************************************************************************************
ok: [Master]

TASK [CP file] *********************************************************************************************************************
changed: [Master]

TASK [uzip file] *********************************************************************************************************************
changed: [Master]

PLAY RECAP *********************************************************************************************************************
Master : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

5.使用自动化运维工具完成企业级应用的部署【5 分】

编写 prometheus.yml.j2 模板文件,将所有 node 节点信息添加到该文件中,但是被管节点的主机名信息必须使用变量 IP 地址可以手动输入。

完成后请创建node_exporter.yml 文件,编写第一个play,将该play 命名为 node,该 play 控制的主机组为 node。使用ansible 模块将node_exporter-1.3.1.linux-amd64.tar.gz 发送到 node 主机组的 /usr/local/ 下,使用一个shell模块解压该压缩包,并启动该服务。

随后编写第二个 play,将第二个 play 命名为 master,第二个 play 控制 master 节点。首先使用 ansible 模块将 prometheus.yml.j2 文件传输到master 节点,然后使用 script 模块将 prometheus 启动。使用对应模块将 grafana-8.1.2-1.x86_64.rpm 包发送到被控节点的 /mnt/ 目录下,然后使用对应模块将该软件包安装,安装完成后设置 grafana 服务启动并设置开机自动启动。

使用浏览器登录 prometheus 查看 prometheus 是否成功监控所有 node 节点。
请将浏览器反馈的结果截图、prometheus.yml.j2 文件的内容、node_exporter.yml 文件内容及运行结果提交到答题框。

start.sh

1
2
#!/bin/bash 
nohup /usr/local/prometheus-2.37.0.linux-amd64/prometheus --config.file=prometheus.yml --web.enable-lifecycle 2>&1 &

prometheus.yml.j2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{% set node1_ipadd = "10.0.0.110" %}
{% set node2_ipadd = "10.0.0.120" %}
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).

alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

scrape_configs:
- job_name: "node"
static_configs:
- targets: ["{{ node1_ipadd }}:9100","{{ node2_ipadd }}:9100"]

node_exporter.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
---
- name: node
hosts: node
tasks:
- name: copy file
copy:
src: node_exporter-1.3.1.linux-amd64.tar.gz
dest: /usr/local/node_exporter-1.3.1.linux-amd64.tar.gz
- name: uzip file
shell: "tar -zxvf /usr/local/node_exporter-1.3.1.linux-amd64.tar.gz chdir=/usr/local/"
- name: boot node_exp
shell: "nohup /usr/local/node_exporter-1.3.1.linux-amd64/node_exporter 2>&1 &"

- name: master
hosts: master
tasks:
- name: touch yml
template:
src: prometheus.yml.j2
dest: /usr/local/prometheus-2.37.0.linux-amd64/prometheus.yml

- name: start prometheus
script: start.sh

- name: copy file
copy:
src: grafana-8.1.2-1.x86_64.rpm
dest: /mnt/

- name: install grafana
yum:
name: /mnt/grafana-8.1.2-1.x86_64.rpm
state: present

- name: service configure
service:
name: grafana-server
state: started
enabled: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
ansible-playbook node_exporter.yml
PLAY [node] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************
ok: [Node2]
ok: [Node1]

TASK [copy file] *********************************************************************************************************************
ok: [Node2]
ok: [Node1]

TASK [uzip file] *********************************************************************************************************************
changed: [Node2]
changed: [Node1]

TASK [boot node_exp] *********************************************************************************************************************
changed: [Node1]
changed: [Node2]

PLAY [master] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************
ok: [Master]

TASK [touch yml] *********************************************************************************************************************
ok: [Master]

TASK [start prometheus] *********************************************************************************************************************
changed: [Master]

TASK [copy file] *********************************************************************************************************************
changed: [Master]

TASK [install grafana] *********************************************************************************************************************
changed: [Master]

TASK [service configure] *********************************************************************************************************************
changed: [Master]

PLAY RECAP *********************************************************************************************************************
Master : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Node1 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Node2 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

任务2 企业级应用的运维(12 分)

1.使用prometheus 监控mysqld 服务【3 分】

将提供的 mysqld_exporter-0.14.0.linux-amd64.tar.gz 发送到 agent 虚拟机 /usr/local/ 目录下解压并安装 mariadb 服务。进入mariadb 数据库中创建mysqld_monitor 用户并授权,然后创建mariadb 配置文件,内容为数据库用户名密码。启动 mysqld_exporter 组件确保9104 端口启动。回到prometheus 节点修改prometheus.yml 文件并添加mysql 被监控信息。重启prometheus,随后web 界面刷新并查看mysqld 被控信息。
将以上操作提交到答题框。

Master:

1
2
3
4
5
6
7
8
9
10
scp mysqld_exporter-0.14.0.linux-amd64.tar.gz root@Node1:/usr/local/
scp mysqld_exporter-0.14.0.linux-amd64.tar.gz root@Node2:/usr/local/
# Attached `/usr/local/prometheus-2.37.0.linux-amd64/prometheus.yml`
- job_name: "mysql"
static_configs:
- targets: ["10.0.0.110:9104","10.0.0.120:9104"]
# >>>
cd /usr/local/prometheus-2.37.0.linux-amd64
chmod +x pro_start.sh
./pro_start.sh

Node:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
yum -y install mariadb mariadb-server
systemctl enable mariadb --now
mysqladmin -u root password

mysql -uroot -p000000
use test;
grant replication client,process on *.* to 'mysql_monitor'@localhost identified by 'mysql_monitor';
grant select on *.* to mysql_monitor@localhost;
quit

cd /usr/local/
tar -zxvf mysqld_exporter-0.14.0.linux-amd64.tar.gz
touch /usr/local/mysqld_exporter-0.14.0.linux-amd64/my.cnf
cat > /root/.my.cnf <<EOF
[client]
user=mysql_monitor
password=mysql_monitor
EOF
# >>>
/usr/local/mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter

pro_start.sh

1
2
3
#!/bin/bash
mkdir -p /applog/prometheus && touch /applog/prometheus/prometheus.log
nohup ./prometheus --config.file=prometheus.yml --web.enable-lifecycle > /applog/prometheus/prometheus.log 2>&1 &

2.安装alertmanager 报警组件【3 分】

将提供的alertmanager-0.21.0.linux-amd64.tar.gz 上传到prometheus 节点/usr/local/ 目录下并解压,创建软连接alertmanager-0.23.0.linux-amd64/ alertmanager。

创建service 启动文件,然后启动alertmanager 查看9093 端口。在prometheus.yml 配置文件中添加alertmanager 信息并重新启动prometheus 服务,在agent 上停止node_exporter 服务。到web 界面中查看警报管理器状态是否正常和agent 状态是否异常。
将操作命令及截图提交到答题框。

1
2
3
cd /usr/local
tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz
ln -s /usr/local/alertmanager-0.21.0.linux-amd64/alertmanager.yml /root/

alertmanager.service

1
2
3
4
5
6
7
8
9
10
11
12
[unit]
Description=alertmanager
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/alertmanager-0.21.0.linux-amd64/alertmanager --storage.path=/usr/local/alertmanager-0.21.0.linux-amd64/data --config.file=/root/alertmanager.yml
Restart=on-failure

[Install]
WantedBy=mutli-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mv alertmanager.service /lib/systemd/system/
systemctl daemon-reload
systemctl enable alertmanager --now
ss -ntlp |grep 9093
# Changed `/usr/local/prometheus-2.37.0.linux-amd64/prometheus.yml`
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# >>>
- job_name: 'Altertmanager'
static_configs:
- targets: ['192.168.200.200:9093']

live.rules

1
2
3
4
5
6
7
8
9
10
11
groups:
- name: example
rules:
- alert: HighErrorRate
expr: promhttp_metric_handler_requests_total{code!="200", instance="192.168.200.201:9100", job="node"}
for: 10m
labels:
severity: page
annotations:
summary: Service downed latency
description: node_exporter svc is dead

3.alertmanager 告警邮件文件编写【3 分】

Prometheus 虚拟机/usr/local/alertmanager/ 中存在着一个alertmanager.yml 文件,请根据提供的地址和模板编写告警所发送到的email 邮箱地址信息。
将配置文件中编写的内容提交到答题框。

alertmanager.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '<qq>@qq.com'
smtp_auth_username: '<qq>@qq.com'
smtp_auth_password: "<pwd>"
smtp_require_tls: false

route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email'

receivers:
- name: 'email'
email_configs:
- to: '<qq>@qq.com'
webhook_configs:
- url: 'http://127.0.0.1:5001/'

inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']

4.alertmanager 告警规则编写【3 分】

在prometheus 虚拟机的prometheus 路径下存在一个/rules 目录, 目录下有一个node_rules.yml 文件。请根据提供信息仿照模板编写:

  1. 内存大于50%报警规则;
  2. cpu 资源利用率大于75%报警规则;
  3. 主机磁盘每秒读取数据>50MB报警规则;

部门名称可为工位号,将配置文件内容提交到答题框。

node_rules.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
groups:
- name: alertmanager_pod.rules
rules:
- alert: Pod_all_cpu_usage
expr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 75
for: 2m
labels:
severity: critical
service: pods
annotations:
description: 容器 {{ $labels.name }} CPU 资源利用率大于 75% , (current value is {{ $value }})
summary: "Dev CPU 负载告警"

- alert: 主机内存使用率告警
expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 50
for: 2m
labels:
severity: warning
annotations:
summary: "内存利用率大于50%, 实例: {{ $labels.instance }},当前值:{{ $value }}%"

- alert: UnusualDiskReadRate
expr: sum by (instance) (irate(node_disk_bytes_read[2m])) / 1024 / 1024 > 50
for: 2m
labels:
severity: warning
annotations:
summary: "Unusual disk read rate (instance {{ $labels.instance }})"
description: "高负载:磁盘正在读取大量数据 (> 50 MB/s) (current value: {{ $value }})"

任务 3 企业级微服务运维(13 分)

1.在K8S 集群安装istio【4 分】

将istio-1.10.1-linux-amd64.tar 上传至master 节点并解压至/root 目录下,将/istio 目录内容器镜像文件上传至各node 节点中并且加载,完成istio 初始化安装,将部署成功后三台POD状态截图提交答题框。

1
2
3
tar -zxvf istio-1.10.1-linux-amd64.tar.gz 
cp istio-1.10.1/bin/istioctl /usr/local/bin/istioctl
istioctl install --set profile=demo -y

2.部署基于在线书店bookinfo【6 分】

Bookinfo 是一个在线书店微服务应用,Bookinfo 应用分为四个单独的微服务:

  1. productpage。这个微服务会调用details 和reviews 两个微服务,用来生成页面。

  2. details。这个微服务中包含了书籍的信息。

  3. reviews。这个微服务中包含了书籍相关的评论。它还会调用ratings 微服务。

  4. ratings。这个微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有3 个版本:v1 版本不会调用ratings 服务;

v2 版本会调用ratings服务,并使用1 到5 个黑色星形图标来显示评分信息;v3 版本会调用ratings 服务,并使用1 到5 个红色星形图标来显示评分信息。

实现该应用服务网格的部署,利用Istio 控制平面为应用提供服务路由、监控数据收集以及策略实施等功能。部署架构如下:

image-20230331132914752

  1. 编写Dockerfile 构建productpage:v1.0 镜像,具体要求如下:
    • 基础镜像:centos:7.9.2009;
    • 安装Python3.6.8 工具;
    • 安装productpage 服务并设置开机自启。
  2. 规划应用微服务部署架构,在容器集群中通过修改微服务应用的yaml 文件来完成bookinfo 微服务应用的部署。
  3. 在容器集群中设置熔断规则,对Bookinfo 其中的productpage 微服务设置熔断规则,并通过负载fortio 测试客户端触发熔断机制进行验证。
1
2
# Change image source url
kubectl apply -f bookinfo/bookinfo.yaml

3.部署网关接口实现对外服务【3 分】

通过 istio-1.10.1/samples/bookinfo/networking/bookinfo-gateway.yaml 部署bookinfo 网关,通过外部浏览器登陆 bookinfo,请将浏览器反馈的结果截图提交答题框。

bookinfo-gateway.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
1
2
kubectl apply -f bookinfo-gateway.yaml
kubectl get gateways.networking.istio.io