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/isomount -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/centosumount /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 > source /etc/xiandian/openrc.sh > echo $INTERFACE_IP
2.搭建数据库组件
使用提供的脚本框架 iaas-install-mysql.sh , 在controller 节点上安装 mariadb 、mencached、rabbitmq 等服务并完成相关配置。完成后修改配置文件将 mencached 最大连接数修改为2048。
请将修改后的配置文件提交到答题框。【1 分】
controller & compute:
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.shopenstack 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.100~172.18.x.200,网关为 172.18.x.1。创建云主机内部网络int-net1,子网为int-subnet1,云主机子网 IP 可用网段为 10.0.0.100~10.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/imagesqemu-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/2umount /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 -Thumount /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/fstabcat >> /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/paasmount 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.localecho "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-composechmod +x /usr/local/bin/docker-composedocker-compose version
4.上传 docker 镜像
在master 节点使用/opt/paas/ k8s_image_push.sh 将所有镜像上传至docker 仓库。完成后将Harbor 仓库 library 中镜像列表截图,请将以上截图提交到答题框。【1 分】
Master: (可替代的方案)
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 cp /opt/paas/k8s_master_install.sh master.shscp /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=masterrpm -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 kubectl cluster-info kubectl get pods -A
8.安装 kubernetes 网络插件
使用 kube-flannel.yaml 安装 kubernetes 网络插件,安装完成后使用命令查看节点状态。完成后使用命令查看集群状态。
将集群状态查看命令和返回结果提交到答题框。【0.5 分】
Master: (可替代的方案)
9.kubernetes 图形化界面的安装
安装 kubernetes dashboard 界面,完成后查看首页然后将 kubernetes dashboard 界面截图提交到答题框。【1 分】
Master: (可替代的方案)
Web:
1 2 3 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
任务三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 buildmv init.sql build/cd buildcat > 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 nfscat >> /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 - --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 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/ansiblecd ansiblecat > 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 --list
、ansible all -m ping
和ansible 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/ - job_name: "mysql" static_configs: - targets: ["10.0.0.110:9104" ,"10.0.0.120:9104" ] cd /usr/local/prometheus-2.37.0.linux-amd64chmod +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.cnfcat > /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.lognohup ./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/localtar -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 =alertmanagerAfter =network.target[Service] Type =simpleUser =rootExecStart =/usr/local/alertmanager-0.21 .0 .linux-amd64/alertmanager --storage.path=/usr/local/alertmanager-0.21 .0 .linux-amd64/data --config.file=/root/alertmanager.ymlRestart =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 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 文件。请根据提供信息仿照模板编写:
内存大于50%报警规则;
cpu 资源利用率大于75%报警规则;
主机磁盘每秒读取数据>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/istioctlistioctl install --set profile=demo -y
2.部署基于在线书店bookinfo【6 分】
Bookinfo 是一个在线书店微服务应用,Bookinfo 应用分为四个单独的微服务:
productpage。这个微服务会调用details 和reviews 两个微服务,用来生成页面。
details。这个微服务中包含了书籍的信息。
reviews。这个微服务中包含了书籍相关的评论。它还会调用ratings 微服务。
ratings。这个微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有3 个版本:v1 版本不会调用ratings 服务;
v2 版本会调用ratings服务,并使用1 到5 个黑色星形图标来显示评分信息;v3 版本会调用ratings 服务,并使用1 到5 个红色星形图标来显示评分信息。
实现该应用服务网格的部署,利用Istio 控制平面为应用提供服务路由、监控数据收集以及策略实施等功能。部署架构如下:
编写Dockerfile 构建productpage:v1.0 镜像,具体要求如下:
基础镜像:centos:7.9.2009;
安装Python3.6.8 工具;
安装productpage 服务并设置开机自启。
规划应用微服务部署架构,在容器集群中通过修改微服务应用的yaml 文件来完成bookinfo 微服务应用的部署。
在容器集群中设置熔断规则,对Bookinfo 其中的productpage 微服务设置熔断规则,并通过负载fortio 测试客户端触发熔断机制进行验证。
1 2 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