一带一路暨金砖国家技能赛 - 云计算赛项样题

一带一路暨金砖国家技能赛 - 云计算赛项样题


校验:@zelas2xerath

勘误:leancode@189.cn

A模块题目:OpenStack 平台部署与运维

业务场景:

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

设备 主机名 接口 IP地址
云服务器1 controller eth0
eth1
192.168.100.100/24
192.168.200.100/24
云服务器2 compute eth0
eth1
192.168.100.200/24
192.168.200.200/24

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

1.配置主机名

把controller节点主机名设置为controller, compute节点主机名设置为compute。 分别在controller节点和compute节点将hostname命令的返回结果提交到答题框。【0.5分】

1
2
hostnamectl set-hostname --static controller
hostnamectl set-hostname --static compute

2.配置 hosts 文件

分别在 controller 节点和 compute 节点 修改 hosts 文件将 IP 地址映射为主机名。
请在controller节点将cat /etc/hosts命令的返回结果提交到答题框。 【0.5分】

1
2
3
4
cat >> /etc/hosts <<EOF
192.168.100.100 controller
192.168.100.200 compute
EOF

3.挂载光盘镜像

将提供的 CentOS 7 x86_64 DVD 1804.iso 和 bricsskills_cloud_iaas.iso 光盘镜像 移动到 controller 节点 /root 目录下,然后在 /opt 目录下使用命令创建 centos 目录和 iaas 目录,并将镜像文 件 c entOS 7 x86_64 DVD 1804.iso 挂载到 /centos 目录下,将镜像文件bricsskills_cloud_iaas.iso 挂载到 iaas 目录下。
请在 controller 节点 将 ls /opt/ 命令的返回结果提交到 答题框。【 0.5 分】

1
2
3
mkdir /opt/iaas /opt/centos
mount /dev/sr0 /opt/iaas/
mount /dev/sr1 /opt/centos/

4.配置 controller 节点 yum 源

将 controller 节点原有的 yum 源移动到 /home 目录, 为 controller 节点创建本地 yum 源,yum 源文件名为 local.repo 。
请将 yum list | grep vsftpd 的返回结果提交到答题框。【 0.5 分】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mv /etc/yum.repos.d/* /home/
touch /etc/yum.repo.d/local.repo
cat > /etc/yum.repos.d/local.repo <<EOF
[centos]
name=centos
baseurl=file:///opt/centos
enable=1
gpgcheck=0
[iaas]
name=iaas
enable=1
gpgcheck=0
baseurl=file:///opt/iaas/iaas-repo
EOF
yum clean all
yum makecache
yum repolist
yum list |grep vsftpd

5.搭建 ftp 服务器

在controller 节点上安装 vsftp 服务 , 将 /opt 目录设为共享,并 设置为开机自启动, 然后重启服务生效。

请将 cat /etc/vsftpd/vsftpd.conf |grep /opt 命令的返回结果提交到答题框。【 1 分】

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

6.配置 compute 节点 yum 源

将compute节点原有的yum源移动到/home目录,为compute节点创建ftp源,yum源文件名为ftp.repo,其中ftp服务器为controller节点,配置ftp源时不要写IP地址。

请将yum list | grep xiandian命令的返回结果提交到答题框【1分】

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

7.分区

在compute节点将vdb分为两个区分别为vdb1和vdb2,大小自定义。要求分区格式为gpt,使用mkfs.xfs命令对文件系统格式化。
请将 lsblk -f命令的返回结果提交到答题框【1分】

1
2
3
4
5
6
7
8
parted /dev/vdb
mklabel gpt
mkpart primary 0% 50%
mkpart primary 50% 100%

mkfs.xfs /dev/vdb1
mkfs.xfs /dev/vdb2
lsblk -f

8.系统调优 脏数据回写

Linux 系统内存中会存在脏数据,一般系统默认脏数据占用内存 30 时会回写磁盘,修改系统配置文件,要求将回写磁盘的 大小调整为 60 。在 controller 节点 请将 sysctl p 命令的返回结果提交到答题框。【 1 分】

1
2
echo 'vm.dirty_ratio = 60' >> /etc/sysctl.conf
sysctl -p

任务 2 OpenStack 搭建任务 8 分

1.修改脚本文件

在 controller 节点和 compute 节点分别安装 iaas-xiandian 软件包,修改脚本文件基本变量(脚本文件为 /etc/xiandian/openrc.sh 修改完成后使用命令生效该 脚本文件。

在 controller 节点 请将 echo $INTERFACE_NAME 命令的返回结果提交到答题框。【 0.5 分】

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
HOST_IP=192.168.100.100
HOST_PASS=000000
HOST_NAME=controller
HOST_IP_NODE=192.168.100.200
HOST_PASS_NODE=000000
HOST_NAME_NODE=compute
network_segment_IP=192.168.100.0/24
RABBIT_USER=openstack
RABBIT_PASS=000000
DB_PASS=000000
DOMAIN_NAME=demo
ADMIN_PASS=000000
DEMO_PASS=000000
KEYSTONE_DBPASS=000000
GLANCE_DBPASS=000000
GLANCE_PASS=000000
NOVA_DBPASS=000000
NOVA_PASS=000000
NEUTRON_DBPASS=000000
NEUTRON_PASS=000000
METADATA_SECRET=000000
INTERFACE_IP=192.168.200.100
INTERFACE_NAME=ens33
Physical_NAME=provider
minvlan=101
maxvlan=200
CINDER_DBPASS=000000
CINDER_PASS=000000
BLOCK_DISK=vdb1
SWIFT_PASS=000000
OBJECT_DISK=vdb2
STORAGE_LOCAL_NET_IP=192.168.100.200
HEAT_PASS=000000
ZUN_DBPASS=000000
ZUN_PASS=000000
KURYR_DBPASS=000000
KURYR_PASS=000000
CEILOMETER_DBPASS=000000
CEILOMETER_PASS=000000
AODH_DBPASS=000000
AODH_PASS=000000
BARBICAN_DBPASS=000000
BARBICAN_PASS=000000
1
2
3
source /etc/xiandian/openrc.sh
echo $INTERFACE_NAME
ens33

2.修改脚本文件

在 compute 节点配置 /etc/xiandian/openrc.sh 文件 ,根据环境情况修改参数,块存储服务的后端使用第二块硬盘的第一个分区,生效该参数文件 。

请将echo $INTERFACE_IP && echo $BLOCK_DISK命令的返回结果提交到答题框。【0.5分】

1
2
3
echo $INTERFACE_IP && echo $BLOCK_DISK
192.168.100.200
vdb1

3.安装openstack包

分别在controller节点和compute节点执行iaas-pre-host.sh文件(不需要重启云主机)。

在controller节点请将openstack --version命令的返回结果提交到答题框。【 1 分】

1
2
iaas-pre-host.sh
openstack --version

4.搭建数据库组件

在controller 节点执行 iaas-install-mysql.sh 脚本, 会自行安装 mariadb 、 memcached 、rabbitmq 等服务和完成相关配置。执行完成后修改配置文件将缓存 CACHESIZE 修改为 128,并重启相应服务 。

请将 ps aux|grep memcached 命令的返回结果提交到答题框。【 1 分】

1
2
3
4
iaas-install-mysql.sh
sed -i 's/64/128/g' /etc/sysconfig/memcached
systemctl restart memcached
ps aux|grep memcached

5.搭建认证服务组件

在 controller 节点 执行 iaas-install-keystone.sh 脚本,会自行安装 keystone 服务 和 完成相关配置。使用 openstack 命令, 创建一个名为 tom 的账户,密码为 tompassword123, 邮箱为 tom@example.com

请将 openstack user list 命令的返回结果提交到答题框。【 1 分】

1
2
3
iaas-install-keystone.sh
source /etc/keystone/admin-openrc.sh
openstack user create --email tom@example.com --password tompassword123 --domain demo tom
1
2
3
4
5
6
7
8
 openstack user list
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| 0f024f8839b242dd80534e51fe4bd13f | admin |
| 257f9516cac94ca0a191a27b0e56fa37 | demo |
| 70f3fccf5f164331b6e688b14d1037d7 | tom |
+----------------------------------+-------+

6.搭建镜像服务组件

在 controller 节点 执行 iaas-install-glance.sh 脚本, 会 自行安装 glance 服务和完成相关配置。完成后使用 openstack 命令创建一个名为 cirros 的镜像,镜像文件使用 cirros-0.3.0-x86_64-disk.img 。

请将 openstack image show cirros 命令 的返回结果提交到答题框。【 1 分】

1
2
iaas-install-glance.sh
openstack image create --container-format bare --disk-format qcow2 --file cirros-0.3.0-x86_64-disk.img cirros
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
openstack image show cirros
+------------------+------------------------------------------------------+
| Field | Value |
+------------------+------------------------------------------------------+
| checksum | 50bdc35edb03a38d91b1b071afb20a3c |
| container_format | bare |
| created_at | 2020-04-04T02:13:37Z |
| disk_format | qcow2 |
| file | /v2/images/bab32212-e303-4de3-b0b4-e438665db844/file |
| id | bab32212-e303-4de3-b0b4-e438665db844 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| owner | f4157a956a6840dbb77f22554c4f1e9c |
| protected | False |
| schema | /v2/schemas/image |
| size | 9761280 |
| status | active |
| tags | |
| updated_at | 2020-04-04T02:13:37Z |
| virtual_size | None |
| visibility | shared |
+------------------+------------------------------------------------------+

7.搭建计算服务组件

在 controller 节点执行 iaas-install-nova-controller.sh compute 节点执行 iaas-install-nova-compute.sh ,会自行安装 nova 服务和完成相关配置。使用 nova 命令创建一个名为 t,ID 为 5 ,内存为 2048MB, 磁盘容量为 10GB,vCPU 数量为 2 的云主机类型。

在 controller 节点 请将 nova flavor show t 命令的返回结果提交到答题框。【 1 分】

controller

1
2
iaas-install-nova-controller.sh
nova flavor-create t 5 2048 10 2

compute

1
iaas-install-nova-compute.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nova flavor-show t 
+----------------------------+-------+
| Property | Value |
+----------------------------+-------+
| OS-FLV-DISABLED:disabled | False |
| OS-FLV-EXT-DATA:ephemeral | 0 |
| description | - |
| disk | 10 |
| extra_specs | {} |
| id | 5 |
| name | t |
| os-flavor-access:is_public | True |
| ram | 2048 |
| rxtx_factor | 1.0 |
| swap | |
| vcpus | 2 |
+----------------------------+-------+

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

在 controller 节点执行 iaas-install-neutron-controller.sh,compute 节点执行 iaas-install-neutron-compute.sh ,会自行安装 neutron 服务并完成配置。创建云主机外部网络 ext-net ,子网为 ext-subnet ,云主机浮动 IP 可用网段为 192.168.10.100~192.168.10.200 网关为 192.168.100.1 。

在 controller 节点 请 将 openstack subnet show ext-subnet 命令 的 返回结果提交到答题框。【 1 分】

controller

1
2
3
iaas-install-neutron-controller.sh
openstack network create ext-net --external
openstack subnet create ext-subnet --network ext-net --gateway 192.168.100.1 --subnet-range 192.168.10.0/24 --allocation-pool start=192.168.10.100,end=192.168.10.200

compute

1
iaas-install-neutron-compute.sh 
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
openstack subnet show ext-subnet
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| allocation_pools | 192.168.10.100-192.168.10.200 |
| cidr | 192.168.10.0/24 |
| created_at | 2020-04-04T02:30:16Z |
| description | |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 192.168.100.1 |
| host_routes | |
| id | a82d808b-7cf7-430e-8573-5ced16c62f5f |
| ip_version | 4 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| name | ext-subnet |
| network_id | 625fe270-669f-449e-af14-dadeef733b9e |
| project_id | f4157a956a6840dbb77f22554c4f1e9c |
| revision_number | 0 |
| segment_id | None |
| service_types | |
| subnetpool_id | None |
| tags | |
| updated_at | 2020-04-04T02:30:16Z |
+-------------------+--------------------------------------+

9.搭建形化界面

在 controller 节点执行 iaas-install-dashboard.sh 脚本, 会自行安装 dashboard 服务并完成配置。请修改 nova 配置文件,使之能通过公网 IP 访问 dashboard 首页。

在 controller 节点 请将 curl http://EIP/dashboard -L 命令 的返回结果提交到答题框。【 1 分】

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

任务 3 OpenStack 运维任务( 13 分)

某公司构建了一套内部私有云系统,这套私有云系统将为公司内部提供计算服务。你将

作为该私有云的维护人员,请完成以下运维工作。

1.安全组管理

使用命令创建名称为 group_web 的安全组该安全组的描述为 Custom security group 用 openstack 命令为安全组添加 icmp 规则和 ssh 规则 允许任意 ip 地址访问 web 完成后查看该安全组的详细信息

将 openstack security group show group_web 命令 的 返回结果提交到答题框。【 1 分】

1
2
3
4
openstack security group create group_web --description "Custom security group"
openstack security group rule create --protocol icmp --ingress group_web
openstack security group rule create --ingress --protocol tcp --dst-port 22:22 group_web
openstack security group show group_web

2.项目管理

在 keystone 中创建 shop 项目添加描述为 “Hello shop” ,完成后使用 openstack 命令禁用该项目 。

请将 openstack project show shop 命令的返回结果提交到答题框。【 1 分】

1
2
openstack project create shop --description "Hello shop" --domain demo
openstack project set shop --disable --domain demo
1
2
3
4
5
6
7
8
9
10
11
12
13
openstack project show shop
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Hello shop |
| domain_id | 000a54d41fc046499b0d8b181974c54d |
| enabled | False |
| id | edc71a9e411c4feea307699b4b9b1e41 |
| is_domain | False |
| name | shop |
| parent_id | 000a54d41fc046499b0d8b181974c54d |
| tags | [] |
+-------------+----------------------------------+

3.用户管理

使用 nova 命令查看 admin 租户的当前配额值,将 admin 租户的实例配额提升到 13 。

请将 nova quota-class show admin 命令的返回结果提交到答题框。【 1 分】

1
nova quota-class-update --instances 13 admin
1
2
3
4
5
6
7
8
9
10
11
12
nova quota-class-show admin
+----------------------+-------+
| Quota | Limit |
+----------------------+-------+
| instances | 13 |
| cores | 20 |
| ram | 51200 |
| metadata_items | 128 |
| key_pairs | 100 |
| server_groups | 10 |
| server_group_members | 10 |
+----------------------+-------+

4.镜像管理

登录 controller 节点 ,使用 glance 相关命令上传镜像,源使用 CentOS_7.5_x86_64_XD.qcow2 ,名字为 centos7.5 ,修改这个镜像为共享状态并设置最小磁盘 为 5G 。

请将 glance image-list 命令的返回结果提交到答题框。【 1 分】

1
glance image-create --name centos7.5 --disk-format qcow2 --container-format bare --min-disk 5 --progress < /opt/iaas/images/CentOS_7.5_x86_64_XD.qcow2
1
2
3
4
5
6
7
glance image-list
+--------------------------------------+-----------+
| ID | Name |
+--------------------------------------+-----------+
| c0e2026e-acc7-4bf3-9c46-6223fefb299c | centos7.5 |
| bab32212-e303-4de3-b0b4-e438665db844 | cirros |
+--------------------------------------+-----------+

5.后端配置文件管理

请修改 glance 后端配置文件, 将项目的映像存储限制为 10GB 完成后重启 glance 服务。

请将 cat /etc/glance/glance-api.conf |grep user_storage 命令的返回结果提交到答题框。【 1分】

1
2
3
sed -i 's/#user_storage_quota=/user_storage_quota=10737418240/g' /etc/glance/glance-api.conf
systemctl restart *glance*
cat /etc/glance/glance-api.conf |grep user_storage

6.存储服务管理

在 controller 节点执行 iaas-install-cinder-controller.sh , compute 节点 执行 iaas-install-cinder-compute.sh ,在 controller 和 compute 节点上会自行安装 cinder 服务并完成配置。 创建一个名为 lvm 的卷类型, 创建该类型规格键值对,要求 lvm 卷类型对应 cinder 后端驱动 lvm 所管理的存储资源名字 lvm_test ,大小 1G 的云硬盘并查询该云硬盘的详细信息。

请将 cinder show lvm_test命令的返回结果提交到答题框。【1分】

controller

1
2
3
iaas-install-cinder-controller.sh
openstack volume type create lvm
openstack volume create --type lvm --size 1 lvm_test

compute

1
iaas-install-cinder-compute.sh
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
cinder show lvm_test
+--------------------------------+--------------------------------------+
| Property | Value |
+--------------------------------+--------------------------------------+
| attached_servers | [] |
| attachment_ids | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2020-04-04T05:29:27.000000 |
| description | None |
| encrypted | False |
| id | 34b82874-b96e-47de-8aa6-b94a653dbe44 |
| metadata | |
| migration_status | None |
| multiattach | False |
| name | lvm_test |
| os-vol-host-attr:host | None |
| os-vol-mig-status-attr:migstat | None |
| os-vol-mig-status-attr:name_id | None |
| os-vol-tenant-attr:tenant_id | f4157a956a6840dbb77f22554c4f1e9c |
| replication_status | None |
| size | 1 |
| snapshot_id | None |
| source_volid | None |
| status | error |
| updated_at | 2020-04-04T05:29:27.000000 |
| user_id | 0f024f8839b242dd80534e51fe4bd13f |
| volume_type | lvm |
+--------------------------------+--------------------------------------+

7.数据库管理

请使用数据库命令将所有数据库进行备份备份文件名为 openstack. sql ,完成后使用命令查看文件属性其中文件大小以 mb 显示。

请将 du -h openstack.sql命令的返回结果提交到答题框。【1分】

1
2
mysqldump -uroot -p000000 --opt  --all-databases > openstack.sql
du -h openstack.sql

8.数据库管理

进入数据库,创建本地用户 examuser ,密码为 000000 ,然后查询 mysql 数据库中的 user 表的 user,host,password 字段。 然后赋予这个用户所有数据库的查询删除更新创建的权限。
请将 select user,host,password from user; 命令的返回结果提 交到答题框【 1 分】

1
2
3
4
insert into mysql.user(host,user,password) values("localhost","examuser",password("000000"));
use mysql;
grant select,delete,update,create on *.* to examuser@'localhost' identified by '000000';
select host,user,password from user;

9.存储管理

请使用 openstack 命令创建一个名为 test 的 cinder 卷,卷大小为 5G 。完成后使用 cinder 命令列出卷列表并查看 test 卷的详细信息。

请将 cinder list 命令的返回结果提交到答题框。【 1 分】

1
2
openstack volume create test --type lvm --size 5 
cinder list
1
2
3
4
5
6
7
cinder list
+--------------------------------------+--------+----------+------+-------------+----------+-------------+
| ID | Status | Name | Size | Volume Type | Bootable | Attached to |
+--------------------------------------+--------+----------+------+-------------+----------+-------------+
| 34b82874-b96e-47de-8aa6-b94a653dbe44 | error | lvm_test | 1 | lvm | false | |
| e06df5d4-5510-4855-8b84-95ef7a39fcbe | error | test | 5 | lvm | false | |
+--------------------------------------+--------+----------+------+-------------+----------+-------------+

10.存储管理

为了减缓来自实例的数据访问速度的变慢, OpenStack Block Storage 支持对卷数据复制带宽的速率限制。 请修改 cinder 后端配置文件将卷复制带宽限制为最高 100 MiB/s 。
请将 cat /etc/cinder/cinder.conf |grep volume_copy 命令的返回结果提交到答题框。【 1 分】

1
2
3
sed -i 's/#volume_copy_bps_limit = 0/volume_copy_bps_limit = 104857600/g' /etc/cinder/cinder.conf
systemctl restart *cinder*
cat /etc/cinder/cinder.conf |grep volume_copy

11.存储管理

在 controller 节点执行 iaas-install-swift-controller.sh, compute 节点执行 iaas-install-swift-compute.sh,在 controller 和 compute 节点上会自行安装 swift 服务并完成配置。创建一个名为 file 的容器。

请将 swift stat file 命令的返回结果提交到答题框【1分】

controller

1
2
iaas-install-swift-controller.sh
swift post file

compute

1
iaas-install-swift-compute.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> swift stat file
Account: AUTH_f4157a956a6840dbb77f22554c4f1e9c
Container: file
Objects: 0
Bytes: 0
Read ACL:
Write ACL:
Sync To:
Sync Key:
Accept-Ranges: bytes
X-Storage-Policy: Policy-0
Last-Modified: Tue, 04 Apr 2020 06:01:01 GMT
X-Timestamp: 1680588060.62390
X-Trans-Id: txd95c541987884cfbbaafc-00642bbd29
Content-Type: application/json; charset=utf-8
X-Openstack-Request-Id: txd95c541987884cfbbaafc-00642bbd29

12.存储管理

用 swift命令,把 cirros-0.3.4-x86_64-disk.img上传到 file容器中。 请将 swift list file 命令 的返回 结果提交到答题框【 1 分】

1
2
swift upload file cirros-0.3.4-x86_64-disk.img
swift list file

13.添加控制节点资源到云平台

修改 openrc.sh中的内容,然后在 controller 节点执行 iaas-install-nova-compute.sh,把 controller 节点的资源添加到云平台。

请将 openstack compute service list 命令 的返回 结果提交到答题框【 1 分】

1
2
3
4
5
vim /etc/xiandian-iaas/openrc.sh
HOST_NAME_NODE=controller
HOST_IP_NODE=172.17.2.10
source /etc/xiandian-iaas/openrc.sh
iaas-install-nova-compute.sh
1
2
3
4
5
6
7
8
9
10
openstack compute service list
+----+------------------+------------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+------------------+------------+----------+---------+-------+----------------------------+
| 1 | nova-scheduler | controller | internal | enabled | up | 2020-04-04T06:07:51.000000 |
| 2 | nova-consoleauth | controller | internal | enabled | up | 2020-04-04T06:07:51.000000 |
| 3 | nova-conductor | controller | internal | enabled | up | 2020-04-04T06:07:49.000000 |
| 7 | nova-compute | compute | nova | enabled | up | 2020-04-04T06:07:47.000000 |
| 8 | nova-compute | controller | nova | enabled | up | 2020-04-04T06:07:51.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+

任务四 OpenStack 架构 任务 3 分

公司内部拥有一套私有云系统,为了调试该私有云,需要编写一些测试用脚本进行功能性测试,作为公司私有云维护人员请你完成以下工作。

1.创建浮动IP

请使用 openstack 命令创建一个浮动 IP 地址,完成后使用 openstack 命令查看该浮动 IP 的 id ,请编写一个名为 floating_show.sh 的脚本,该脚本 $1 变量为浮动 ip 的 id ,对接 neutron 服务端点获取该浮动 IP 的详细信息。脚本使用 curl 向 api 端点传递参数,为了兼容性考虑不得出现 openstack 命令。

请将 floating_show.sh 中 部分替换为正 常内容并 提交到答题框【 1.5 分】

1
2
3
4
5
6
7
8
9
10
openstack floating ip create ext-net
openstack floating ip show <ip>
# 获取 token
curl -v -s -X POST $OS_AUTH_URL/auth/tokens?nocatalog -H "Content-Type: application/json" -d '{ "auth": { "identity": { "methods": ["password"],"password": {"user": {"domain": {"name": "'"$OS_USER_DOMAIN_NAME"'"},"name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'"} } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name": "'"$OS_PROJECT_NAME"'" } } }}' \
| python -m json.tool
# 将 token 应用到环境变量
export OS_TOKEN=<X-Subject-Token:>
# 获取该浮动 ip 的 id
neutron floatingip-list
neatron floatingip-show <ip>

floating_show.sh

1
2
$1 = 15991162-9175-4aa7-a0ea-d2be78e755cb
curl -g -i -X GET http://controller:9696/v2.0/floatingips/$1 -H "User-Agent: python-neutronclient" -H "Accept: application/json" -H "X-Auth-Token: $OS_TOKEN"

2.删除浮动IP

请编写脚本 floating_delete.sh ,完成浮动 IP 的删除。设置一个 $1 变量,当用户向 $1 传递一个浮动 IP 的 id ,即可完成该浮动 IP 的删除。脚本使用 curl 向 api 端点传递参数,为了兼容性考虑不得出现 openstack 命令。

请将 floating_show.sh中*部分替换为正常内容并提交到答题框【1.5分】

floating_delete.sh

1
2
echo $1
curl -g -i -X DELETE http://controller:9696/v2.0/floatingips/$1 -H "User-Agent: python-neutronclient" -H "Accept: application/json" -H "X-Auth-Token: $OS_TOKEN"

B模块题目:容器的编排与运维

某企业计划使用 k8s 平台搭建微服务系统,现在先使用简单的微服务项目进行测试,请按照要求完成相应任务。

设备名称 主机名 接口 IP 地址
云服务器1 master eth0 私网IP: 192.168.100.*./24
云服务器2 node1 eth0 私网IP: 192.168.100.*./24
云服务器3 node2 eth0 私网IP: 192.168.100.*./24
云服务器4 harbor eth0 私网IP: 192.168.100.*./24

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

1.容器云平台的初始化

master 节点主机名设置为 master 、 node1 节点 主机名设置为 node1 、 node2 节点 主机名设置为 node2 、 harbor 节点 主机名设置为 harbor, 所有节点关闭 swap ,并配置 hosts 映射。

请在 master 节点将free –m 命令的返回结果提交到答题框。【1分】

ALL

1
2
3
4
5
6
7
8
9
10
11
12
hostnamectl set-hostname --static master 
hostnamectl set-hostname --static node1
hostnamectl set-hostname --static node2
hostnamectl set-hostname --static harbor
swapoff -a
cat >> /etc/hosts <<EOF
192.168.100.110 master
192.168.100.120 node1
192.168.100.130 node2
192.168.100.140 harbor
EOF
free -m

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

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

请在 master 节点 将 df -h 命令 的返回结果提交到答题框。【 1 分】

master

1
2
3
4
5
6
mkdir /opt/centos /opt/paas
cat >> /etc/rc.local <<EOF
mount -o /root/CentOS-7-x86_64-DVD-1804.iso /opt/centos
mount -o /root/chinaskills_cloud_paas.iso /opt/paas
EOF
df -h

3.Yum 源的编写

在 master 节点首先将系统自带的 yum 源移动到 /home 目录,然后 为 master 节点配置本地 yum 源, yum 源文件名为 local.repo 。
请将 yum list | grep docker命令的返回结果提交到答题框。【1分】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mv /etc/yum.repos.d/* /home
cat > /etc/yum.repos.d/local.repo <<EOF
[centos]
name=centos
baseurl=file:///opt/centos
enable=1
gpgcheck=0
[k8s]
name=k8s
baseurl=file:///opt/paas/kubernetes-repo/
enable=1
gpgcheck=0
EOF
yum clean all
yum makecache
yum repolist
yum list | grep docker

4.Yum 源的编写

在 master 节点安装 ftp 服务,将 ftp 共享 目录设置为 /opt 。

请将 curl -l ftp://IP 命令的返回结果提交到答题框。【1分】

1
2
3
4
5
6
7
8
yum install -y vsftpd 
cat >> /etc/vsftpd/vsftpd.conf <<EOF
anon_root=/opt
EOF
systemctl enable vsftpd --now
systemctl disable firewalld --now
setenforce 0
curl -l ftp://192.168.100.110

5.Yum 源的编写

为 node1 节点和 node2 节点分别配置 ftp 源 yum 源文件名称为 ftp.repo 其中 ftp 服务器地址为 master 节点 配置 ftp 源时不要写 IP 地址,配置之后,两台机器都安装 kubectl 包作为安装测试。

在 node1节点请将 yum list | grep kubectl命令的返回结果提交到答题框。【2分】

node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mv /etc/yum.repos.d/* /media
cat > /etc/yum.repos.d/ftp.repo <<EOF
[centos]
name=centos
baseurl=ftp://master/centos
enable=1
gpgcheck=0
[k8s]
name=k8s
baseurl=ftp://master/paas/kubernetes-repo/
enable=1
gpgcheck=0
EOF
yum clean all
yum makecache
yum repolist
yum list | grep kubectl
yum install -y kubectl

6.设时间同步服务器

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

在 node1 节点将 chronyc sources 命令的返回结果提交到答题框。【 2 分】

master

1
2
3
4
5
6
7
yum install -y chrony 
cat >> /etc/chrony.conf <<EOF
server master iburst
allow 192.168.100.0/24
local stratum 10
EOF
systemctl enable chronyd --now

node & harbor

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

7.设置免密登录

为四台服务器设置免密登录 ,保证服务器之间能够互相免密登录。

在 master 节点将 ssh node1 命令的返回结果提交到答题框。【 2 分】

master

1
2
3
4
5
ssh-keygen
ssh-copy-id root@node1
ssh-copy-id root@node2
ssh-copy-id root@harbor
ssh node1

任务 2 k8s 搭建任务 15 分

1.安装 docker 应用

在所有节点上安装 dokcer-ce, 并设置为开机自启动。

在 master 节点 请将 docker version 命令的返回结果提交到答题框。【 1 分】

ALL

1
2
3
yum install docker-ce -y
systemctl enable docker --now
docker version

2.安装 docker 应用

所有节点配置阿里云镜像加速地址 https://5twf62k1.mirror.aliyuncs.com 并把启动引擎设置为 systemd ,配置成功重启 docker 服务。

请将 json 文件中 的内容提交到答题框。【 1 分】

ALL

1
2
3
4
5
6
7
8
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors":["https://5twf62k1.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker

3.安装 docker compose

在 Harbor 节点创建目录 /opt/paas 并把 bricsskills_cloud_paas.iso ,挂载到 /opt/paas 目录下,使用 /opt/paas/docker-compose/v1.25.5-docker-compose-Linux-x86_64 文件安装 docker compose 。安装完成后 执行 docker compose version 命令。

请将 docker compose version 命令返回结果提交到答题框。【 1 分】

1
2
3
4
mkdir /opt/paas
mount -o bricsskills_cloud_paas.iso /opt/paas
cp /opt/paas/docker-compose/v1.25.5-docker-compose-Linux-x86_64 /usr/bin/docker-compose
docker-compose version

4.搭建 horbor 仓库

在 Harbor 节点使用 /opt/paas/harbor/harbor-offline-installer-v2.1.0.tgz 离线安装包,安装 harbor 仓库,并修改各节点默认 docker 仓库为 harbor 仓库地址 。

在 master 节点请将 docker login harbor private ip 命令 的返回结果提交到答题框。【1分】

harbor

1
2
3
4
5
6
7
cp /opt/paas/harbor/harbor-offline-installer-v2.1.0.tgz .
tar -zxvf /opt/paas/harbor/harbor-offline-installer-v2.1.0.tgz
cd harbor
mv harbor.yml.tmpl harbor.yml
vim harbor.yml
# 修改第5行域名;注释 https 及证书部分,修改密码(13/15/18)
./install.sh

ALL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
modprobe br_netfilter
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
sysctl -p
cat > /etc/docker/daemon.json <<EOF
{
"insecure-registries": ["192.168.100.140"],
"registry-mirrors":["https://5twf62k1.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker login 192.168.100.140

5.上传 docker 镜像

在 master 节点使用命令将 /opt/paas/images 目录下所有镜像导入本地 。 然后使用 /opt/paas/k8s_image_push.sh 将所有镜像上传至 docker 仓库 。

在 master 节点 请将 docker images | grep wordpress 命令的返回结果提交到答题框。【 1 分】

1
2
3
4
5
cd /opt/paas/images 
for i in `ls`;do docker image load -i $i;done;
cd ..
./k8s_image_push.sh
docker images | grep wordpress

6.安装 kubeadm 工具

在 master 节点、node1 节点、node2 节点分别安装 Kubeadm 工具 并设置 为 开机自启动 。

在 master 节点 请将 kubeadm version 命令的返回结果提交到答题框。【 1 分】

1
2
3
yum install kubeadm -y 
systemctl enable kubelet --now
kubeadm version

7.初始化 master 节点

使用 kubeadm 命令生成 yaml 文件,并修改 yaml 文件 ,设置 kubernetes 虚拟内部网段地址为 10.244.0.0/16 通过该 yaml 文件初始化 master 节点 然后使用 kube-flannel.yaml 完成控制节点初始化设置。
在 master 节点的 kube-flannel.yaml 执行前 将 kubectl get nodes 命令的返回结果提交到答题框。【 1 分】

master

1
2
3
4
5
6
7
kubeadm init --kubernetes-version=1.18.1 --apiserver-advertise-address=192.168.100.110 --image-repository 192.168.100.140/library --pod-network-cidr=10.244.0.0/16
# >>>
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get pod -n kube-system -owide
kubectl get nodes

node

1
2
kubeadm join 192.168.100.110:6443 --token l616jt.p5w90k5l0ggzvb0a \
--discovery-token-ca-cert-hash sha256:a06d174657ac8c4a46e9a5e18608712a94308741fa0f448e015afe4e14f09820

8.删除污点

使用命令删除 master 节点的污点,使得 Pod 也可以调度到 master 节点上。

在 master 节点 请将 kubectl get nodes -o yaml master | grep -A10 spec 命令的返回结果提交到答题框。【 1 分】

1
2
kubectl taint nodes master node-role.kubernetes.io/master-
kubectl get nodes -o yaml master | grep -A10 spec

9.安装 kubernetes 网络插件

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

在 master 节点请将 kubectl get nodes 命令的返回结果提交到答题框。【1分】

master

1
2
3
sed -i "s/quay.io\/coreos/192.168.100.140\/library/g" /opt/paas/yaml/flannel/kube-flannel.yaml
kubectl apply -f /opt/paas/yaml/flannel/kube-flannel.yaml
kubectl get nodes

10.给 kubernetes 创建证书

在 master节点请将 kubectl get csr命令的返回结果提交到答题框。【2分】

1
2
3
4
5
6
mkdir dashboard-certs
cd dashboard-certs/

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

11.kubernetes 图形化界面的安装

使用 recommended.yaml 和 dashboard-adminuser.yaml 安装 kubernetes dashboard 界面,完成后查看首页 。

请将 kubectl get pod,svc -n kubernetes dashboard 命令的返回结果提交到答题框。【 2 分】

1
2
3
4
5
6
kubectl create namespace kubernetes-dashboard
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
sed -i "s/kubernetesui/192.168.100.140\/library/g" /opt/paas/yaml/dashboard/recommended.yaml
kubectl apply -f /opt/paas/yaml/dashboard/recommended.yaml
kubectl apply -f /opt/paas/yaml/dashboard/dashboard-adminuser.yaml
kubectl get pod,svc -n kubernetes-dashboard
1
2
3
# 获取token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
# 在 Web Browser 中登录

12.扩展计算节点

在 node1 节点和 node2 节点分别 使用 kubeadm config 命令生成 yaml 文件,并通过 yaml文件 将 node 节点加入 kubernetes 集群。完成后在 master 节点上查看所有节点状态。

在 master 节点请将 kubectl get nodes 命令的返回结果提交到答题框。【2分】

1
2
# 上方已包含了该操作
kubectl get nodes

任务 3 EFK 日志平台构建 15 分

1.导入镜像

将提供的 efk-img.tar.gz 压缩包中的镜像导入到 master 节点,并使用命令将镜像上传至 haboor 镜像仓库中。

在 master 节点将 docker images | grep elasticsearch 命令的返回结果 提交到答题框。 【 1 分】

1
docker images | grep elasticsearch

2.NFS 配置

在 master 节点、 node1 节点、 node2 节点分别安装 nfs 服务, master 节点作为服务端,把 /data/volume1 目录作为共享目录,只允许 192.168.100 网段访问。

在master 节点,将 showmount -e 命令的返回结果提交到 答题框。【 1 分】

1
2
3
4
5
6
7
8
yum install -y nfs-utils
cat > /etc/exports <<EOF
/data/volume1 192.168.100.0/24(rw,sync,no_subtree_check,no_root_squash)
EOF
systemctl enable rpc-bind.service nfs
systemctl restart rpc-bind.service nfs
exportfs -rv
showmount -e

3.RBAC 配置

在 master 节点,编写 sa.yaml ,创建名称为 nfs-provisioner 的 SA 账号。

kubectl get serviceaccounts -n kube-logging命令的返回结果提交到答题框。【1分】

sa.yaml

1
2
3
4
5
6
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: kube-logging
1
2
kubectl apply -f sa.yaml
kubectl get serviceaccounts -n kube-logging

4.RBAC 配置

编写 rbac.yaml ,对创建的 sa 账号进行 RBAC 授权,基于 yaml 文件创建完成后使用命令分别查看 sa 账号和 rbac 授权信息。

kubectl get roles.rbac.authorization.k8s.io 命令的返回结果提交到答题框 。【 1 分】

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
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-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: ["get","list","watch","create","update","patch"]

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

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: leader-locking-nfs-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-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: kube-logging

roleRef:
kind: Role
name: leader-locking-nfs-provisioner
apiGroup: rbac.authorization.k8s.io
1
2
kubectl apply -f rbac.yaml
kubectl get roles.rbac.authorization.k8s.io

5.StorageClass动态绑定

编写 nfs-deploy.yaml 文件,基于 nfs-client-provisioner 镜像创建 nfs-provisioner 的 deployment 对象 ,绑定 nfs 服务端的共享目录。

kubectl get pods 命令的返回结果提交到答题框。 【 1 分】

nfs-deploy.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: apps/v1
kind: Deployment
metadata:
name: nfs-provisioner
namespace: kube-logging
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-provisioner
template:
metadata:
labels:
app: nfs-provisioner
spec:
serviceAccountName: nfs-provisioner
containers:
- name: nfs-provisioner
image: 192.168.100.140/library/nfs-client-provisioner
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-provisioner
- name: NFS_SERVER
value: 192.168.100.110
- name: NFS_PATH
value: /data/volume1
volumes:
- name: nfs-root
nfs:
server: 192.168.100.110
path: /data/volume1
1
2
kubectl apply -f nfs-deploy.yaml
kubectl get pods

6.StorageClass动态绑定

编写 storageclass.yaml 文件,创建 storageclass 动态绑定 nfs-provisioner ,完成后查看 nfs-provisioner 的 pod 及 storageclasses 对象。

kubectl get storageclasses.storage.k8s.io 命令的返回结果提交到答题框 。【 2 分】

storageclass.yaml

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

pvc.yaml

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
kubectl apply -f storageclass.yaml
kubectl apply -f pvc.yaml
kubectl get storageclasses.storage.k8s.io

7.通过 statefulset 创建 elasticsearch 集群

编写 es-statefulset.yaml ,通过 yaml 文件构建 elasticsearch 的 statefulset 集群, 集群中有 3 个副本名字分别为 es-cluster-0 、 es-cluster-1 、 es-cluster-2 ,并且使用上述 storageclass 提供的存储,使用 elasticsearch:7.2.0 镜像 ,并且声明 9200 端口为 api 端口, 9300 端口为内部访问端口,并且添加 busybox 的初始化容器对 elasticsearch 的数据目录 /usr/share/elasticsearch/data 进行授权操作。

kubectl get pods 命令的返回结果提交到 答题框。 【 2 分】

es-statefulset.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es-cluster
namespace: kube-logging
spec:
serviceName: elasticsearch
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: elasticsearch:7.2.0
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 1000m
requests:
cpu: 100m
ports:
- containerPort: 9200
name: rest
protocol: TCP
- containerPort: 9300
name: inter-node
protocol: TCP
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
env:
- name: cluster.name
value: k8s-logs
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: discovery.seed_hosts
value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
- name: cluster.initial_master_nodes
value: "es-cluster-0,es-cluster-1,es-cluster-2"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx512m"
initContainers:
- name: fix-permissions
image: busybox
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
securityContext:
privileged: true
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
- name: increase-vm-max-map
image: busybox
imagePullPolicy: IfNotPresent
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: busybox
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
volumeClaimTemplates:
- metadata:
name: data
labels:
app: elasticsearch
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: managed-nfs-storage
resources:
requests:
storage: 10Gi
1
2
3
kubectl apply -f es-statefulset.yaml
kubectl get po,svc -n kube-logging
kubectl get pods

8.创建 headless service

编写es-svc.yaml 文件,为 elasticsearch 的 pod 创建一个 headless service ,并在 service中声明 9200 和 9300 端口 。

kubectl get svc 命令的返回结果提交到 答题框。【 2 分】

es-ns.yaml

1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
name: kube-logging

es-svc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: kube-logging
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node

9.Kibana 可视化 UI 界面部署

编写 kibana.yaml ,通过该文件创建 deployment 和 service ,其中 deployment 基于kibana:7.2.0 镜像创建并通过环境变量 ELASTICSEARCH_URL 指定 elasticsearch 服务地址;service 代理 kibana 的 pod 服务,并且使用 NodePort 类型。创建成功后在浏览器访问 Kibana的 UI 界面。

kubectl get svc 命令的返回结果提交到答题框 。【 2 分】

kibana.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
apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: kube-logging
labels:
app: kibana
spec:
type: NodePort
ports:
- port: 5601
selector:
app: kibana

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: kube-logging
labels:
app: kibana
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:7.2.0
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 1000m
requests:
cpu: 100m
env:
- name: ELASTICSEARCH_URL
value: http://elasticsearch:9200
ports:
- containerPort: 5601
1
2
3
kubectl apply -f kibana.yaml
kubectl get pod,svc -n kube-logging
kubectl get svc

10.Fluentd 组件部署

编写 fluentd.yaml ,通过 yaml 文件创建 DaemonSet 控制器部署 fluentd 服务,并在该文件中同时编写相关的 sa 账号和 rbac 内容,创建成功后保证可以正确采集容器内的日志。

kubectl get pods 命令的返回结果 提交到答题框。【 2 分】

fluentd.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluentd
namespace: kube-logging
labels:
app: fluentd

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: fluentd
labels:
app: fluentd
rules:
- apiGroups:
- ""
resources:
- pods
- namespaces
verbs:
- get
- list
- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd
roleRef:
kind: ClusterRole
name: fluentd
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: fluentd
namespace: kube-logging

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-logging
labels:
app: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
serviceAccount: fluentd
serviceAccountName: fluentd
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
imagePullPolicy: IfNotPresent
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.kube-logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: FLUENT_ELASTICSEARCH_SCHEME
value: "http"
- name: FLUENTD_SYSTEMD_CONF
value: disable
resources:
limits:
memory: 512Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
1
2
kubectl apply -f fluentd.yaml
kubectl get pods

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

虚拟机与环境规划

设备名称 主机名 接口 IP 地址
云服务器1 ansible eth0 私网IP: 192.168.100.150./24
云服务器2 host1 eth0 私网IP: 192.168.100.160./24
云服务器3 host2 eth0 私网IP: 192.168.100.170./24

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

1.部署主从数据库

(1)修改主机名 ansible 节点主机名为 ansible,host1 节点主机名为 host1,host2 节点主机名为 host2, 请使用提供的软件包在 ansible 节点安装 ansible 。

ansible --version 命令 的返回结果提交到答题框 。【 1 分】

ansible

1
2
3
4
hostnamectl set-hostname --static ansible 
yum install -y epel-release
yum install -y ansible
ansible --version

host

1
2
hostnamectl set-hostname --static host1
hostnamectl set-hostname --static host2

ALL

1
2
3
4
5
6
7
setenforce 0
systemctl disable firewalld --now
cat >> /etc/hosts <<EOF
192.168.100.150 ansible
192.168.100.160 host1
192.168.100.170 host2
EOF

(2)配置主机清单文件,创建 mysql 主机组, mysql 主机组内添加 host1 和 host2 主机,创建 mysql1 主机组 mysql1 组内添加 host1 主机,创建 mysql2 主机组 mysql2 组内添加 host2主机,并配置免密登录。

ansible all -m "ping" 命令的返回结果 提交到答题框。【 1 分】

1
2
3
4
5
6
7
ssh-keygen
ssh-copy-id root@host1
ssh-copy-id root@host2
mkdir ansible
cd ansible/
# >>>
ansible all -m "ping"

ansible.cfg

1
2
3
4
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false

inventory

1
2
3
4
5
6
7
[mysql]
host1
host2
[mysql1]
host1
[mysql2]
host2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ansible all -m "ping"
host1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
host2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}

(3) mysql 主机组内所有主机安装 mariadb 数据库,启动数据库并设置为开机自启动。

在 host1 节点 将 systemctl status mariadb 命令的返回结果提交到答题框。【 1 分】

ansible

1
ansible-playbook Install.yaml

Install.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
- name: 'Configure mariadb'
hosts: mysql
vars:
- svc: mariadb
tasks:
- name: Install mariadb
yum:
name:
- "{{ item }}"
state: latest
with_items:
- mariadb
- mariadb-server
- name: chk service
service:
name: "{{ svc }}"
state: started
enabled: true

host1

1
systemctl status mariadb

(4)编写一名称为 mariadb.sh 的 shell 脚本,该脚本具有完成 mariadb 数据库的初始化功能,要求数据库(用户名为 root, 密码为 123456),通过 ansible 对应模块执行 mariadb.sh 完成对 mysql 主机组下的所有节点进行数据库初始化。

在 host1 节点,将 mysql -uroot -p123456 命令的返回结果提交到答题框 。【 1 分】

mariadb.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /usr/bin/expect

spawn mysql_secure_installation
expect "none"
send "\n"
expect "Y/n"
send "y\n"
expect "password:"
send "123456\n"
expect "password:"
send "123456\n"
expect "Y/n"
send "n\n"
expect "Y/n"
send "n\n"
expect "Y/n"
send "n\n"
expect "Y/n"
send "y\n"
expect off

Init.yaml

1
2
3
4
5
6
---
- name: 'Configure mariadb'
hosts: mysql
tasks:
- name: Install mariadb
script: mariadb.sh

host1

1
mysql -uroot -p123456

(5)创建主机变量,所有主机组中 host1 节点创建变量 id=20,host2 节点创建变量 id=30 。

cat /root/ansible/inventory | grep id 命令的返回结果提交到答题框。【 1 分】

Attached /etc/ansible/hosts

1
2
3
4
cat >> inventory <<EOF
host1 id="20"
host2 id="30"
EOF
1
cat /root/ansible/inventory | grep id

(6)根据 mysql 配置文件创建 mysql 的 Janja2 模板文件命名为 my.cnf.j2, 编写 mariadb.yaml 文件实现主从数据库的配置和权限设置。

在 ansible 节点通过 cat mariadb.yaml 命令查看文件内容返回结果提交到答题框, 在 host2节点进入数据库 将 show slave status\G 命令的返回结果提交到答题框。【 1 分】

my.cnf.j2

1
2
3
4
5
6
7
8
9
10
11
12
13
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0skip-grant-tables
server_id={{ id }}

{% if ansible_ens32.ipv4.address == master_host %}
log-bin= ON
{% endif %}

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

mariadb.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
---
- name: 'Setup mariadb'
hosts: mysql
vars:
- login_user: root
login_passwd: 123456
master_host: "192.168.100.160"
slave: "192.168.100.170"
mysql_path: /usr/local/mysql/bin/
basedir_name: /usr/bin/

tasks:
- name: deploy template
template:
src: my.cnf.j2
dest: /etc/my.cnf

- name: Setup user root
shell: chdir={{ basedir_name }} ./mysql -u{{ login_user }} -p{{ login_passwd }} -e 'grant all privileges on *.* to "root"@"%" identified by "123456"'
- name: Setup user
shell: chdir={{ basedir_name }} ./mysql -u{{ login_user }} -p{{ login_passwd }} -e 'grant replication slave on *.* to "user"@"%" identified by "123456"'
notify:
- flush_privileges
- restart db_svc
when: ansible_ens32.ipv4.address == "{{ master_host }}"

- name: Setup Slave mariadb
shell: chdir={{ basedir_name }} ./mysql -u{{ login_user }} -p{{ login_passwd }} -e 'change master to master_host="host1",master_user="user",master_password="123456"'
when: ansible_ens32.ipv4.address == "{{ slave }}"
notify:
- flush_privileges
- restart db_svc

handlers:
- name: restart db_svc
service:
name: mariadb
state: restarted
- name: flush_privileges
shell: chdir={{ basedir_name }} ./mysql -u{{ login_user }} -p{{ login_passwd }} -e "flush privileges"
1
2
3
4
5
6
7
# ansible
ansible-playbook mariadb.yaml
# >>> host2
mysql -uroot -p123456
start slave;
show slave status\G;
# Slave_IO_Running 和 Slave_SQL_Running的状态都为 YES,则从节点服务开启成功

2.部署 zookeeper 集群

zookeeper 是一个分布式服务框架,是 Apache Hadoop 的一个子项目,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 gpmall 商城系统中用到了 kafka 消息队列, kafka 集群的搭建依赖 zookeeper 集群来进行元数据的管理。

(1)编写主机清单文件,创建 zookeeper 主机组, zookeeper 主机组内添加 ansible 、 host1和 host2 主机 ,分别创建主机变量 zk_id。

ansible all -a "id" 命令的返回结果提交到答题框。【 2 分】

Attached inventory

1
2
3
4
[zookeeper]
ansible zk_id=150
host1 zk_id=160
host2 zk_id=170
1
ansible all -a "id"

(2)在 ansible 节点, 使用提供的 zookeeper-3.4.14.tar.gz 软件包, 编写 zookeeper.yaml 文件实现 zookeeper 集群搭建,创建任务清单实现 zookeeper 安装包批量解压、通过 Janja2 模板文件配置 zookeeper 、创建 zookeeper 的 myid 文件和批量启动 zookeeper 功能。

在三个节点相应的目录使用 ./zkServer.sh status 命令查看三个 Zookeeper 节点的状态。

在 ansible 主机上将 cat zookeeper.yaml 命令结果提交到答题框, 将 jps 命令的返回结果提交到答题框 。【 2 分】

zoo.cfg.j2

1
2
3
4
5
6
7
8
9
10
tickTime=2000
initLimit=10
syncLimit=5
dataDir={{ zookeeper_data_dir }}
dataLogDir={{ zookeeper_log_dir }}
clientPort=2181
maxClientCnxns=60
server.150=192.168.100.150:2888:3888
server.160=192.168.100.160:2888:3888
server.170=192.168.100.170:2888:3888

zookeeper.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
---
- name: 'Setup mariadb'
hosts: zookeeper
vars:
- zookeeper_version: zookeeper-3.4.14
zookeeper_data_dir: /data/zookeeper/data
zookeeper_log_dir: /data/zookeeper/logs
var_dir: /data/zookeeper/
source_dir: /root/
myid: /data/zookeeper/data/myid

tasks:
- name: deal depends
yum:
name: "{{ item }}"
state: present
with_items:
- java-1.8.0-openjdk
- java-1.8.0-openjdk-devel
- name: Create zookeeper data directory
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ var_dir }}"
- "{{ zookeeper_log_dir }}"
- "{{ zookeeper_data_dir }}"

- name: Copy file
copy:
src: "{{ zookeeper_version }}.tar.gz"
dest: "{{ source_dir }}"
- name: unarchive
shell: "tar -zxvf /root/{{ zookeeper_version }}.tar.gz"
- name: copy file
shell: "mv /root/{{ zookeeper_version }}/* {{ var_dir }}"

- name: deploy j2
template:
src: zoo.cfg.j2
dest: "{{ var_dir }}/conf/zoo.cfg"

- name: touch myid
file:
path: "{{ myid }}"
state: touch
- name: write myid
lineinfile:
dest: "{{ myid }}"
line: "{{ zk_id }}"
state: present

- name: start zookeeper svc
shell: "{{ var_dir }}/bin/zkServer.sh start"
1
2
3
4
ansible-playbook zookeeper.yaml
# >>> all
cd /data/zookeeper/bin/
./zkServer.sh status

任务 2 应用商城系统部署 【 10 分】

1.gpmall 部署

在 ansible 节点,使用提供的 gpmall-cluster 软件包,完成集群应用系统部署。部署完成后,进行登录,最后使用 curl 命令去获取商城首页的返回信息,先将 netstat -ntpl 命令的返回结果提交到答题框,然后 将 curl -l http://EIP:80 命令的返回结果提交到答题框。 【 10 分】

mycat On ansible

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
cp /opt/ChinaskillMall/Mycat-server-1.6-RELEASE-20161028204710-linux.gz /usr/local/
cd /usr/local/
tar -zvxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
chown -R 777 /usr/local/mycat/
echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
source /etc/profile
cd /usr/local/mycat/conf/
chown root:root schema.xml
# >>>
/bin/bash /usr/local/mycat/bin/mycat start
yum install -y MariaDB-client
ss -ntlp |grep 8066

mysql -h127.0.0.1 -P8066 -uroot -p123456

show databases;
use USERDB
show tables;
select * from company;
insert into company values(2,"bastetball","usa");
select * from company;
quit

ss -ntlp |grep 9066
mysql -h127.0.0.1 -P9066 -uroot -p123456 -e 'show @@datasource;'

Changed /usr/local/mycat/conf/schema.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100"
dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql"
dbDriver="native" writeType="0" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.100.160:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.100.170:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>

Changed /usr/local/mycat/conf/server.xml

1
2
3
4
5
6
7
8
9
10
<!--在配置文件的最后部分,修改数据库为USERDB-->
<user name="root">
<property name="password">123456</property>
<property name="schemas">USERDB</property>
<!--然后删除如下几行:-->
<user name="root">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>

Kafka

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
# On all node
mv kafka_2.11-1.1.1.tgz /usr/local/
cd /usr/local/
tar -zxvf kafka_2.11-1.1.1.tgz
cd kafka_2.11-1.1.1/config
sed 's/broker.id=0/#broker.id=0/g' server.properties
sed 's/zookeeper.connect=localhost:2181/#zookeeper.connect=localhost:2181/g' server.properties
# On ansible
cat >> server.properties <<EOF
broker.id=150
zookeeper.connect=192.168.100.150:2181,192.168.100.160:2181,192.168.100.170:2181
listeners = PLAINTEXT://192.168.100.150:9092
EOF
# On host1
cat >> server.properties <<EOF
broker.id=160
zookeeper.connect=192.168.100.150:2181,192.168.100.160:2181,192.168.100.170:2181
listeners = PLAINTEXT://192.168.100.160:9092
EOF
# On host2
cat >> server.properties <<EOF
broker.id=170
zookeeper.connect=192.168.100.150:2181,192.168.100.160:2181,192.168.100.170:2181
listeners = PLAINTEXT://192.168.100.170:9092
EOF
# test on ansible
./kafka-topics.sh --create --zookeeper 192.168.100.150:2181 --replication-factor 1 --partitions 1 --topic test

# test on host1 or host2
./kafka-topics.sh --list --zookeeper 192.168.100.160:2181
./kafka-topics.sh --list --zookeeper 192.168.100.170:2181
1
2
3
4
5
6
7
8
9
10
11
# on ansible
scp /opt/ChinaskillMall/gpmall.sql root@host1:/root/
# on host1
mysql -uroot -p123456
create database gpmall;
use gpmall
source /root/gpmall.sql
quit
# on ansible
# >>>
./mycat restart

Changed /usr/local/mycat/conf/schema.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="gpmall" checkSQLschema="false" sqlMaxLimit="100"
dataNode="dn1"></schema><!--将 schema name 修改为 gpmall-->
<dataNode name="dn1" dataHost="localhost1" database="gpmall" /> <!--database 修改为 gpmall-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql"
dbDriver="native" writeType="0" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="172.16.51.22:3306" user="root" password="123456">
<readHost host="hostS1" url="172.16.51.26:3306" user="root"
password="123456" />
</writeHost>
</dataHost>
</mycat:schema>

Changed /usr/local/mycat/conf/server.xml

1
2
3
4
5
<!--最后部分-->
<user name="root">
<property name="password">123456</property>
<property name="schemas">gpmall</property> <!--将USERDB改成gpmall-->
</user>

redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# on ansible
yum install redis –y
systemctl enable redis --now
scp /opt/ChinaskillMall/*.jar root@host1:/root/
scp /opt/ChinaskillMall/*.jar root@host2:/root/
# on host1 and host2
cat >> /etc/hosts <<EOF
192.168.100.150 redis.mall
192.168.100.150 mysql.mall
192.168.100.150 kafka1.mall
192.168.100.160 kafka2.mall
192.168.100.170 kafka3.mall
192.168.100.150 zk1.mall
192.168.100.160 zk2.mall
192.168.100.170 zk3.mall
EOF

nohup java -jar user-provider-0.0.1-SNAPSHOT.jar &
nohup java -jar shopping-provider-0.0.1-SNAPSHOT.jar &
nohup java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar &
nohup java -jar gpmall-user-0.0.1-SNAPSHOT.jar &
# 查看四个后端服务是否成功启动
ps -aux |grep java

nginx

1
2
3
4
5
6
7
yum install nginx -y
rm -rf /usr/share/nginx/html/*
cp -rvf /opt/ChinaskillMall/dist/* /usr/share/nginx/html/
# >>> Changed conf
systemctl enable nginx --now
ss -ntlp |grep 80
curl -L http://192.168.100.150

Changed /etc/nginx/conf.d/default.conf

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
upstream myuser {          
server 192.168.100.160:8082;
server 192.168.100.170:8082;
ip_hash;
}
upstream myshopping {
server 192.168.100.160:8081;
server 192.168.100.170:8081;
ip_hash;
}
upstream mycashier {
server 192.168.100.160:8083;
server 192.168.100.170:8083;
ip_hash;
}

server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /user {
proxy_pass http://myuser;
}
location /shopping {
proxy_pass http://myshopping;
}
location /cashier {
proxy_pass http://mycashier;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

任务 3 Prometheus 监控 Mariadb 主从数据库【 10 分】

1.Prometheus 及 Grafana 搭建

根据 grafana-enterprise-8.3.6.linux-amd64.tar.gz 、prometheus-2.37.0.linux-amd64.tar.gz 、 node_exporter-1.3.1.linux-amd64.tar.gz 资
源包,安装 prometheus-2.37.0 、 node_exporter 服务并启动,安装 grafana 服务并测试浏览器登陆。

先将 prometheus.service 文件中的内容提交到答题框, 然后 将 curl -L http://EIP:9090 命令的返回结果提交到答题框。【 5 分】

prometheus.service

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

[Service]
Type=simple
User=root
ExecStart=/usr/local/prometheus-2.37.0.linux-amd64/prometheus --config.file=/usr/local/prometheus-2.37.0.linux-amd64/prometheus.yml
Restart=on-failure

[Install]
WantedBy=mutli-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mv grafana-enterprise-8.3.6.linux-amd64.tar.gz
tar -zxvf grafana-enterprise-8.3.6.linux-amd64.tar.gz
yum install -y grafana-enterprise-8.3.6.rpm
mv prometheus-2.37.0.linux-amd64.tar.gz /usr/local
mv node_exporter-1.3.1.linux-amd64.tar.gz /usr/local
cd /usr/local
tar -zxvf prometheus-2.37.0.linux-amd64.tar.gz
tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz
cd node_exporter-1.3.1.linux-amd64/
nohup node_exporter 2>&1 &
# >>>
mv prometheus.service /lib/systemd/system/
systemctl daemon-reload
systemctl enable prometheus --now

ss -ntlp |grep 9090
LISTEN 0 128 :::9090 :::* users:(("prometheus",pid=35383,fd=3))

systemctl enable grafana-server --now
curl -L http://EIP:9090

2.Prometheus 配置自定义监控项、 mysqld_exporter 安装及配置

根据 mysqld_exporter-0.12.1.linux-amd64.tar.gz 安装 mysqld_exporter ,并创建 mysqld_exporter-0.12.1.linux-amd64/my.cnf 文件添加被监控数据库用户名密码,修改 prometheus.yml 文件,添加两个任务: mysql-ansible-slave 、nodes ,抓取间隔都设置 5s 分别监控主从节点的 mysqld_exporter 、 node_exporter 端口,重启 prometheus 并刷新 prometheus 页面。
将 my.cnf 和 prometheus.yml 中的内容提交到答题框。【 5 分】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql -uroot -p000000
use test;
grant replication client,process on *.* to 'user'@localhost identified by '123456';
grant select on *.* to mysql_monitor@localhost;
quit

mv mysqld_exporter-0.12.1.linux-amd64.tar.gz /usr/local/
cd /usr/local/
tar mysqld_exporter-0.12.1.linux-amd64.tar.gz
cd mysqld_exporter-0.12.1.linux-amd64
# >>>
./mysqld_exporter --config.file=my.cnf

sed -i 's/scrape_interval: 15s/scrape_interval: 5s/g' /usr/local/prometheus-2.37.0.linux-amd64/prometheus.yml
systemctl restart prometheus
1
2
3
[client]
user=user
password=123456

Attached prometheus.yml

1
2
3
4
5
6
- job_name: 'mysql-ansible-slave'
static_configs:
- targets: ['192.168.100.170:9104']
- job_name: 'nodes'
static_configs:
- targets: ["192.168.100.160:9100","192.168.100.170:9100"]