A模块:OpenStack 平台部署与运维
项目需求:某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台建设,平台聚焦“DevOps建运一体”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台。拟将该任务交给工程师A与B,分工协助完成云平台服务部署、云应用开发、云系统运维等任务。
表 1 IP 地址规划
说明:
1.选手自行检查工位pc机硬件及网络是否正常;
2.竞赛使用集群模式进行,给每个参赛队提供华为云账号和密码及竞赛系统的账号和密码。选手通过用户名与密码分别登录华为云和考试系统;
3.竞赛用到的软件包都在云主机/root下。
4.表1中的公网IP和私网IP以自己云主机显示为准,每个人的公网IP和私网IP不同。使用第三方软件远程连接云主机,使用公网IP连接。
任务1 OpenStack私有云平台搭建
基础环境配置
把controller节点主机名设置为controller, compute节点主机名设置为compute,修改hosts文件将IP地址映射为主机名;配置SSH免密通信;在compute节点把数据盘的80G空间分为3个空白分区,大小自定义,供后续组件使用。
在controller节点将hostnamectl && cat /etc/hosts && cat /root/.ssh/known_hosts命令的返回结果提交到答题框。
(0.5 分)
yum源配置
在controller节点使用提供的CentOS-7-x86_64-DVD-2009.iso和openstack-train.tar.gz配置本地yum源local.repo,在compute节点创建FTP源ftp.repo,使用controller节点为FTP服务器。
在controller节点将yum repolist && rpm -qa | grep ftp && ssh compute "cat /etc/yum.repos.d/ftp.repo"命令的返回结果提交到答题框。
(0.5 分)
基础安装
在控制节点和计算节点分别安装openstack-shell软件包,根据表2配置两个节点脚本文件中的基本变量(配置脚本文件为/root/variable.sh),其它变量根据实际情况配置。配置完成后执行openstack-completion.sh 脚本完成基础安装。
表2 云平台配置信息
在controller节点将cat /root/variable.sh | grep -Ev '^$|#|000000' && systemctl status chronyd命令的返回结果提交到答题框。
(0.5 分)
数据库安装与调优
在controller节点上使用openstack-controller-mysql.sh脚本安装Mariadb、Memcached、RabbitMQ等服务。安装服务完毕后,修改/etc/my.cnf文件,完成下列要求:
(1)设置数据库支持大小写;
(2)设置数据库缓存innodb表的索引,数据,插入数据时的缓冲为4G;
(3)设置数据库的log buffer为64MB;
(4)设置数据库的redo log大小为256MB;
(5)设置数据库的redo log文件组为2。
在controller节点将cat /etc/my.cnf | grep -Ev ^'(#|$)' && source /root/variable.sh && mysql -uroot -p$DB_PASS -e "show variables like 'innodb_log%';"命令的返回结果提交到答题框。
(1 分)
Keystone服务安装与使用
在controller节点上使用openstack-controller-keystone.sh脚本安装Keystone服务。安装完成后,使用相关命令,创建用户competition,密码为000000。
在controller节点将source /root/admin-openrc && openstack service list && openstack user list命令的返回结果提交到答题框。
(1 分)
Glance安装与使用
在controller节点上使用openstack-controller-glance.sh脚本安装glance 服务。使用命令将提供的cirros-0.3.4-x86_64-disk.img镜像上传至平台,命名为cirros,并设置最小启动需要的硬盘为10G,最小启动需要的内存为1G。
在controller节点将source /root/admin-openrc && openstack-service status glance && openstack image show cirros | sed s/[[:space:]]//g命令的返回结果提交到答题框。
(1 分)
Nova安装
在controller节点和compute节点上分别使用openstack-controller-nova.sh脚本、openstack-compute-nova.sh脚本安装Nova服务。安装完成后,请修改nova相关配置文件,解决因等待时间过长而导致虚拟机启动超时从而获取不到IP地址而报错失败的问题。
在controller节点将source admin-openrc && openstack-service status nova && cat /etc/nova/nova.conf | grep -Ev ^'(#|$|\[)'命令的返回结果提交到答题框。
(1 分)
Neutron安装
使用提供的脚本openstack-controller-neutron.sh和openstack-compute-neutron.sh,分别在controller和compute节点上安装neutron服务。
在controller节点将source /root/admin-openrc && openstack-service status neutron && openstack network agent list命令的返回结果提交到答题框。
(1 分)
Dashboard安装
在controller节点上使用openstack-controller-dashboard.sh脚本安装dashboad服务。安装完成后,将Dashboard中的Django数据修改为存储在文件中。
在controller节点将cat /etc/openstack-dashboard/local_settings | grep -Ev '(#|^$)' | grep django命令的返回结果提交到答题框。
(1 分)
Cinder创建硬盘
在控制节点和计算节点分别使用openstack-controller-cinder.sh、openstack-compute-cinder.sh脚本安装Cinder服务,请在compute节点,对块存储进行扩容操作,即在计算节点再分出一个5G的分区,加入到cinder块存储的后端存储中去。
在compute节点将openstack-service status cinder && vgdisplay命令的返回结果提交到答题框。
(1 分)
Swift安装
在控制节点和计算节点上分别使用openstack-controller-swift.sh和openstack-compute-swift.sh脚本安装Swift服务。安装完成后,使用命令创建一个名叫container的容器,将cirros-0.3.4-x86_64-disk.img镜像上传到container容器中,并设置分段存放,每一段大小为10M。
在controller节点将source /root/admin-openrc && openstack-service status swift && swift list container_segments命令的返回结果提交到答题框。
(1 分)
Manila服务安装与使用
在控制和计算节点上分别使用openstack-controller-manila.sh和openstack-compute-manila.sh脚本安装manila服务。安装服务后创建default_share_type共享类型(不使用驱动程序支持),接着创建一个大小为2G的共享存储名为share01并开放share01目录对OpenStack管理网段使用权限。
在controller节点将source /root/admin-openrc && openstack-service status manila && manila access-list share01命令的返回结果提交到答题框。
(1 分)
Cloudkitty服务安装与使用
使用openstack-controller-cloudkitty.sh脚本安装cloudkitty服务,安装完毕后,启用hashmap评级模块,接着创建volume_thresholds组,创建服务匹配规则volume.size,并设置每GB的价格为0.01。接下来对应大量数据设置应用折扣,在组volume_thresholds中创建阈值,设置若超过50GB的阈值,应用2%的折扣(0.98)。
在controller节点将source /root/admin-openrc && cloudkitty hashmap threshold list -s $(cloudkitty hashmap service list |grep volume | awk -F '|' '{print $3}')命令的返回结果提交到答题框。
(1 分)
任务2 OpenStack私有云服务运维
Raid磁盘阵列管理
在controller节点分出4个大小为10G的分区,使用这4个分区,创建名为/dev/md5、raid级别为5的磁盘阵列加一个热备盘。
创建完成后将mdadm -D /dev/md5命令的返回结果提交到答题框。
(1 分)
Keystone优化-优化token失效时间
openstack api server在处理请求前会校验token是否合法,除了校验token是否过期,同时还校验token是否在token失效列表里面;这个token失效列表会在本地缓存,如果过期,则会去keystone重新获取,在并发的时候,keystone会成为瓶颈点。请修改相关配置,将Keystone的失效列表缓存时间增加到原来的两倍。
在controller节点将cat /etc/keystone/keystone.conf | grep -Ev ^'(#|$|\[)'命令的返回结果提交到答题框。
(0.5 分)
Keystone权限控制
使用自行搭建的OpenStack私有云平台,修改普通用户权限,使普通用户不能对镜像进行创建和删除操作。
在controller节点将source /root/demo-openrc && openstack image create --container-format bare --disk-format qcow2 test_CentOS7.9命令的返回结果提交到答题框。
(0.5 分)
安全组管理
使用openstack命令创建名称为group_web的安全组该安全组的描述为”Custom security group”,用openstack命令为安全组添加icmp规则和ssh规则允许任意ip地址访问web,完成后使用openstack命令查看该安全组的详细信息。
将source /root/admin-openrc && openstack security group show group_web命令的返回结果提交到答题框。
(1 分)
修改文件句柄数
Linux服务器大并发时,往往需要预先调优Linux参数。默认情况下,Linux最大文件句柄数为1024个。当你的服务器在大并发达到极限时,就会报出“too many open files”。修改相关配置文件,将控制节点的最大文件句柄数永久修改为65535。
在controller节点将ulimit -n && cat /etc/security/limits.conf | grep -Ev ^'(#|$)'命令的返回结果提交到答题框。
(1 分)
镜像转换
使用自行搭建的OpenStack平台。上传CentOS_7.9_x86_64_GJ.qcow2镜像,请使用qemu相关命令,将镜像转换为raw格式镜像,转换后的镜像命名为CentOS7.9.raw并存放在/root 目录下。
在controller节点将qemu-img info /root/CentOS7.9.raw命令的返回结果提交到答题框。
(0.5 分)
OpenStack镜像压缩
使用自行搭建的OpenStack平台。上传提供的CentOS-7-x86_64-GenericCloud-2009.qcow2镜像,请使用qemu相关命令,对该镜像进行压缩,压缩后的镜像命名为CentOS-GenericCloud-2009.qcow2并存放在/root目录下。
将qemu-img info /root/CentOS-GenericCloud-2009.qcow2命令的返回结果提交到答题框。
(1 分)
Glance对接Cinder存储
在自行搭建的OpenStack平台中修改相关参数,使glance可以使用cinder作为后端存储,将镜像存储于cinder卷中。使用cirros-0.3.4-x86_64-disk.img文件创建cirros-image镜像存储于cinder卷中,通过cirros-image镜像使用cinder卷启动盘的方式进行创建虚拟机。
在controller节点将source /root/admin-openrc && cat /etc/glance/glance-api.conf | grep -Ev ^"(#|$|\[)" && cat /etc/cinder/cinder.conf | grep -Ev ^"(#|$|\[)" && source /root/admin-openrc && openstack image show cirros-image && cinder list命令的返回结果提交到答题框。
(1 分)
Nova优化-优化数据库连接
当并发业务处理需要连接数据库,并发度高的时候,提示数据库连接超过了上限 。解决思路:调整各组件的数据库连接数配置,下面通过修改nova相关配置文件,修改连接池大小和最大允许超出的连接数为10。
在controller节点将cat /etc/nova/nova.conf | grep -Ev ^'(#|$|\[)' | grep 10命令的返回结果提交到答题框。
(1 分)
Nova保持云主机状态
OpenStack平台若意外断电,在电力系统恢复后,OpenStack平台可以自启动,但是运行的云主机需要管理员手动开启,在OpenStack平台中配置虚拟机自启动,当宿主机启动后,把虚拟机恢复到之前的状态,如果虚拟机之前是关机,则宿主机启动后,虚拟机也是关机状态;如果虚拟机之前是开机状态,则宿主机启动后,虚拟机还是开机状态中运行的虚拟机。
在controller节点将cat /etc/nova/nova.conf | grep -Ev ^'(#|$|\[)' | grep true命令的返回结果提交到答题框。
(0.5 分)
Nova资源优化
在OpenStack中,默认的CPU超配比例是1:16,内存超配比例是1:1.5。当宿主机使用swap交换分区来为虚拟机分配内存的时候,则虚拟机的性能将急速下降。生产环境上一般不建议开启内存超售(建议配置比例1:1)。请编辑nova.conf文件,将内存预留量配置为4GB,保证该部分内存不能被虚拟机使用。
在修改节点将cat /etc/nova/nova.conf | grep -Ev ^'(#|$|\[)'命令的返回结果提交到答题框。
(1 分)
Nova自动清理镜像缓存
当在openstack平台创建虚拟机时,若是第一次在计算节点创建虚拟机,会先将镜像文件复制到该计算节点目录/var/lib/nova/instances/_base,长期下来,该目录会占用比较大的磁盘空间而需要清理,可以通过修改nova的配置文件来自动清理该缓存目录,即在该节点没有使用其镜像启动的云主机时,那么这个镜像在过一定的时间后就会被自动删除。
在修改节点将cat /etc/nova/nova.conf | grep -Ev ^'(#|$|\[)'命令的返回结果提交到答题框。
(1 分)
Cinder限速
在使用Cinder服务的时候,为了减缓来自实例的数据访问速度的减慢,OpenStack Block Storage 支持对卷数据复制带宽的速率限制。请修改cinder后端配置文件将卷复制带宽限制为最高100 MiB/s。
在修改节点将cat /etc/cinder/cinder.conf | grep -Ev ^'(#|$|\[)'命令的返回结果提交到答题框。
(1 分)
使用Heat模板创建用户
在controller节点执行openstack-controller-heat.sh会自行安装heat服务并完成配置,执行完成后在/root目录下编写Heat模板create_user.yaml,创建名为heat-user的用户,属于admin项目包,并赋予heat-user用户admin的权限,配置用户密码为123456,编写完成之后不要创建堆栈。
在controller节点将source admin-openrc && openstack-service status heat && openstack stack create -t /root/create_user.yaml test-user && cat /root/create_user.yaml命令的返回结果提交到答题框。
(1 分)
任务3 OpenStack私有云运维开发
安装python3环境
在controller节点安装python3环境。安装完之后查看python3版本,使用提供的whl文件安装依赖。
在controller节点将python3 --version && pip3 --version && pip3 list命令的返回结果提交到答题框。
(0.5 分)
Python运维开发:基于OpenStack API实现镜像上传
编写python代码对接OpenStack API,完成镜像的上传。在controller节点的/root目录下创建create_image.py文件,在该文件中编写python代码对接openstack api(需在py文件中获取token),要求在openstack私有云平台中上传镜像cirros-0.3.4-x86_64-disk.img,命名为cirros_python,disk_format为qcow2,container_format为bare。执行完代码要求输出“创建镜像成功,id为:xxxxxx”。
在controller节点将cat /root/create_image.py && source /root/admin-openrc && openstack image list命令的返回结果提交到答题框。
(2.5 分)
Python运维开发:基于Openstack API创建用户
编写python代码对接OpenStack API,完成用户的创建。在controller节点的/root目录下创建create_user.py文件,在该文件中编写python代码对接openstack api(需在py文件中获取token),要求在openstack私有云平台中创建用户gjbs。
在controller节点将cat /root/create_user.py && source admin-openrc && openstack user list命令的返回结果提交到答题框。
(2.5 分)
Ansible部署FTP服务
将控制节点作为ansible的母机安装ansible服务,在ansible清单中将控制节点ip加入ansible主机组,计算节点ip加入node主机组,编写ansible脚本(在/root目录下创建ansible_ftp目录作为ansible工作目录,部署的入口文件命名为install_ftp.yaml)。install_ftp.yaml文件中需要完成的内容为
(1)yaml中被执行节点为compute,执行者为root;
(2)使用yum模块安装ftp服务;
(3)使用service模块启动ftp服务并设置为开机自启。
在控制节点将cd /root/ansible_ftp && cat install_ftp.yaml && ansible node -a 'systemctl status vsftpd'命令的返回结果提交到答题框。
(1 分)
B模块:容器云
企业构建Kubernetes容器云集群,引入KubeVirt实现OpenStack到Kubernetes的全面转型,用Kubernetes来管一切虚拟化运行时,包含裸金属、VM、容器。同时研发团队决定搭建基于Kubernetes 的CI/CD环境,基于这个平台来实现DevOps流程。引入服务网格Istio,实现业务系统的灰度发布,治理和优化公司各种微服务,并开发自动化运维程序。
表2 IP地址规划
说明:
1.表1中的公网IP和私网IP以自己云主机显示为准,每个人的公网IP和私网IP不同。使用第三方软件远程连接云主机,使用公网IP连接。
2.华为云中云主机名字已命好,直接使用对应名字的云主机即可。
3.竞赛用到的软件包都在云主机/root下。
任务1 容器云服务搭建
部署容器云平台
自行核对服务器密码和脚本中密码是否一致,完成Kubernetes集群的部署,并完成Istio服务网格、KubeVirt虚拟化和Harbor镜像仓库的部署(master节点依次执行k8s_harbor_install.sh、k8s_image_push.sh、k8s_master_install.sh、k8s_project install.sh,node节点执行k8snode_install.sh)。
请将kubectl cluster-info&&kubectl -n istio-system get all&&kubectl -n kubevirt get deployment命令的返回结果提交到答题框。
(2 分)
任务2 容器云服务运维
容器化部署Node-Exporter
编写Dockerfile文件构建exporter镜像,要求基于centos完成Node-Exporter服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)
(1)基础镜像:centos:centos7.9.2009;
(2)使用二进制包node_exporter-0.18.1.linux-amd64.tar.gz安装node-exporter服务;
(3)声明端口:9100;
(4)设置服务开机自启。
请使用docker build命令进行构建镜像monitor-exporter:v1.0并使用 docker run 命令运行该容器。
将docker run -d --name exporter-test monitor-exporter:v1.0 && sleep 5 && docker exec exporter-test ps -aux && docker rm -f exporter-test 命令的返回结果提交到答题框。
(0.5 分)
容器化部署Alertmanager
编写Dockerfile文件构建alert镜像,要求基于centos完成Alertmanager服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)
(1)基础镜像:centos:centos7.9.2009
(2)使用提供的二进制包alertmanager-0.19.0.linux-amd64.tar.gz安装Alertmanager服务;
(3)声明端口:9093、9094;
(4)设置服务开机自启。
请使用docker build命令进行构建镜像monitor-alert:v1.0并使用 docker run 命令运行该容器。
将docker run -d --name alert-test monitor-alert:v1.0 && sleep 5 && docker exec alert-test ps -aux && docker rm -f alert-test命令的返回结果提交到答题框。
(0.5 分)
容器化部署Grafana
编写Dockerfile文件构建grafana镜像,要求基于centos完成Grafana服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)
(1)基础镜像:centos:centos7.9.2009;
(2)使用提供的二进制包grafana-6.4.1.linux-amd64.tar.gz安装grafana服务;
(3)声明端口:3000;
(4)设置nacos服务开机自启。
请使用docker build命令进行构建镜像monitor-grafana:v1.0并使用 docker run 命令运行该容器。
将docker run -d --name grafana-test monitor-grafana:v1.0 && sleep 5 && docker exec grafana-test ps -aux && docker rm -f grafana-test 命令的返回结果提交到答题框。
(0.5 分)
容器化部署Prometheus
编写Dockerfile文件构建prometheus镜像,要求基于centos完成Promethues服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)
(1)基础镜像:centos:centos7.9.2009;
(2)使用提供的二进制包prometheus-2.13.0.linux-amd64.tar.gz安装promethues服务;
(3)编写prometheus.yml文件,创建3个任务模板:prometheus、node-exporter和alertmanager,并将该文件拷贝到/data/prometheus/目录下;
(4)声明端口:9090;
(5)设置服务开机自启。
请使用docker build命令进行构建镜像monitor-prometheus:v1.0并使用 docker run 命令运行该容器。
将docker run -d --name prometheus-test monitor-prometheus:v1.0 && sleep 5 && docker exec prometheus-test ps -aux && docker rm -f prometheus-test命令的返回结果提交到答题框。
(0.5 分)
编排部署监控系统
编写docker-compose.yaml文件,使用镜像exporter、alert、grafana和prometheus完成监控系统的编排部署。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)
(1)容器monitor-node;镜像:monitor-exporter:v1.0;端口映射:9100:9100;
(2)容器monitor- alertmanager;镜像:monitor-alert:v1.0;端口映射:9093:9093、9094:9094;
(3)容器monitor-grafana;镜像:monitor-grafana:v1.0;端口映射:3000:3000;
(4)容器monitor-prometheus;镜像:monitor-prometheus:v1.0;端口映射:9090:9090。
1.使用docker-compose ps命令进行查看,将返回结果提交至答题框。
2.将curl -L http://$(hostname -i):9090/targets | grep up 命令的返回结果提交到答题框。
(1 分)
导入jenkins镜像
基于Kubernetes构建持续集成,master节点、harbor节点和cicd节点对应的IP都为master节点的IP, CICD_OFF.TAR(需要的包在Technology_packageV1.0.iso中CICD_CICD_Offline.TAR)。把CICD_CICD_Offline.TAR移动到/opt目录下然后解压。导入jenkins.tar文件中的镜像。
将docker images | grep jenkins命令的返回结果提交到答题框。
(0.5 分)
安装Jenkins
编写Jenkins编排文件,启动并配置Jenkins。
(1)编写docker-compose.yaml启动Jenkins。
(2)新建用户springcloud,密码000000
(3)修改系统配置Resource root URL。
将docker-compose ps命令的返回结果提交到答题框。
(1 分)
部署Gitlab
编写Gitlab编排文件并启动Gitlab。
(1)编写docker-compose.yaml启动Gitlab。
(2)使用root用户登录Gitlab。
(3)在harbor仓库创建公开项目springcloud。
将docker-compose ps命令的返回结果提交到答题框。
(1 分)
push源代码
push源代码到gitlab的springcloud项目,并完成相关配置。
将git push -u origin master命令成功push的返回结果提交到答题框。
(1 分)
Jenkins连接maven
配置Jenkins连接Gitlab,安装maven并完成相关配置。
将docker exec jenkins bash -c "source /etc/profile && mvn -v"命令的返回结果提交到答题框。
(1 分)
配置并触发CI/CD
编写流水线脚本配置CI/CD,habor仓库创建springcloud项目,上传代码触发自动构建。
构建成功后将curl kubectl get endpoints -n springcloud gateway |grep -v AGE| awk '{print $2}'
命令的返回结果提交到答题框。
(1 分)
服务网格:创建Ingress Gateway
在提供的kubernetes镜像中,使用 project/istio/istio-1.17.2/services/bookinfo.yaml部署bookinfo应用,将Bookinfo应用部署到default命名空间下,使用Istio Gateway可以实现应用程序从外部访问,请为Bookinfo应用创建一个名为bookinfo-gateway的网关,指定所有HTTP流量通过80端口流入网格,然后将网关绑定到虚拟服务bookinfo上。
使用curl -L http://$(hostname -i):$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')/productpage | grep brand命令的返回结果提交到答题框。
(1 分)
服务网格:创建VirtualService
在我们部署好的Bookinfo服务中,访问Bookinfo应用发现,其中一个微服务 reviews 的三个不同版本已经部署并同时运行 ,在浏览器中访问 Bookinfo 应用程序的 /productpage 并刷新几次,您会注意到,有时书评的输出包含星级评分,有时则不包含。这是因为没有明确的默认服务版本可路由,Istio将以循环方式将请求路由到所有可用版本。
(1)将default命名空间下的pod全部删除,并添加自动注入Sidecar并进行重新调度管理。
(2)请为Bookinfo应用创建DestinationRule规则,然后创建VirtualService服务,将所有流量路由到微服务的 v1 版本。
完成这些内容,我们再次访问Bookinfo网页就会发现,流量只会访问到我们的v1版本中。
1、将kubectl get namespace default --show-labels命令的返回结果提交至答题框
2、将kubectl describe vs reviews 命令的返回结果提交至答题框
(1 分)
KubeVirt运维:创建VM
使用提供的镜像(images/fedora-virt_v1.0.tar)在default命名空间下创建一台VM,名称为test-vm,内存大小为1Gi,磁盘驱动:virtio,运行策略:Manual。
(1)如果VM出现调度失败的情况,请修改kubevirt配置,让其支持硬件仿真。将kubectl edit kubevirts.kubevirt.io -n kubevirt命令的返回结果提交至答题框。
(2)将kubectl describe vm test-vm命令的返回结果提交到答题框。
(1 分)
KubeVirt运维:开启功能优化
在KubeVirt中有很多功能,为了更好的使用,更改kubevirt配置开启以下功能
(1)启用快照/恢复支持功能
(2)启动热插拔卷功能
(3)启动实时迁移功能
(4)启动边车功能
(5)启动主机磁盘功能
更改完成后,将kubectl describe kubevirt kubevirt -n kubevirt命令的返回结果提交到答题框。
(1 分)
Deployment管理:创建deployment
在master节点打上标签“tty=master”,然后编写deployment.yaml文件创建deployment,具体的要求如下。
(1)创建的deployment的名字为test-deployment
(2)使用nginx镜像
(3)Pod只能调度到标签为“tty=master”的节点上
创建deployment后将cat deployment.yaml &&kubectl describe deployment test-deployment命令的返回结果提交至答题框。
(1 分)
PV卷管理:创建PV卷
创建一个 pv,名字为 app-config,大小为 2Gi, 访问权限为 ReadWriteMany。Volume 的类型为 hostPath,路径为 /srv/app-config。
创建完成后,将kubectl describe pv 命令的返回结果提交至答题框。
(1 分)
Ingress资源管理:创建Ingress
创建一个新的 nginx lngress资源:
(1)名称:pong
(2)Namespace:ing-internal
(3)使用服务端口 5678 在路径 /hello 上公开服务 hello
将kubectl describe ingress -n ing-internal命令的返回结果提交至答题框。
(1 分)
任务3 部署Owncloud网盘服务
ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可以像 百度云那样实现文件跨平台同步、共享、版本控制、团队协作等。
创建PV和PVC
编写yaml文件(文件名自定义)创建PV和PVC来提供持久化存储,以便保存 ownCloud 服务中的文件和数据。
要求:PV(名称为owncloud-pv,访问模式为读写,只能被单个节点挂载;存储为5Gi;存储类型为hostPath,存储路径自定义);PVC(名称为owncloud-pvc,访问模式为读写,只能被单个节点挂载;申请存储空间大小为5Gi)。
将kubectl get pv,pvc命令的返回结果提交到答题框。
(1 分)
配置ConfigMap
编写yaml文件(文件名自定义)创建一个configMap对象,名称为owncloud-config,指定OwnCloud的环境变量。登录账号对应的环境变量为OWNCLOUD_ADMIN_USERNAME,密码对应的环境变量为OWNCLOUD_ADMIN_PASSWORD。(变量值自定义)
将kubectl get ConfigMap命令的返回结果提交到答题框。
(0.5 分)
创建Secret
编写yaml文件(文件名自定义)创建一个Secret对象,名称为owncloud-db-password,以保存OwnCloud数据库的密码。对原始密码采用base64编码格式进行加密。
将kubectl get Secret命令的返回结果提交到答题框。
(0.5 分)
部署Owncloud Deployment应用
编写yaml文件(文件名自定义) 创建Deployment对象, 指定OwnCloud的容器和相关的环境变量。(Deployment资源命名为owncloud-deployment,镜像为Harbor仓库中的owncloud:latest,存储的挂载路径为/var/www/html,其它根据具体情况进行配置)
将kubectl describe pod $(kubectl get pod | grep owncloud-deployment | awk -F \ '{print $1}')命令的返回结果提交到答题框。
(1 分)
创建Service
编写yaml文件(文件名自定义)创建一个Service对象使用NodePort的方式将OwnCloud公开到集群外部,名称为owncloud-service。通过http://IP:端口号可查看owncloud。
将kubectl get svc -A命令的返回结果提交到答题框。
(1 分)
部署nacos集群
Nacos是Dynamic Naming and Configuration Service(动态命名和配置服务)的首字母简称,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos由阿里巴巴开源,致力于帮助用户发现、配置和管理微服务。
Nacos提供了一组简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。它是构建以“服务”为中心的现代应用架构(如微服务范式、云原生范式)的服务基础设施。
导入镜像
将Nacos-Ingress.tar.gz压缩包解压至root目录下,使用/root/nacos-ingress作为后续题目操作目录,将nacos-ingress.tar导入docker中。
在master节点将docker images | grep ingress && nerdctl images | grep nacos命令的返回结果提交到答题框。
(0.5 分)
配置NFS Server端
在master节点安装nfs服务作为服务端,创建目录/root/data/nacos作为nacos共享目录,创建目录/root/data/mysql作为mysql共享目录,将上述创建的两个文件夹赋予777权限,修改nfs配置文件将创建的文件夹暴露给任意用户使其进行读写操作,重启nfs服务并设置开机自启。
在master节点将systemctl status nfs && showmount -e命令的返回结果提交到答题框。
(0.5 分)
创建ServiceAccount并配置RBAC
在master节点编写/root/nacos-ingress/rbac.yaml完成以下内容:
1)创建名称为nfs-client-provisioner的ServiceAccount账号。
2)创建访问控制的角色(Role):leader-locking-nfs-client-provisioner和角色绑定(RoleBinding):leader-locking-nfs-client-provisioner,要求Role实现以下操作:
①允许对endpoints进行get,list,watch,create,update,patch操作。
②将leader-locking-nfs-client-provisioner关联对象ServiceAccount:nfs-client-provisioner,引用Role: leader-locking-nfs-client-provisioner。
3)创建集群范围的角色(ClusterRole):nfs-client-provisioner-runner和集群角色绑定(ClusterRoleBinding):run-nfs-client-provisioner,要求ClusterRole实现以下操作:
①允许对persistentvolumes进行get,list,watch,create,delete操作。
②允许对persistentvolumeclaims进行get,list,watch,update操作。
③允许对endpoints进行get,list,watch,create,update,patch操作。
④允许对storageclasses进行get,list,watch操作。
⑤允许对events行create,update,patch操作。
⑥将run-nfs-client-provisioner关联对象ServiceAccount:nfs-client-provisioner,引用ClusterRole: nfs-client-provisioner-runner。
在master节点创建完成后将cat /root/nacos-ingress/rbac.yaml && kubectl describe role.rbac.authorization.k8s.io命令的返回结果提交到答题框。
(1 分)
为nacos创建pv和pvc
在/root/nacos-ingress/目录下编写nacos-pv.yaml文件用于创建名为nacos-pv的pv,编写nacos-pvc.yaml用于创建名为nacos-data的pvc,要求挂载到nfs的nacos目录下,大小为2Gi。
在master节点将cat /root/nacos-ingress/nacos-pv* && kubectl get pv,pvc && kubectl describe pv/nacos-pv pvc/nacos-data命令的返回结果提交到答题框。
(1 分)
部署NFS Provisioner
编写nfs-deployment.yaml文件,基于nfs-subdir-external-provisioner镜像创建nfs-client-provisioner的deployment对象,副本数量2,PROVISIONER_NAME的值使用nacos.brics.com,绑定nfs服务端的nacos共享目录。
在master节点创建完成后将cat /root/nacos-ingress/nfs-deployment.yaml && kubectl get pod,deploy && kubectl describe pod $(kubectl get pod | grep nfs-client-provisioner | awk -F\ '{print $1}')的返回结果提交到答题框。
(1 分)
StorageClass动态绑定
编写storageclass.yaml文件,创建名为managed-nfs-storage的storageclass动态绑定nfs-provisioner,完成后查看nfs-provisioner的storageclasses对象。
在master节点创建完成后将cat /root/nacos-ingress/storageclass.yaml && kubectl describe storageclasses managed-nfs-storage命令的返回结果提交到答题框。
(0.5 分)
为mysql创建pv和pvc
在/root/nacos-ingress/目录下编写mysql-pv.yaml文件用于创建名为nacos-mysql-pv的pv,编写mysql-pvc.yaml用于创建名为mysql-data的pvc,要求挂载到nfs的mysql目录下,大小为2Gi。
在master节点创建完成后将cat /root/nacos-ingress/mysql-pv* && kubectl get pv,pvc && kubectl describe pv/nacos-mysql-pv pvc/mysql-data命令的返回结果提交到答题框。
(1 分)
部署mysql
编写mysql-nfs.yaml,通过ReplicationController构建mysql的pod,副本数量1,名字为mysql,并且使用上述storageclass提供的存储,使用nacos-mysql:5.7镜像,声明容器的3306端口,绑定nfs服务端的mysql共享目录,设置mysql的root密码为123123 ,创建数据库nacos_devtest,创建用户nacos密码为123123;创建名为mysql的Service,声明端口3306。
在master节点创建完成后将cat /root/nacos-ingress/mysql-nfs.yaml && kubectl get pod | grep mysql && kubectl describe replicationcontroller/mysql命令的返回结果提交到答题框。
(1 分)
部署nacos集群
使用提供的nacos-nfs.yaml文件,结合上下文参数,将端口等空置的参数补全,通过该文件创建StatefulSet和Service。
在master节点创建完成后将cat /root/nacos-ingress/nacos-nfs.yaml && kubectl describe pod nacos-0 && kubectl logs --tail=40 nacos-0 | grep -v ^$命令的返回结果提交到答题框。
(1 分)
部署ingress访问nacos集群
使用提供的ingress-nginx.yaml部署ingress,编写nacos-ingress.yaml文件创建名为nacos-ingress-http的ingress,匹配策略为Prefix,使nacos集群可以使用域名nacos.brics.com访问,编写完成后修改master节点主机映射,使域名nacos.brics.com映射本机ip。
在master节点创建完成后将cat /root/nacos-ingress/nacos-ingress.yaml && kubectl describe ingress nacos-ingress-http && kubectl get svc -n ingress-nginx && curl http://nacos.brics.com:31200/nacos/v1/core/cluster/nodes?withInstances=false | sed s/\"//g命令的返回结果提交到答题框。
(1 分)
C模块:企业级应用的自动化部署和运维
虚拟机与环境规划表3
说明:
1. 上表中的公网IP以自己云主机显示为准,每个人的公网IP不同。使用第三方软件远程连接云主机,使用公网IP连接。
2.华为云中云主机名字已命好,直接使用对应名字的云主机即可。
3.竞赛用到的软件包都在云主机/root下。
部署方式:在ansible节点采用playbook分别部署zabbix_server节点和zabbix_agent节点。
安装ansible
修改主机名ansible节点主机名ansible, zabbix_server节点主机名为zabbix_server,zabbix_agent节点主机名为zabbix_agent,使用提供的软件包autoDeployment.tar在ansible节点安装ansible。
将ansible --version命令的返回结果提交到答题框。
(0.5 分)
配置免密登录
在ansible节点配置主机映射将IP地址映射为主机名,三台主机名分别为ansible、zabbix_server、zabbix_agent,在ansible节点配置SSH免密通信,通过scp分别把公钥发送给zabbix_server节点和zabbix_agent节点。
在ansible节点将ssh zabbix_server "cat /root/.ssh/known_hosts"命令的返回结果提交到答题框。
(0.5 分)
配置主机清单
在ansible节点配置主机清单,在清单中分别创建server主机组和agent主机组,server主机组主机为zabbix_server的IP地址,agent主机组主机为zabbix_agent的IP地址。
在ansible节点将ansible agent -m ping | sed s/\"//g命令的返回结果提交到答题框。
(0.5 分)
创建ansible工作环境
在ansible节点配置ftp服务,然后创建目录/opt/zabbix/files,在files目录下为zabbix_server节点和zabbix_agent节点编写ftp.repo文件,最后在zabbix目录下创建repo.yaml文件,文件实现的功能要求如下:
1)把zabbix_server节点和zabbix_agent节点自带的repo文件删除。
2)把zabbix_server节点和zabbix_agent节点下的/etc/yum.repos.d目录的权限设置为755
3)把ftp.repo文件同时发送给zabbix_server节点和zabbix_agent节点。
将ansible-playbook /opt/zabbix/repo.yaml命令的返回结果提交到答题框。
(1 分)
安装nginx和php
在ansible节点/opt/zabbix目录创建nginx_php.yaml文件并执行,文件实现的功能要求如下:
1)实现在zabbix_server节点安装nginx和php74(相关软件包:php74-php-fpm,php74-php-common,php74-php-cli,php74-php-gd, php74-php-ldap,php74-php-mbstring,php74-php-mysqlnd,php74-php-xml, php74-php-bcmath,php74-php)。
2)开启nginx和php74服务,并设置为开机自启动。
在ansible节点将ansible server -m shell -a "systemctl status nginx php74-php-fpm ; nginx -v ; php74 -v"命令的返回结果提交到答题框。
(1 分)
安装zabbix服务器端
在ansible节点/opt/zabbix目录创建zabbix_server.yaml文件并执行,文件实现的功能要求如下:
1)在zabbix_server节点安装zabbix的server端、agent端和web端。
2)分别启动zabbix-server和zabbix-agent。
在ansible节点将ansible server -a "systemctl status zabbix-server zabbix-agent"命令的返回结果提交到答题框。
(1 分)
安装数据库
在ansible节点/opt/zabbix目录创建mariadb.yaml文件并执行,文件实现的功能要求如下:
1)在zabbix_server节点安装MariaDB-server。
2)启动数据库服务并设置为开机自启动。
在ansible节点将ansible server -m shell -a "systemctl status mariadb | head -n 6"命令的返回结果提交到答题框。
(2 分)
配置数据库
在ansible节点/opt/zabbix目录创建mariadb_cfg.yaml文件并执行,文件实现的功能要求如下:
1.设置mysql登录密码,密码为password,默认登录账号为root。
2.创建数据库zabbix。
3.创建用户zabbix密码为password并授权zabbix用户拥有zabbix数据库的所有权限。
4.分别导入zabbix数据库架构及数据,对应的文件分别为schema.sql、images.sql和data.sql(文件顺便不能乱)。
在ansible节点将ansible server -m shell -a "mysql -uroot -ppassword -e 'use zabbix;select * from users_groups;show grants for 'zabbix'@'localhost';'"命令的返回结果提交到答题框。
(2 分)
编辑zabbix配置文件
在ansible节点/opt/zabbix目录分别创建zabbix_server.conf.j2和zabbix_agentd.conf.j2,然后编写zsa.yml文件并执行,文件实现的功能要求如下:
1.用template分别把j2文件分别发送给zabbix_server节点的相应位置。
2.重启相应服务使配置生效。
在ansible节点将ansible server -m shell -a "cat /etc/zabbix_server.conf | grep -v '^#\|^$'"命令的返回结果提交到答题框。
(1 分)
编辑php配置文件
在ansible节点/opt/zabbix目录创建php.ini.j2,php.ini.j2配置要求最大POST数据限制为16M,程序执行时间限制为300,PHP页面接受数据所需最大时间限制为300,把时区设为Asia/Shanghai,然后编写php.yaml文件并执行,文件实现的功能要求如下:
1.用template把j2文件发送给zabbix_server节点的相应位置。
2.重启php74服务。
在ansible节点将cat /opt/zabbix/php.yaml && ansible server -m shell -a "cat /etc/opt/remi/php74/php.ini | grep -v '^;'|grep max"命令的返回结果提交到答题框。
(2 分)
配置www.conf
在ansible节点/opt/zabbix目录创建www.conf.j2(把用户和组都设置为nginx),然后编写www.yaml文件并执行,文件实现的功能要求如下:
用template把j2文件发送给zabbix_server节点的相应位置。
在ansible节点将cat /opt/zabbix/www.yaml && ansible server -m shell -a "cat /etc/php-fpm.d/www.conf | grep nginx"命令的返回结果提交到答题框。
(2 分)
编辑nginx配置文件
在ansible节点/opt/zabbix目录创建default.conf.j2(使用80端口,其它参数自行修改),然后编写default.yaml文件并执行,文件实现的功能要求如下:
用template把j2文件发送给zabbix_server节点的相应位置。
在ansible节点将cat /opt/zabbix/default.yaml && ansible server -m shell -a "cat /etc/nginx/conf.d/default.conf | grep -Ev ^'( #|$|\[)'"命令的返回结果提交到答题框。
(2 分)
配置zabbix.conf
在ansible节点/opt/zabbix目录创建zabbix.conf.j2(用户和组都设置为nginx),然后编写zabbix.yaml文件并执行,文件实现的功能要求如下:
1.用template把j2文件发送给zabbix_server节点的相应位置。
2.重启相关服务。
在浏览器中输入http://公网IP/setup.php即可看到zabbix 6.0界面。
在ansible节点将cat /opt/zabbix/zabbix.yaml && curl http://zabbix_server/setup.php | head -n 10命令的返回结果提交到答题框。
(2 分)
编写playbook
在ansible节点/opt/zabbix目录编辑agent.yaml文件并执行,文件实现的功能要求如下:
1.把ftp.repo远程复制到zabbix_agent节点相应位置。
2.在zabbix_agent节点安装zabbix-agent服务。
3.用template把zabbix_agentd.conf.j2文件发送给zabbix_agent节点的相应位置。
4.重启zabbix-agent服务。
在ansilbe节点将cat agent.yaml && ansible agent -m shell -a "systemctl status zabbix-agent"命令的返回结果提交到答题框。
(2 分)
部署prometheus监控mysqld服务
虚拟机与环境规划表3
说明:
1. 上表中的公网IP以自己云主机显示为准,每个人的公网IP不同。使用第三方软件远程连接云主机,使用公网IP连接。
2.华为云中云主机名字已命好,直接使用对应名字的云主机即可。
3.竞赛用到的软件包都在云主机/root下。
安装ansible并创建test用户
修改monitor节点主机名为ansible,slave1节点主机名为slave1,slave2节点主机名为slave2,配置各节点主机映射将IP地址映射为主机名,使用提供的软件包autoDeployment.tar在monitor节点配置yun源并安装ansible。为所有节点添加test用户,设置用户密码为000000,为test用户设置免密sudo,配置ssh免密登录,使monitor节点能够免密登录所有节点的test用户。
在monitor节点将ansible --version && ssh test@slave2 "id && hostnamectl && sudo -lU test"命令的返回结果提交到答题框。
(1 分)
初始化ansible
在monitor节点创建/root/ansible目录作为ansible工作目录,在该目录内创建ansible.cfg文件并完成以下配置,清单文件位置为/root/ansible/inventory,登录用户为test,登录时不需要输入密码,设置并行主机数量为2。允许test用户免密提权到root。
在monitor节点将cat /root/ansible/ansible.cfg命令的返回结果提交到答题框。
(1 分)
编写ansible主机清单
在monitor节点ansible工作目录下配置ansible主机清单,在清单中创建master主机组和node主机组,master主机组内添加monitor主机,node主机组内添加slave1和slave2主机,主机清单中需使用主机名不使用ip。
在monitor节点将cd /root/ansible/ && ansible slave2 -m ping && ansible all -m shell -a "id && users" | sed s/\"//g命令的返回结果提交到答题框。
(0.5 分)
初始化monitor节点
在monitor节点ansible工作目录下编写prometheus.yaml剧本文件控制master主机组完成以下内容(请使用ansible除shell外的对应模块,后续题目均使用提供的软件包Prometheus.tar.gz):
1)使用ansible对应模块将selinux的开机启动状态设置为disabled。
2)使用ansible对应模块安装时间同步服务chrony,并将该服务的作用域设置为0.0.0.0/0,启动服务并设置开机自启动。
3)使用ansible对应模块将monitor节点提供的prometheus-2.37.0.linux-amd64.tar.gz文件解压缩到目标主机的/usr/local/下。
4)使用ansible对应模块将解压出的文件夹重命名为prometheus。
编写完成后将cd /root/ansible/ && ansible-playbook prometheus.yaml && cat prometheus.yaml命令的返回结果提交到答题框。
(2 分)
启动node主机组服务
在monitor节点ansible工作目录下编写node_exporter.yaml剧本文件控制node主机组完成以下内容(请使用ansible除shell外的对应模块):
1)使用ansible对应模块将node_exporter-1.3.1.linux-amd64.tar.gz解压到目标主机组的/usr/local/下。
2)使用ansible对应模块将解压出的文件夹重命名为node_exporter。
3)使用script模块将node_exporter服务后台启动。
编写完成后在monitor节点将cd /root/ansible/ && ansible-playbook /root/ansible/node_exporter.yaml && cat /root/ansible/node_exporter.yaml && sleep 10 && ansible node -m shell -a "ps -aux | grep node"命令的返回结果提交到答题框。
(2 分)
启动monitor主机组服务
在monitor节点ansible工作目录下prometheus.yml配置文件,将需要监控的所有节点信息添加到该文件中;编写prometheus.service启动文件,实现prometheus以服务的形式启动。完成后请编写start_prometheus.yaml剧本文件控制master主机组完成以下内容(请使用ansible除shell外的对应模块):
1)使用ansible对应模块将prometheus.yml文件传输到目标节点prometheus配置目录下
2)使用ansible对应模块将prometheus.service文件传输到目标节点服务配置文件目录下并启动prometheus。
3)使用复制模块将grafana-8.1.2-1.x86_64.rpm包发送到被控节点的/mnt/目录下,然后使用yum模块将该软件包安装,安装完成后启动grafana服务并设置开机自启动。
4)使用浏览器登录prometheus查看prometheus是否成功监控所有node节点。
在monitor节点将cd /root/ansible/ && cat /root/ansible/prometheus.yml | grep : && ansible-playbook /root/ansible/start_prometheus.yaml && cat /root/ansible/start_prometheus.yaml && sleep 20 && systemctl status prometheus | head -n 7 && curl -L http://localhost:9090/api/v1/targets?state=active | sed s/\"//g命令的返回结果提交到答题框。
(3.5 分)
使用prometheus监控mysqld服务
配置slave1节点yum使用monitor节点ftp源,将提供的mysqld_exporter-0.14.0.linux-amd64.tar.gz发送到slave1节点/usr/local/目录下解压并重命名为mysqld_exporter,使用yum安装mariadb服务启动并设为开机自启动。进入mariadb数据库中创建mysqld_monitor用户并授权,然后创建mariadb配置文件,内容为数据库用户名密码。后台启动mysqld_exporter组件确保9104端口启动。回到prometheus节点修改prometheus.yml文件并添加mysql被监控信息。重启prometheus,随后web界面刷新并查看mysqld被控信息。
在monitor节点将cat /usr/local/prometheus/prometheus.yml | grep : && ssh slave1 "ps -aux | grep mysql" && curl -L http://localhost:9090/api/v1/targets?state=active | sed s/\"//g命令的返回结果提交到答题框。
(3.5 分)
安装alertmanager报警组件
在monitor节点将提供的alertmanager-0.21.0.linux-amd64.tar.gz解压到/usr/local/目录下并重命名为alertmanager。创建alertmanager.service启动文件,实现alertmanager以服务的形式启动,然后启动alertmanager查看9093端口。在prometheus.yml配置文件中添加alertmanager信息并重新启动prometheus服务,在slave1节点上停止node_exporter服务。到web界面中查看警报管理器状态是否正常和slave1节点node_exporter状态是否异常。
在monitor节点将cat /usr/local/prometheus/prometheus.yml | grep : && systemctl status alertmanager | head -n 7 && curl -L http://localhost:9093/api/v2/status | sed s/\"//g && curl -L http://localhost:9090/api/v1/targets?state=active | sed s/\"//g命令的返回结果提交到答题框。
(3.5 分)
alertmanager告警规则编写
在monitor节点的/usr/local/prometheus/路径下编写node_rules.yml告警文件并加入prometheus配置文件中,请根据以下信息仿照模板编写:
1)内存大于50%报警规则,告警级别:warning。
2)cpu资源利用率大于75%报警规则,告警级别:warning。
3)主机磁盘每秒读取数据>50MB%报警规则,告警级别:warning。
4)节点服务异常报警规则,告警级别:critical
在monitor节点重启prometheus服务和alertmanager服务,验证结果正确后将cat /usr/local/prometheus/node_rules.yml && cat /usr/local/prometheus/prometheus.yml | grep - && curl -L http://localhost:9090/api/v1/rules?type=alert | sed s/\"//g命令的返回结果提交到答题框。
(3.5 分)