openstack运维

openstack 命令自动补全:

openstack complete > /etc/bash_completion.d/openstack && bash

Linux 系统调优

修改脏数据可用内存百分比为60,默认为30

###sysctl -a 显示所有的内核参数
###sysctl -p 加载内核参数配置,永久有效

[root@controller ~]# sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500

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

修改文件句柄数

Linux 服务器大并发时,往往需要预先调优 Linux 参数。默认情况下,Linux 最大文件 句柄数为 1024 个。当你的服务器在大并发达到极限时,就会报出“too many open files”。 创建一台云主机,修改相关配置,将控制节点的最大文件句柄数永久修改为 65535。

###临时生效
[root@controller ~]# ulimit -n 65535

###永久生效
[root@controller ~]# cat >> /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 65535
EOF

防止 SYN 攻击

修改 controller 节点的相关配置文件,开启 SYN cookie,防止 SYN 洪水攻击

###默认的SYN相关配置
[root@controller ~]# sysctl -a | grep _syn
net.ipv4.tcp_max_syn_backlog = 512
net.ipv4.tcp_syn_retries = 6
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syncookies = 1

###参数释义
tcp_max_syn_backlog是SYN队列的长度,加大SYN队列长度可以容纳更多等待连接的网络连接数。 
tcp_syncookies是一个开关,是否打开SYN Cookie 功能,该功能可以防止部分SYN攻击。 
tcp_synack_retries和tcp_syn_retries定义SYN 的重试连接次数,
将默认的参数减小来控制SYN连接次数的尽量少。

###虽然默认是开启的,但是需要把配置添加到如下文件中
[root@controller ~]# echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.conf 

###生效配置
[root@controller ~]# sysctl -p

配置controller节点禁止其他节点可以Ping它

[root@controller ~]# sysctl -a |grep icmp_echo
net.ipv4.icmp_echo_ignore_all = 0

[root@controller ~]# vim /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 1

[root@controller ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1

###验证
[root@controller ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1

内核优化

在使用 Linux 服务器的时候,TCP 协议规定,对于已经建立的连接,网络双方要进行四 次挥手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身 占用的资源不会被释放。因为服务器程序要同时管理大量连接,所以很有必要保证无用的连 接完全断开,否则大量僵死的连接会浪费许多服务器资源。创建一台 CentOS7.9 云主机,修 改相应的配置文件,分别开启 SYN Cookies;允许将 TIME-WAIT sockets 重新用于新的 TCP 连接;开启 TCP 连接中 TIME-WAIT sockets 的快速回收;修改系統默认的 TIMEOUT 时间 为 30。

net.ipv4.tcp_syncookies = 1
###表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYNxxx,
默认为0,表示关闭

net.ipv4.tcp_tw_reuse = 1
###表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1
###表示TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

net.ipv4.tcp_fin_timeout = 30
###表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间

数据库调优

将memcache缓存修改为128

###修改配置文件将缓存CACHESIZE修改为128
[root@controller ~]# vim /etc/sysconfig/memcached
CACHESIZE=128

###重启服务
[root@controller ~]# systemctl restart memcached

修改/etc/my.cnf 文件,完成下列要求:

1.设置数据库支持大小写;

2.设置数据库缓存 innodb 表的索引,数据,插入数据时的缓冲为 4G;

3.设置数据库的 log buffer 为 64MB;

4.设置数据库的 redo log 大小为 256MB;

5.设置数据库的 redo log 文件组为 2。

###可以快速定位参数
[root@controller ~]# mysql -uroot -p000000
MariaDB [(none)]> show variables like 'innodb_log%';

[root@controller ~]# vim /etc/my.cnf
###数据库支持大小写
lower_case_table_names =1
###数据库缓存
innodb_buffer_pool_size = 4G
###数据库的log buffer即redo日志缓冲
innodb_log_buffer_size = 64MB
###设置数据库的redo log即redo日志大小
innodb_log_file_size = 256MB
###数据库的redo log文件组即redo日志的个数配置
innodb_log_files_in_group = 2

###重启服务
[root@controller ~]# systemctl restart mariadb

Keystone 服务

创建一个tom用户 密码为000000 email为admin@123.com

[root@controller ~]# source /etc/keystone/admin-openrch.sh
[root@controller ~]# openstack user create --domain demo --password 000000 \
> --email admin@123.com tom

###查看users
[root@controller ~]# openstack user list

列出一个token

[root@controller ~]# openstack token issue

项目管理

在keystone中创建shop项目添加描述为“hello shop”,完成后使用open stack命令禁用该项目,最后使用openstack命令查看该项目

###创建项目
openstack project create --description "hello shop" --domain demo shop 

###禁用
openstack project set --disable shop

###查看
openstack project show shop

用户管理

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

###查看
nova quota-class-show admin
+----------------------+-------+
| Quota                | Limit |
+----------------------+-------+
| instances            | 10    |
| cores                | 20    |
| ram                  | 51200 |
| metadata_items       | 128   |
| key_pairs            | 100   |
| server_groups        | 10    |
| server_group_members | 10    |
+----------------------+-------+

###修改
nova quota-class-update admin --instances 13

###查看
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    |
+----------------------+-------+

glance镜像服务

将提供 的 cirros-0.3.4-x86_64-disk.img 镜像(该镜像在 HTTP 服务中,可自行下载)上传至平台, 命名为 cirros,并设置最小启动需要的硬盘为 10G,最小启动需要的内存为 1G。

###下载镜像
[root@controller ~]#  curl -O http://10.18.4.100/cirros-0.3.4-x86_64-disk.img
                                or
[root@controller ~]#  wget http://10.18.4.100/cirros-0.3.4-x86_64-disk.img

###创建符合要求的镜像
[root@controller ~]# openstack image create --min-disk 10 --min-ram 1024 \
> --file cirros-0.3.3-x86_64-disk.img cirros

###验证
[root@controller ~]# openstack image list

OpenStack 开放镜像权限

使 用 OpenStack 私 有 云 平 台 , 在 OpenStack 平台的 admin 项 目 中 使 用 cirros-0.3.4-x86_64-disk.img 镜像文件创建名为 glance-cirros 的镜像,通过 OpenStack 命令将 glance-cirros 镜像指定 demo 项目进行共享使用。

[root@controller ~]# openstack image create --shared --project demo \
> --file cirros-0.3.4-x86_64-disk.img glance-cirros

[root@controller ~]# glance member-create [镜像id] [域名id]
[root@controller ~]# glance member-update [镜像id] [域名id] accepted

后端配置文件管理

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

[root@controller ~]# cd /var/lib/glance/image && ls
qemu-img info xxxxxxxx

[root@controller ~]# du -sh /etc/nova/nova.conf

后端配置文件管理

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

bc计算出10G
1024^3*10
10737418240

vim /etc/glance/glance-api.conf (/user_storage)
user_storage_quota = 10737418240

systemctl restart openstack-glance-*

OpenStack Glance 镜像管理

使用自行搭建的 OpenStack 平台。在 HTTP 服务中存在一个镜像为 CentOS7.5-compress.qcow2 的镜像,请使用 qemu 相关命令,对该镜像进行压缩,压缩后的 镜像命名为 chinaskill-js-compress.qcow2 并存放在/root 目录下。

[root@controller ~]# qemu-img convert -c -O qcow2 centos7_33.qcow2 compress_newdisk.qcow2

###解释

-c  压缩

-O qcow2 输出格式为 qcow2

centos7_33.qcow2被压缩文件路径

compress_newdisk.qcow2压缩完成后文件路径

使用qemu-img相关命令,查询Gmirror1镜像的compat版本,然后将Gmirror1镜像的campat版本修改为0.10(该操作是为了适配某些低版本的云平台)

[root@controller ~]# cd /var/lib/glance/images/

###修改campat版本
[root@controller ~]# qemu-img amend -f qcow2 -o compat=0.10 [镜像id]

###查看镜像信息
[root@controller ~]# qemu-img info [镜像id]

某OpenStack云平台有两个租户,A租户与B租户,分别属于两个部门,该公司对镜像的管理比较严格, 镜像都由管理员进行上传和权限管理。通过管理员上传该镜像,并使用相关命令开放镜像权限给A租 户,B租户不可见。

[root@controller ~]# glance member-create 1fa9cbfe-392f-437e-ad18-f00987415b15 \
> df58511d2c914690b48e89f1e512ae6b

###镜像ID 1fa9cbfe-392f-437e-ad18-f00987415b15

###用户A ID df58511d2c914690b48e89f1e512ae6b

[root@openstack ~]# glance member-update 1fa9cbfe-392f-437e-ad18-f00987415b15
df58511d2c914690b48e89f1e512ae6b accepted

改 glance 存储后端

使用赛项提供的 OpenStack 私有云平台,创建一台云主机(镜像使用 CentOS7.5,flavor 使用带临时 磁盘 50G 的),配置该主机为 nfs 的 server 端,将该云主机中的/mnt/test 目录进 行共享(目录不存 在可自行创建)。然后配置 controller 节点为 nfs 的 client 端,要求将/mnt/test 目录作为 glance 后端 存储的挂载目录。配置完成后提交 controller 控制节点的用户名、密码 和 IP 地址到答题框。

###创建一台云主机,创建成功如下

###安装nfs rpcbind软件包
[root@localhost ~]# yum install -y nfs-utils rpcbind
[root@localhost ~]# mkdir /mnt/test

[root@localhost ~]# vim /etc/exports
/mnt/test *(rw)

[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl enable rpcbind
[root@localhost ~]# systemctl start nfs
[A[root@localhost ~]# systemctl enable nfs

[root@localhost ~]# showmount -e 192.168.10.4
Export list for 192.168.10.4:
/mnt/test *

###控制节点操作
[root@controller ~]# mount -t nfs 192.168.10.4:/mnt/test  \
>  /var/lib/glance/images/

[root@controller ~]# chown -R glance:glance /var/lib/glance/

[root@controller ~]# ls -ld /var/lib/glance/
drwxr-xr-x. 3 glance glance 20 Nov 10 10:54 /var/lib/glance/

### mount查看一下效果
[root@controller ~]# mount 
192.168.10.4:/mnt/test on /var/lib/glance/images type nfs4
(rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,po
rt=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.10.130,local_lock=none,a
ddr=192.168.10.4)

glance对接cinder

在自行搭建的 OpenStack平台中修改相关参数,使 glance 可以使用 cinder作为后端存储, 将镜像存储于 cinder 卷中。使用 cirros-0.3.4-x86_64-disk.img 文件创建 cirros-image 镜像存储 于 cirros-cinder 卷中,通过 cirros-image 镜像使用 cinder 卷启动盘的方式进行创建虚拟机。

###修改/etc/glance/glance-api.conf
###为了允许镜像服务使用cinder作为后端存储,在stores=file,http,swift中增加cinder

[root@controller ~]# vim /etc/glance/glance-api.conf
[glance_store]
stores = file,http,swift,cinder
default_store = cinder
filesystem_store_datadir = /var/lib/glance/images/

###为了能够解析locations信息,需要将show_multiple_locations修改为True
 #show_multiple_locations = false
###取消注释改为True

###修改/etc/cinder/cinder.conf

allowed_direct_url_schemes  修改为  cinder
image_upload_use_cinder_backend  设置为  True
image_upload_use_internal_tenant = True

###重启glance cinder 服务
###创建镜像查看locations项是否为cinder

将swift存储作为镜像服务的后端存储

[root@controller ~]# vim /etc/glance/glance-api.conf
[glance_store]
stores = glance.store.swift.Store
default_store = swift
swift_store_region = RegionOne
swift_store_endpoint_type = internalURl
swift_store_container = glance
swift_store_large_object_size = 5120
swift_store_large_object_chunk_size = 200
swift_store_create_contaienr_on_put = True
swift_store_multi_tenant = True
swift_store_admin_tenants = service
swift_store_auth_address = http://container:5000/v3.0/
swift_store_user = glance
swift_store_key = 000000

nova计算服务

使用nova命令创建一个名为t,id为5,内存为2048M,磁盘容量为10GB,vCPU数量为2的云主机类型。

[root@controller ~]# nova flavor-create t 5 2048 10 2   
                        or
[root@controller ~]# openstack flavor create --id 5 --ram 2048 --disk 10 --vcpus 2 t

修改 nova 相关配置文件,解决因等待时间过长而导致虚拟机启动超时从而获取不 到 IP 地址而报错失败的问题。

###查找关键字
[root@controller ~]# cat /etc/nova/nova.conf |grep vif_plugging_is_fatal
vif_plugging_is_fatal=false

###重启
[root@controller ~]# systemctl restart openstack-nova*

OpenStack Nova 清除缓存

在 OpenStack 平台的一台计算节点创建虚拟机,若是第一次在该节点创建次虚拟机,会 先将镜像文件复制到该计算节点目录/var/lib/nova/instances/_base。长期下来,该目录会占用 比较大的磁盘空间而要清理。可以通过修改 nova 的配置文件来自动清理该缓存目录,即在 该节点没有使用某镜像启动的云主机,那么这个镜像在过一定的时间后会被自动删除。

###修改/etc/nova/nova.conf

计算节点
###允许删除不再使用的、旧的image文件,以节省计算节点硬盘空间
remove_unused_base_images = True 

###如无instance使用,则原image文件在1天之后会被删除
remove_unused_original_minimum_age_seconds = 86400 

###如无instance使用,resize过的image文件(cow格式)在1小时之后会被删除
remove_unused_resized_minimum_age_seconds = 3600 

###镜像文件的存储路径,该目录是相对于state_path的路径名
image_cache_subdirectory_name = _base 

###重启nova服务

动态调整云主机类型

[root@controller ~]# vim /etc/nova/nova.conf
allow_resize_to_same_hosts=True
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,
ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,
ServerGroupAffinityFilter

[root@controller ~]# systemctl restart openstack-nova-* libvirtd

云主机保存快照

给云主机做快照并保存在本机 /root/目录下

openstack server image create VM1 --name VM1-image-1
openstack image save --file /root/VM1-image-1.qcow2 VM1-image-1

在openstack私有云平台上,将云主机VM1保存为qcow2格式的快照并保存到controller节 点/root/cloudsave目录下,保存名字为csccvm.qcow2。

[root@controller ~]# mkdir cloudsave
[root@controller ~]# nova image-create VM1 vm1
[root@controller ~]# openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 1cd8a7ee-26d3-4af9-a7d8-15d88cdfa1f5 | cirros | active |
| d672affc-fefb-4af3-b185-96c009193045 | vm1    | active |
+--------------------------------------+--------+--------+

[root@controller ~]# openstack image save vm1 --file
/root/cloudsave/csccvm.qcow2

[root@controller ~]# ll cloudsave/
total 21568
-rw-r--r-- 1 root root 22085632 Aug 8 04:11 csccvm.qcow2

修改云主机内存

使用OpenStack私有云平台,找到virsh中ID为10的云主机(若不存在请自行创建)。在云主机所在的物 理节点,进入virsh交互式界面,使用virsh命令,将memory虚拟机的内存调整为5242880KB大小

[root@controller ~]# openstack server create --image cirros --flavor Fmin --network ext VM2

###计算节点操作
[root@compute ~]# virsh list --all
[root@compute ~]# virsh shutdown instance-00000002

###编辑
[root@compute ~]# virsh edit instance-00000002

[root@compute ~]# virsh start instance-00000002

冷迁移

###拷贝虚拟机到新的计算节点
[root@computer01 ~]# scp -r e866c977-eb01-460e-bf12-5208d54600f5/  \
> 192.168.176.64:/var/lib/nova/instances/

###修改文件属性
[root@computer02 ~]# chown -R nova.nova e866c977-eb01-460e-bf12-5208d54600f5/

###更新数据库
[root@node1 ~]# use nova;
update instances set host='controller', node='controller', launched_on='controller' 
where uuid='c47aea85-6a9b-4d94-b1fd-aac2268c9913';

###启动虚拟机

neutron网络服务

创建外部网络ext-net和子网ext-subnet 创建内网int-net和子网int-subnet,创建路由router-1(并连通内外网)

###创建外部网络
[root@controller ~]# openstack network create --external --enable ext-net
###创建子网
[root@controller ~]# openstack subnet create --network ext-net --subnet-range 192.168.x.0/24 \
> --allocation-pool start=192.168.x.100,end=192.168.x.200 --gateway 192.168.x.1 ext-subnet

###创建内部网络
[root@controller ~]# openstack network create --internal --enable int-net
###创建子网
[root@controller ~]# openstack subnet create --network int-net --subnet-range 10.10.x.0/24 \
> --allocation-pool start=10.10.x.100,end=10.10.x.200 --gateway 10.10.x.1 int-subnet

###创建路由
[root@controller ~]# openstack router create router-1
[root@controller ~]# openstack router add subnet router-1 ext-subnet
[root@controller ~]# openstack router add subnet router-1 int-subnet

安全组管理

创建名为“group_web”的安全组,该安全组描述为“Custom security group”,用openstack命令为安全组添加icmp规则和ssh规则允许任意IP地址访问

###创建安全组
openstack security group create --description "Custom security group" group_web

###添加80访问
openstack security group rule create --ingress --ethertype IPv4 --protocol tcp \
> --dst-port 80:80 group_web

###添加22访问
openstack security group rule create --ingress --ethertype IPv4 --protocol tcp \
> --dst-port 22:22 group_web

###添加icmp规则
openstack security group rule create --ingress --protocol icmp group_web

dashboard服务

修改nova配置文件使之能通过公网IP范文dashboard首页

[root@controller ~]# vim /etc/nova/nova.conf
###修改为master公网IP
novncproxy_base_url=http://123.123.123.123:6080/vnc_auto.html  

###重启服务生效配置
[root@controller ~]# systemctl restart httpd

将 Dashboard 中的 Django 数据修改为存储在文件中

(此种修改解决了 ALL-in-one 快照在其 他云平台 Dashboard 不能访问的问题)

[root@controller ~]# cat /etc/openstack-dashboard/local_settings |grep django
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
###默认存在cache里,改为file
SESSION_ENGINE = 'django.contrib.sessions.backends.file'

###重启服务生效配置
[root@controller ~]# systemctl restart httpd

请使用 curl 指令获取 dashboard 首页信息

[root@controller ~]# curl -i http://192.168.44.10/dashboard

云平台安全策略提升

###下载所需软件
[root@controller ~]# yum isntall -y mod_wsgi mod_ssl

[root@controller ~]# vim /etc/httpd/conf.d/ssl.conf
SSLProtocol all -SSLv2 -SSLv3 删除-SSLv3 (75行)

[root@controller ~]# vim /etc/openstack-dashboard/local_settings
CSRF_COOKIE_SECURE = Ture (49行)
SESSION_COOKIE_SECURE = Ture
USE_SSL = Ture
SESSION_COOKIE_HTTPONLY = Ture

swift服务

使用命令创建一个名叫 examcontainer 的容器,将 cirros-0.3.4-x86_64-disk.img 镜像上传到 examcontainer 容器中,并 设置分段存放,每一段大小为 10M。

[root@controller ~]# openstack container create examcontainer
[root@controller ~]# openstack container list

[root@controller ~]# swift post examcontainer
[root@controller ~]# swift list
###下载镜像
[root@controller ~]# curl -O http://10.18.4.46/cirros-0.3.4-x86_64-disk.img

###swfit切片上传cirros
###-S 上载不大于<size>(字节)的段中的文件,然后创建一个“清单”文件,
该文件将下载所有段,就像它是原始文件一样。
[root@controller ~]# swift upload examcontainer -S 10485760 cirros-0.3.4-x86_64-disk.img
[root@controller ~]# swift stat examcontainer

cinder服务

请在计算节点,对块存储进行扩容操作, 即在计算节点再分出一个 5G 的分区,加入到 cinder 块存储的后端存储中去。

###创建物理卷
[root@compute ~]# pvcreate /dev/vdb4

###扩展cinder-volume卷组
[root@compute ~]# vgextend cinder-volumes /dev/vdb4

###验证
[root@compute ~]# vgdisplay

创建名为lvm的卷类型,创建该类型规格键值对,要求lvm卷类型对应cinder后端驱动lvm所管理的存储资源,名字lvm_test,大小1G的云硬盘并查询该云硬盘的详细信息 并附加到云主机上

[root@controller ~]# cinder type-create lvm
[root@controller ~]# cinder type-key lvm set volume_backend_name=LVM
[root@controller ~]# cinder create --volume-type lvm --name lvm_test 1
[root@controller ~]# openstack server add volume server-1 lvm_test

Manila 服务

创建 default_share_type 共享类型(不使用驱动程序支持),接着创建一个大小为 2G 的共享存储名为 share01 并开放 share01 目录对 OpenStack 管理网段使用权限。

###创建不适用驱动程序支持的default_share_type共享类型
[root@controller ~]# manila type-create default_share_type False

###创建共享卷
[root@controller ~]# manila create NFS 2 --name share01

###开放share01目录对OpenStack管理网段使用权限
[root@controller ~]# manila access-allow share01 ip 10.18.4.0/24 --access-level rw

###验证
[root@controller ~]# manila type-list
[root@controller ~]# manila list

Barbican 服务

使用 openstack 命令创建一个名为 secret01 的密钥

###创建密钥
[root@controller ~]# openstack secret store --name secret01 --payload secretkey

Cloudkitty 服务

启用 hashmap 评级 模块,接着创建 volume_thresholds 组,创建服务匹配规则 volume.size,并设置每 GB 的价 格为 0.01。接下来对应大量数据设置应用折扣,在组 volume_thresholds 中创建阈值,设置 若超过 50GB 的阈值,应用 2%的折扣(0.98)。

###启用hashmap
[root@controller ~]# openstack rating module enable hashmap 

###创建hashmap service
[root@controller ~]# openstack rating hashmap service create volume.size 
+-------------+--------------------------------------+
| Name        | Service ID                           |
+-------------+--------------------------------------+
| volume.size | 09da4a8b-b849-4715-a8e3-7cd12dfcf46e |
+-------------+--------------------------------------+

###创建hashmap service group
[root@controller ~]# openstack rating hashmap group create volume_thresholds 
openstack rating hashmap group create volume_thresholds 
+-------------------+--------------------------------------+
| Name              | Group ID                             |
+-------------------+--------------------------------------+
| volume_thresholds | 8b3dfe73-5efb-46ab-a93b-dc9519063ed6 |
+-------------------+--------------------------------------+

###创建volume单价
[root@controller ~]# openstack rating hashmap mapping create \
> -s 09da4a8b-b849-4715-a8e3-7cd12dfcf46e -g 8b3dfe73-5efb-46ab-a93b-dc9519063ed6 \
> -t flat 0.01 

###创建service rule
[root@controller ~]# openstack rating hashmap threshold create \
> -s 09da4a8b-b849-4715-a8e3-7cd12dfcf46e -g 8b3dfe73-5efb-46ab-a93b-dc9519063ed6 \
> -t rate 50 0.98

OpenStack 平台内存优化

搭建完 OpenStack 平台后,关闭系统的内存共享,打开透明大页。

###关闭系统的内存共享
[root@controller ~]# echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag

###验证
[root@controller ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

OpenStack 消息队列调优

OpenStack 各服务内部通信都是通过 RPC 来交互,各 agent 都需要去连接 RabbitMQ; 随着各服务 agent 增多,MQ 的连接数会随之增多,最终可能会到达上限,成为瓶颈。使用 自行搭建的OpenStack私有云平台,分别通过用户级别、系统级别、配置文件来设置RabbitMQ 服务的最大连接数为 10240。

### 1)用户级别的配置
###limits.conf 用于对用户资源进行限制,如进程数/文件数等等
[root@controller ~]# vim /etc/security/limits.conf 
* soft nofile 10240
* hard nofile 10240

###退出登陆以下 才可以生效
[root@controller ~]# logout


###检验是否生效
[root@controller ~]# ulimit -n #检验配置是否生效
10240

### 2)系统级别的配置
###系统级别主要配置 sysctl.conf 这个文件
[root@controller ~]# vi /etc/sysctl.conf
fs.file-max=10240

[root@controller ~]# sysctl -p #执行这个生效
fs.file-max = 10240

###配置RabbitMQ的配置文件
[root@controller ~]# vim /usr/lib/systemd/system/rabbitmq-server.service
###在service模块下添加即可
LimitNOFILE=10240

###重启服务生效
[root@controller ~]# systemctl restart rabbitmq-server 

###检验命令
[root@controller ~]# rabbitmqctl status
[{total_limit,10140}, ###返回这个表示成功了
    {total_used,9},
    {sockets_limit,9124},
    {sockets_used,7}]},

kvm调优

在自行搭建的 OpenStack 私有云平台或赛项提供的 all-in-one 平台上,修改相关配置文 件,启用-device virtio-net-pci in kvm

[root@controller ~]# vim /etc/nova/nova.conf
[libvirt]
libvirt_use_virtio_for_bridges=true

[root@controller ~]# systemctl restart openstack-nova*

OpenStack Heat 运维

###列出heat版本
[root@controller bin]# openstack orchestration template version list
heat_template_version.2018-03-02 | hot | 
heat_template_version.queens

###列出资源类型
[root@controller bin]# openstack orchestration resource type list

###资源详细属性格式
[root@controller bin]# openstack orchestration resource type \
> show OS::Nova::Flavor | grep -vE "^   "  ###四个空格

创建container(容器)

在自行搭建的 OpenStack 私 有 云 平 台 上 , 在 /root 目录下编写 Heat 模 板 create_container.yaml,要求执行 yaml 文件可以创建名为 heat-swift 的容器。

[root@controller ~]# cat create_container.yaml 
heat_template_version: 2014-10-16
resources:
  container:
    type: OS::Swift::Container
    properties:
      name: heat-swift

创建flavor(云主机类型)

heat_template_version: 2014-10-16
description: create flavor
resources:
  flavor:
    type: OS::Nova::Flavor
    properties:
      name: m1.flavor
      flavorid: 1234
      ram: 1024
      disk: 20
      vcpus: 1

创建net(网络)

heat_template_version: 2014-10-16
description: Generated template
resources:
  network_1:
    type: OS::Neutron::Net
    properties:
      admin_state_up: true
      name: Heat-Network
      shared: false
  subnet_1:
    type: OS::Neutron::Subnet
    properties:
      allocation_pools:
      - end: 10.20.2.100
        start: 10.20.2.10
      cidr: 10.20.2.0/24
      enable_dhcp: true
      host_routes: []
      ip_version: 4
      name: Heat-Subnet
      network_id:
        get_resource: network_1

创建user(用户)

heat_template_version: 2014-10-16
description: create user
resources:
  users:
    type: OS::Keystone::User
    properties:
      name: heat-user
      default_project: admin
      domain: demo
      password: 123456
      roles: [{"role":admin,"project":admin}]

创建image(镜像)

heat_template_version: queens
description: create image
resources:
  images:
    type: OS::Glance::Image
    properties:
      name: test
      min_disk: 20 #题目应该会有要求
      min_ram: 2048
      disk_format: qcow2
      container_format: bare
      location: http://192.168.100.10/cirros-0.5.1-x86_64-disk.img #题目应该会给出一个url链接

创建server(云主机)

heat_template_version: queens
description: create server
resources:
  servers:
    type: OS::Nova::Server
    properties:
      name: vm1
      image: cirros
      flavor: test
      networks: [{"uuid":d546239c-53f1-4a6f-a116-872727a04d86}]

创建cinder(卷)

heat_template_version: queens
description: create cinder
resources:
  cinder:
    type: OS::Cinder::Volume
    properties:
      name: cinder1
      volume_type: lvm
      size: 10

python程序对接openstack api

openstack image create  *** --debug ###调用整个创建过程
再找到POST 和data行找到地址和创建内容

难写死了,建议用python软件写好,再复制进去

安装python3

1、yum install -y python3
2、pip3 install certifi-2019.11.28-py2.py3-none-any.whl 
3、pip3 install urllib3-1.25.11-py3-none-any.whl 
4、pip3 install idna-2.8-py2.py3-none-any.whl 
5、pip3 install chardet-3.0.4-py2.py3-none-any.whl
6、pip3 install requests-2.24.0-py2.py3-none-any.whl

创建flavor(云主机类型)

import requests
import json
osurl = "http://192.168.100.10"
body={
  "auth":{
    "identity":{
      "methods":["password"],
      "password":{
        "user":{
          "id":"d618c8ee2d234997889b62ee18562ee0",
          "password":"000000"
        }
      }
    },
    "scope":{
      "project":{
        "id":"5e7709cbbd7c4c0e8733c3f7360d1d38"
      }
    }
  }
}
headers = {}
def get_token():
  url = osurl+":5000/v3/auth/tokens"
  re = requests.post(url,headers=headers,data=json.dumps(body)).headers["X-Subject-Token"]
  return re
def flavor_create():
  url = osurl+":8774/v2.1/flavors"
  headers["X-Auth-Token"] = get_token()
  body = {
    "flavor":{
      "name": "centos7",
      "id": 302,
      "vcpus": 2,
      "ram": 2048,
      "disk": 40,
    }
  }
  re = requests.post(url,data=json.dumps(body),headers=headers).json()
  print(re)
  return re
flavor_create()

创建server(云主机)

import requests
import json
osurl = "http://192.168.100.10"
body={
  "auth":{
    "identity":{
      "methods":["password"],
      "password":{
        "user":{
        "id":"d618c8ee2d234997889b62ee18562ee0",
        "password":"000000"
        }
      }
    },
    "scope":{
      "project":{
        "id":"5e7709cbbd7c4c0e8733c3f7360d1d38"
      }
    }
  }
}
headers = {}
def get_token():
  url = osurl+":5000/v3/auth/tokens"
  re = requests.post(url,headers=headers,data=json.dumps(body)).headers["X-Subject-Token"]
  return re
def server_create():
  url = osurl+"::8774/v2.1/servers"
  headers["X-Auth-Token"] = get_token()
  body={
    "server":{
      "name": "psysewe",
      "imageRef": "sdi3jnbf-nce8sm3slfk-cm8w3",
      "flavorRef": "sduifwj8-dnuvwi8-dnde83",
      "networks": [{"uuid": "bssiksju-sjejr3-sqksjj"}]
    }
  }
  re = requests.post(url,headers=headers,json=body).json()
  print(re)
  return re
server_create()

创建user(用户)

def create_user():
  url = osurl+":35357/v3/users"
  headers["X-Auth-Token"] = get_tokens()
  body={
    "user":{
      "name": "centos7",
      "domain_id": "c71306cc8e9b40c093e6961d18ff85c6",
      "password": "000000"
    }
  }
  re = requests.post(url,headers=headers,json=body).json()
  print(re)
  return re
create_user()

创建project(项目)

def create_project():
  url = osurl+":35357/v3/projects"
  headers["X-Auth-Token"] = get_tokens()
  body={
    "project":{
      "name": "centos7",
      "domain_id": "c71306cc8e9b40c093e6961d18ff85c6"
    }
  }
  re = requests.post(url,headers=headers,json=body).json()
  print(re)
  return re
create_project()

创建volume(卷)

def flavor_create():
  default_project = {}
  domain = {}
  url = osurl+":8776/v2/138470dc0251402aa02fd286d373b4bd/volumes"
  headers["X-Auth-Token"] = get_token()
  body={
    "volume":{
      "name": "psysewe",
      "size": "1",
      "type": "lvm"
    }
  }
  re = requests.post(url,headers=headers,json=body).json()
  print(re)
  return re
flavor_create()

Redis 一主二从三哨兵模式

使用提供的 OpenStack 私有云平台,申请三台 CentOS7.9 系统的云主机,使用提供的 http 源,在三个节点自行安装 Redis 服务并启动,配置 Redis 的访问需要密码,密码设置为 123456。然后将这三个 Redis 节点配置为 Redis 的一主二从三哨兵架构,即一个 Redis 主节 点,两个从节点,三个节点均为哨兵节点。

###通过iaas源直接下载redis或通过编译安装make|make install

主节点
###修改配置文件/etc/redis.conf
bind 127.0.0.1     ### 修改为 bing 0.0.0.0 或注释
requirepass 123456 ### 添加 通过搜索password可得
protected-mode no  ### 关闭保护模式(只有同一个服务器才能连接)

从节点
###修改/etc/redis.conf加入集群 
replicaof <masterip> <masterport>
slaveof <masterip> <masterport>
###指定master
replicaof redis-1 6379 
slaveof redis-1 6379
###master密码
masterauth 123456
protected-mode no

###重启redis服务
通过yum安装: 
systemctl restart redis

源码安装: 
/etc/init.d/redis_6379 stop 
/etc/init.d/redis_6379 start 

###检测
[root@redis-1 redis-7.0.5]# redis-cli 
127.0.0.1:6379> AUTH 123456 ###认证
OK
127.0.0.1:6379> info replication ###查看信息
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.20,port=6379,state=online,offset=294,lag=1
slave1:ip=192.168.1.30,port=6379,state=online,offset=294,lag=1
master_failover_state:no-failover
master_replid:40b9e01fc3ef428ab7ab182b69d93f01ccfdfb87
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:294
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:294
127.0.0.1:6379> 

###开启哨兵模式
yum: 
/etc/redis-sentinel.conf
源码安装: 
在包里有模板文件sentinel.conf将其拷贝值/etc/下
protected-mode no
bind 0.0.0.0
sentinel monitor mymaster 192.168.1.10 6379 2
sentinel auth-pass mymaster 123456

###在没有启动哨兵服务时,文件中没有myid可以复制给其他主机使用
systemctl start redis-sentinel
redis-sentinel /etc/sentinel.conf

###查看
[root@redis-1 etc]# redis-cli -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.10:6379,slaves=2,sentinels=3

Redis 服务调优-AOF

使用上一题安装的 Redis 服务。在 Redis 中,AOF 配置为以三种不同的方式在磁盘上执 行 write 或者 fsync。假设当前 Redis 压力过大,请配置 Redis 不执行 fsync。除此之外,避免 AOF 文件过大,Redis 会进行 AOF 重写,生成缩小的 AOF 文件。请修改配置,让 AOF 重 写时,不进行 fsync 操作。

# 持久化技术:redis是运行在内存上的服务,一旦断电或重启,内存上的数据就会被删除,为了防止数据丢失,
redis提供了一种安全策略--持久化

# 持久化就是把redis产生的数据或操作进行快照保存到磁盘上

分类:RDB 一段时间内全量保存数据 redis datebase
      AOF 一段时间内增量保存数据 append only file 

修改/etc/redis.conf文件
```
[root@controller ~]# vi /etc/redis.conf
appendonly yes ###改为yes 开启AOF
appendfsync no ###将原来的everysec修改为no,表示不执行fsync
no-appendfsync-on-rewrite yes ###将原来的no改为yes,表示进行aof重写不执行fsync
```

Raid管理

在OpenStack私有云平台,创建一台云主机,并创建一个40G大小的cinder块存储,将块存储连接到云主机,然后在云主机上对云硬盘进行操作。要求分出4个大小为5G的分区,使用这4个分区,创建名为/dev/md5、raid级别为5的磁盘阵列加一个热备盘(使用最后一个分区作为热备盘)

[root@node ~]# yum install -y mdadm gdisk
[root@node ~]# lsblk
gdisk /dev/sdb
Command (? for help): n
Partition number (1-128, default 1):            ###默认,直接回车 
First sector (34-2047, default = 34) or {+-}size{KMGTP}:      ###默认直接回车
Last sector (34-2047, default = 2047) or {+-}size{KMGTP}: +10G ###{单位KMGTP}
Hex code or GUID (L to show codes, Enter = 8300): fd00      ###不清楚L命令查看 raid代码 fd00
wq 保存

查看
[root@node ~]# lsblk

[root@node ~]# mdadm -C -v /dev/md5 -l 5 -n 4 /dev/sdb{1,2,3,4} -x 1 /dev/sdb5
Continue creating array? y ###y确定
/dev/md0 raid路径位置
-v 显示创建过程
-C 创建
-c 块设备大小 默认64 一般64、256、512
-l 指定raid类型
-n {指定raid个数} {具体盘符}
-x 备份盘个数(即热备盘)
-a 通知mdadm是否创建设备文件 默认yes

lsblk 查看
mdadm -D /dev/md5 查看raid详情
cat /proc/mdstat 系统磁盘阵列情况

mdadm --stop dev/md5 停用raid

ansible

常用模块使用方法

###查找模块使用方法ansible-doc 模块名

默认为command模块 不能交互不能使用一些符号
shell模块
  可以使用一些符号|> 

script模块
  应为不能交互,可使用此模块将本地编写的脚本导入目标主机执行执行完后删除
    ansible all -m script -a "./install.sh" 

file模块
  可以创建删除文件,目录,连接,修改权限
  创建文件
    ansible all -m file -a "path=/root/txt state=touch"
  创建目录
    ansible all -m file -a "path=/root/dir state=directory"
  修改属主属组权限
    ansible all -m file -a "path=/root/txt owner=sshd group=sshd mode=0777"
  删除
    ansible all -m file -a "path=/root/txt state=absent"
  创建连接
    ansible all -m file -a "src=/etc/hosts path=/tmp/hosts.txt state=link"

copy模块
  将本地文件或目录复制到目标主机指定目录下
    ansible all -m -a "src=/root/.ssh/id_rsa dest=/root/.ssh/"
  同通过content直接定义文件内容 \n 回车
    ansible all -m copy -a "content='hello world\n dest=~/'"

fetch模块
  将目标主机指定目录复制到本地
    ansible all -m fetch -m "src=/etc/hosts dest=~/"

lineinfile模块
  修改目标主机指定文件单行内容默认在最后一行添加
    ansible all -m lineinfile -a "path=hosts line='192.168.XX'" 

replace模块
  可更换文件中指定内容
    ansible all -m replace -a "path=/etc/hosts regxep=master replace=node"

user模块
  创建删除修改用户
    ansible all -m user -a "name=wsq password={{'000000'|password_hash('sha512')}}"
    ansible all -m user - a "name=wsq state=absent remove=true"

yum_repository模块
  创建修改yum源配置文件
    ansible all -m yum_repository -a "name=centos baseurl=http://192.XXXX 
    gpgcheck=no descripton=hello"
    [centos]
    name=hello
    baseurl=http://
    gpgcheck=0 

yum模块
  安装卸载升级软件包
    ansible all -m yum -a "name=vsftpd state=present"
    ansible all -m yum -a "name=vsftpd state=latest"
    ansible all -m yum -a "name=vsftpd state=absent" 

service模块
  启动关闭重启服务
    ansible all -m service -a "name=httpd state=started"
    ansible all -m service -a "name=httpd state=stoped"
    ansible all -m service -a "name=httpd state=restarted"
    ansible all -m service -a "name=httpd enabled=yes"

sudo提权
  echo "wsq ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

标题: openstack运维

链接: https://zhiyong0389.github.io/2023/03/11/open%20stack%20%E8%BF%90%E7%BB%B4/

版权声明: 若无特殊标注皆为 智勇 原创版权, 转载请以链接形式注明作者及原始出处

最后编辑时间: 2023-06-29

本站由免费云加速(FreeCDN)提供网站加速和攻击防御服务