云计算
快来分享你的内容吧~
- 2023-11-06·后端
一带一路暨金砖国家技能赛 - 云计算赛项样题
## 一带一路暨金砖国家技能赛 - 云计算赛项样题 2023-04-01 --- ## 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 分】 ```plain hostnamectl set-hostname --static controller hostnamectl set-hostname --static compute ``` #### 2. 配置 hosts 文件 分别在 controller 节点和 compute 节点 修改 hosts 文件将 IP 地址映射为主机名。 请在 controller 节点将 cat /etc/hosts 命令的返回结果提交到答题框。 【0.5 分】 ```plain 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 分】 ```plain 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 分】 ```plain 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 分】 ```plain 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 分】 ```plain 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 分】 ```plain 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 分】 ```plain 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 分】 ```plain 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 ``` ```plain source /etc/xiandian/openrc.sh echo $INTERFACE_NAME ens33 ``` #### 2. 修改脚本文件 在 compute 节点配置 /etc/xiandian/openrc.sh 文件 ,根据环境情况修改参数,块存储服务的后端使用第二块硬盘的第一个分区,生效该参数文件 。 请将 `echo $INTERFACE_IP && echo $BLOCK_DISK` 命令的返回结果提交到答题框。【0.5 分】 ```plain echo $INTERFACE_IP && echo $BLOCK_DISK 192.168.100.200 vdb1 ``` #### 3. 安装 openstack 包 分别在 controller 节点和 compute 节点执行 iaas-pre-host.sh 文件 (不需要重启云主机)。 在 controller 节点请将 `openstack --version` 命令的返回结果提交到答题框。【 1 分】 ```plain iaas-pre-host.sh openstack --version ``` #### 4. 搭建数据库组件 在 controller 节点执行 iaas-install-mysql.sh 脚本, 会自行安装 mariadb 、 memcached 、rabbitmq 等服务和完成相关配置。执行完成后修改配置文件将缓存 CACHESIZE 修改为 128, 并重启相应服务 。 请将 `ps aux|grep memcached` 命令的返回结果提交到答题框。【 1 分】 ```plain 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 分】 ```plain iaas-install-keystone.sh source /etc/keystone/admin-openrc.sh openstack user create --email tom@example.com --password tompassword123 --domain demo tom ``` ```plain 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 分】 ```plain iaas-install-glance.sh openstack image create --container-format bare --disk-format qcow2 --file cirros-0.3.0-x86_64-disk.img cirros ``` ```plain 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** ```plain iaas-install-nova-controller.sh nova flavor-create t 5 2048 10 2 ``` **compute** ```plain iaas-install-nova-compute.sh ``` ```plain 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** ```plain 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** ```plain iaas-install-neutron-compute.sh ``` ```plain 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 分】 ```plain 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 分】 ```plain 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 分】 ```plain openstack project create shop --description "Hello shop" --domain demo openstack project set shop --disable --domain demo ``` ```plain 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 分】 ```plain nova quota-class-update --instances 13 admin ``` ```plain 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 分】 ```plain 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 ``` ```plain 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 分】 ```plain 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** ```plain iaas-install-cinder-controller.sh openstack volume type create lvm openstack volume create --type lvm --size 1 lvm_test ``` **compute** ```plain iaas-install-cinder-compute.sh ``` ```plain 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 分】 ```plain 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 分】 ```plain 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 分】 ```plain openstack volume create test --type lvm --size 5 cinder list ``` ```plain 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 分】 ```plain 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** ```plain iaas-install-swift-controller.sh swift post file ``` **compute** ```plain iaas-install-swift-compute.sh ``` ```plain > 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 分】 ```plain 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 分】 ```plain 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 ``` ```plain 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 分】 ```plain 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` ```plain $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` ```plain 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** ```plain 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** ```plain 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 分】 ```plain 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 分】 ```plain 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** ```plain 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** ```plain 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** ```plain cat >> /etc/chrony.conf <<EOF server master iburst EOF chronyc sources ``` #### 7. 设置免密登录 为四台服务器设置免密登录 ,保证服务器之间能够互相免密登录。 在 master 节点将 `ssh node1` 命令的返回结果提交到答题框。【 2 分】 **master** ```plain 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** ```plain yum install docker-ce -y systemctl enable docker --now docker version ``` #### 2. 安装 docker 应用 所有节点配置阿里云镜像加速地址 `https://5twf62k1.mirror.aliyuncs.com` 并把启动引擎设置为 systemd ,配置成功重启 docker 服务。 请将 json 文件中 的内容提交到答题框。【 1 分】 **ALL** ```plain 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 分】 ```plain 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** ```plain 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** ```plain 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 分】 ```plain 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 分】 ```plain 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** ```plain 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** ```plain 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 分】 ```plain 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** ```plain 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 分】 ```plain 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 分】 ```plain 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 ``` ```plain # 获取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 分】 ```plain # 上方已包含了该操作 kubectl get nodes ``` ### 任务 3 EFK 日志平台构建 15 分 #### 1. 导入镜像 将提供的 efk-img.tar.gz 压缩包中的镜像导入到 master 节点,并使用命令将镜像上传至 haboor 镜像仓库中。 在 master 节点将 `docker images | grep elasticsearch` 命令的返回结果 提交到答题框。 【 1 分】 ```plain docker images | grep elasticsearch ``` #### 2.NFS 配置 在 master 节点、 node1 节点、 node2 节点分别安装 nfs 服务, master 节点作为服务端,把 /data/volume1 目录作为共享目录,只允许 192.168.100 网段访问。 在 master 节点,将 `showmount -e` 命令的返回结果提交到 答题框。【 1 分】 ```plain 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` ```plain --- apiVersion: v1 kind: ServiceAccount metadata: name: nfs-provisioner namespace: kube-logging ``` ```plain 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 分】 ```plain --- 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 ``` ```plain 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` ```plain --- 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 ``` ```plain 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` ```plain --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: storage-test provisioner: nfs-provisioner ``` `pvc.yaml` ```plain apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: storage-test ``` ```plain 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` ```plain 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 ``` ```plain 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` ```plain apiVersion: v1 kind: Namespace metadata: name: kube-logging ``` `es-svc.yaml` ```plain 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` ```plain 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 ``` ```plain 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` ```plain 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 ``` ```plain 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** ```plain hostnamectl set-hostname --static ansible yum install -y epel-release yum install -y ansible ansible --version ``` **host** ```plain hostnamectl set-hostname --static host1 hostnamectl set-hostname --static host2 ``` **ALL** ```plain 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 分】 ```plain ssh-keygen ssh-copy-id root@host1 ssh-copy-id root@host2 mkdir ansible cd ansible/ # >>> ansible all -m "ping" ``` `ansible.cfg` ```plain [defaults] inventory = ./inventory remote_user = root ask_pass = false ``` `inventory` ```plain [mysql] host1 host2 [mysql1] host1 [mysql2] host2 ``` ```plain 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** ```plain ansible-playbook Install.yaml ``` `Install.yaml` ```plain --- - 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** ```plain systemctl status mariadb ``` (4)编写一名称为 mariadb.sh 的 shell 脚本,该脚本具有完成 mariadb 数据库的初始化功能,要求数据库 (用户名为 root, 密码为 123456),通过 ansible 对应模块执行 mariadb.sh 完成对 mysql 主机组下的所有节点进行数据库初始化。 在 host1 节点,将 `mysql -uroot -p123456` 命令的返回结果提交到答题框 。【 1 分】 `mariadb.sh` ```plain #! /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` ```plain --- - name: 'Configure mariadb' hosts: mysql tasks: - name: Install mariadb script: mariadb.sh ``` **host1** ```plain mysql -uroot -p123456 ``` (5)创建主机变量,所有主机组中 host1 节点创建变量 id=20,host2 节点创建变量 id=30 。 将 `cat /root/ansible/inventory | grep id` 命令的返回结果提交到答题框。【 1 分】 `Attached /etc/ansible/hosts` ```plain cat >> inventory <<EOF host1 id="20" host2 id="30" EOF ``` ```plain 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` ```plain [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` ```plain --- - 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" ``` ```plain # 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` ```plain [zookeeper] ansible zk_id=150 host1 zk_id=160 host2 zk_id=170 ``` ```plain 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` ```plain 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` ```plain --- - 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" ``` ```plain 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 ```plain 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` ```plain <?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` ```plain <!--在配置文件的最后部分,修改数据库为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` ```plain # 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 ``` ```plain # 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` ```plain <?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` ```plain <!--最后部分--> <user name="root"> <property name="password">123456</property> <property name="schemas">gpmall</property> <!--将USERDB改成gpmall--> </user> ``` `redis` ```plain # 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` ```plain 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` ```plain 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` ```plain [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 ``` ```plain 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 分】 ```plain 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 ``` ```plain [client] user=user password=123456 ``` `Attached prometheus.yml` ```plain - 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"] ```
几分钟时间带你了解一下云计算
# 几分钟时间带你了解一下云计算 --- 云计算”这个名词相信大家一定不是很陌生了,可以说每个人多多少少都会听过云计算这个名词,更别说我们这些日常与计算机打交道的码农们了,那我现在问你一个问题,什么是云计算,以及它有什么东西,相信这个时候,各位程序员们已经开始汗流浃背了吧【手动狗头】,再既然这样,我也不调侃你们了,今天这篇文章,我们就来简单介绍一下云计算。 ## 1. 什么是云计算? 第一个问题我们就来剖析一下,什么是云计算,如果你要了解什么是云计算,你首先就要了解一件事情,**什么是云**?只要理解了这个问题,接下里的部分就很简单了。 ### 什么是云? 首先我们来想一想云为什么会产生,这个原因很简单,其出现肯定是为了方便企业的开发,提高开发效率的。那为什么企业不自己搭建呢,这就到点上了,因为企业自己搭建服务器的耗费非常得大,这个时候,就有人想到了,“**既然我们自己搭建的成本很大,那么我们能不能通过租用的方式呢?**”,我们就把自己的数据以及计算服务全都放在供应商提供的远端服务器上。这不就可以了。事实证明,这个点是可行的,然后这种**远端提供的基础设施就是我们所说的“云”**。 “云”上面的资源在用户看来,其是一个可以拓展的,并且可以随时获取的,且可以实现**按需使用,随时扩展**。根据自己的需要进行选择使用,然后进行付费。 ### 什么是云计算? 在理解了“云”的概念之后之后,云计算就很容易理解了,所谓云计算,就是**将****计算服务与数据存储服务作为一种商品进行售卖或者租赁,购买后可以在云端提供服务。** 有了云计算之后,无论是企业还是个人,如果想要搭建自己的网站或者软件平台,都不需要自己搭建服务器,可以直接通过租用企业的云服务器的方式,调用云端的计算资源,直接实现平台的搭建。这种方式不需要你搭建服务器,只需要根据你的需要进行服务器资源的购买就可以了,这样的话,就大大提高了工作的效率,而且如果自己搭建服务器的话,服务器的维护是需要成本的,这种方式还可以减低开发成本。 ## 2. 云计算有什么特点? 上面说完了什么是云计算,接下来就简单说一下,云计算有什么特点? - **虚拟化技术** 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以更好的应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理组态所限制。 一般需要进行虚拟化的资源正是云计算中的计算能力和存储服务。在云计算的应用中,主要包含硬件虚拟化、平台虚拟化、应用程序虚拟化等。 - **动态可扩展** 云计算具有高效的运算能力,在原有服务器基础上增加云计算功能能够使计算速度迅速提高,最终实现动态扩展虚拟化的层次达到对应用进行扩展的目的。 - **按需部署** 计算机包含了许多应用、程序软件等,不同的应用对应的数据资源库不同,云计算平台能够根据用户的需求快速配备计算能力及资源。 - **高灵活性** 目前市场上大多数IT资源、软、硬件都支持虚拟化,比如存储网络、操作系统和开发软、硬件等。虚拟化要素统一放在云系统资源虚拟池当中进行管理,可见云计算的兼容性非常强,不仅可以兼容低配置机器、不同厂商的硬件产品,还能够外设获得更高性能计算。 - **高可靠性** 倘若服务器故障也不影响计算与应用的正常运行。因为单点服务器出现故障可以通过虚拟化技术将分布在不同物理服务器上面的应用进行恢复或利用动态扩展功能部署新的服务器进行计算。 - **高性价比** 用户可以利用应用软件的快速部署条件来更为简单快捷的将自身所需的已有业务以及新业务进行扩展。 - **可拓展性** 虽然都是使用云计算,但是不同的用户需要的服务是不一样的,有些公司可能只需要租借服务器、有些公司可能需要整套服务,而有些个人客户可能希望直接可以通过付费得到一个网站等。 所以,根据服务类型的不同,云计算可以分为三类,即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。这3种云计算服务有时称为云计算堆栈,因为它们构建堆栈,它们位于彼此之上。
云起实验室
阿里云官方免费的沙箱实验室,包含ecs、k8s、数据库、elasticsearch、大数据等多种免费的沙箱环境和云资源。免费使用,把资源开开以后跟着实验的教程一步一步去操作就OK了。 地址:https://developer.aliyun.com/adc/
曙光互联
致力于国内外云服务,为中小型站长提供服务 地址:https://www.idcbook.com
《第一本 Docker 书》
提取码:asdf 地址:https://pan.baidu.com/share/init?surl=zUkLwiC8Y9rQ-1RXSO19Kg
《每天 5 分钟玩转 Docker 容器技术》
提起码:asdf 地址:https://pan.baidu.com/share/init?surl=T8RLPz-OK1wAvnuVJwNuzA
吾亿云
吾亿云,企业级高可用云服务器,域名,IDC,服务器产业链优质供应商,吾亿云 51云,五亿云,5亿云,云服务器,大宽带服务器,游戏服务器,企业服务器,便宜服务器,阿里服务器,腾讯服务器,,国内服务器,香港服务器 地址:https://www.51ids.com/
MinIO
MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。 MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。 MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。 在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品。 地址:https://min.io
移动云0元上云活动
地址:https://ecloud.10086.cn/home/market/freeCloud
腾讯软件源
腾讯软件源是腾讯云推出的开源镜像,此开源镜像的目的在于宣传自由软件的价值,提高自由软件社区文化氛围, 推广自由软件在国内应用。 地址:http://mirrors.cloud.tencent.com/
