VoidKing 学而不思则罔,思而不学则殆! 2018-12-25T07:12:01.120Z http://voidking.com/ VoidKing Hexo 使用Libvirt创建虚拟机 http://voidking.com/dev-libvirt-create-vm/ 2018-12-21T03:30:00.000Z 2018-12-25T07:12:01.120Z libvirt简介

参考QEMU和QEMU-KVM的关系,可以了解到,KVM实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构的,支持虚拟化功能的硬件支持(比如Intel VT,AMD-V),是一种全虚拟化架构。QEMU是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。

总的来说,QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它本身自己可以做CPU和内存的模拟,只不过效率较低),而KVM是另一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),但本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,所以KVM方案一定要依赖QEMU。

Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX,QEMU和其他虚拟化技术。

Libvirt主要由三个部分组成:API库,一个守护进程libvirtd和一个默认命令行管理工具 virsh。

更多内容参考libvirt 介绍

实验环境

不能直接在OpenStack环境中实验,因为这样会破坏OpenStack。而且,使用kolla安装的OpenStack,没有virsh命令,libvirt是运行在容器中的。

所以,我们搭建一个新的实验环境:两个节点分别为node0和node1,ubuntu16系统,IP分别为192.168.56.200和192.168.56.201。

安装libvirt

参考Ubuntu16.04安装QEMU与libvirt,安装QEMU和libvirt。

1、切换到root用户
sudo -i

2、查看主机是否支持硬件虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo
因为我们的实验本身是在虚拟机中进行的,所以输出0,表示不支持硬件虚拟化。

3、安装QEMU和libvirt
apt install -y qemu libvirt-bin bridge-utils virt-manager virt-viewer

如果是支持硬件虚拟化,那么执行安装:
apt install -y kvm qemu-kvm libvirt-bin bridge-utils virt-manager virt-viewer

bridge-utils是网桥管理工具。virt-manager是一个通用的桌面管理工具。virt-viewer是一个用于显示虚拟机的图形控制台的最小工具。

4、检查安装

1
2
3
virsh --version
virt-manager --version
virt-viewer --version

5、查看网络

1
2
3
ip a
brctl show
virsh net-list

安装完成以后,默认是启用了桥接网络virbr0,IP为192.168.122.1/24。如果没有启用,那么参考ubuntu16.04环境安装KVM进行启用。

6、安装vncserver
apt-get install vnc4server

qemu创建虚拟机

参考嵌套虚拟化—VMware+QEMU/KVMubuntu下使用qemu安装虚拟机并配置桥接网络使用qemu安装虚拟机,进行虚拟机的创建。

1、创建磁盘

1
2
3
mkdir /opt/qemu
cd /opt/qemu
qemu-img create -f qcow2 cirros0.img 5g

qcow2是qemu最常使用的格式,该格式下可以采用来写时复制技术来优化性能;cirros0.img是磁盘名称;5g是指磁盘文件大小。

2、下载cirros系统

1
wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

3、安装cirros到磁盘

1
qemu-system-x86_64 -hda cirros0.img -boot d -cdrom ./cirros-0.4.0-x86_64-disk.img -m 512 -vnc :1

如果是支持硬件虚拟化,那么执行安装:

1
qemu-system-x86_64 -enable-kvm -hda cirros0.img -boot d -cdrom ./cirros-0.4.0-x86_64-disk.img -m 512 -vnc :1

enable-kvm使用KVM进行加速;hda指定要使用的虚拟磁盘;boot d指定启动位置,d表示从光盘启动;cdrom指定镜像文件;m指定虚拟机内存大小,默认单位是MB;vnc:1通过vnc创建虚拟桌面。

出现警告:warning: TCG doesn’t support requested feature: CPUID.01H:ECX.vmx [bit 5]
没啥影响,不去管它。但是另外一个问题来了?怎么进行交互安装?

4、本地打开vncviewer client,输入ip:5901进行连接,即可看到安装过程。

卡在了安装界面:

1
2
3
Boot failed: could not read the boot disk
No more network devices
No bootable device

参考Play with Libvirt/KVM发现,cirros-0.4.0-x86_64-disk.img本身就是一个磁盘,尴尬。。。

5、启动实例

1
2
3
qemu-system-x86_64 -m 512 -smp 4 \
-drive file=cirros-0.4.0-x86_64-disk.img \
-vnc :1

本地打开vncviewer client,输入ip:5901进行连接,即可看到启动过程。因为没有enable-kvm,所以启动很慢,请耐心等待。

6、查看实例IP
登录cirros,然后查看IP、内存和硬盘

1
2
3
ip add
free -m
df -h


IP默认为10.0.2.15;内存512M,是指定的;硬盘默认256M。

当ctrl+c结束qemu-system-x86_64命令后,实例就被关闭了。再次使用qemu-system-x86_64命令启动实例,登录实例后使用history命令,发现之前的命令记录都还在,说明两次使用的都是同一块磁盘,也就是cirros-0.4.0-x86_64-disk.img。

7、设置IP
sudo vi /etc/network/interfaces,eth0的配置修改为:

1
2
3
4
auto eth0
iface eth0 inet static
address 192.168.122.100
netmask 255.255.255.0

然后重启网卡,sudo ifdown eth0sudo ifup eth0。但是,无法ping通192.168.122.1,说明实例的网卡并没有和virbr0进行连接。

创建网络

实例有了,但是还不能连接外部网络。参考访问qemu虚拟机的五种姿势,创建网络,重新启动实例。

1、创建网桥

1
2
brctl add virbr0
ifconfig virbr0 192.168.122.1 net mask 255.255.255.0 up

网桥已经存在,所以这一步不需要了。

2、创建tap接口,并添加到网桥

1
2
3
4
apt install uml-utilities
tunctl -t tap0
ifconfig tap0 0.0.0.0 up
brctl addif virbr0 tap0

3、让实例使用tap0作为网络设备启动

1
2
3
4
5
qemu-system-x86_64 -m 512 -smp 4 \
-drive file=cirros-0.4.0-x86_64-disk.img \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet \
-vnc :1

4、测试网络
登录实例,ping 192.168.122.1,此时网络已经通了。

libvirt创建虚拟机

以上创建虚拟机的过程,其实并没有用到libvirt。下面参考Play with Libvirt/KVM,使用libvirt进行虚拟机的创建。

1、创建虚拟机

1
virt-install --connect=qemu:///system --name=cirros --ram=512 --vcpus=1 --disk path=cirros-0.4.0-x86_64-disk.img,format=qcow2 --import --network network:default --vnc

无法使用vncviwer进行连接,然后卡在上图的界面,最后ctrl+c强制结束。配置文件位于/etc/libvirt/qemu/cirros.xml,如果要编辑它,使用virsh edit cirros命令。

2、显示vnc port
virsh vncdisplay cirros

3、显示实例列表
virsh list

4、查看实例详情
virsh dominfo cirros

问题来了,怎么访问这个实例呢?

5、查看实例网络
参考Find the IP address of a virtual machine,使用arp -an命令查看实例IP。

然后,挨个ping一下192.168.122.0网段的IP,即可找到实例的IP,本次找到的IP为192.168.122.49。

6、访问实例
ssh cirros@192.168.122.49

输入默认密码gocubsgo,即可登录实例。

7、测试网络
ping 8.8.8.8 -c3

至此,大功告成,创建实例成功。

PS:销毁实例

1
2
3
4
5
virsh destroy cirros
rm /etc/libvirt/qemu/cirros.xml
virsh
# undefine cirros
# quit

后记

其实,虚拟机中安装的虚拟机,也可以支持KVM了,参考KVM嵌套虚拟化 – 在虚拟机中创建虚拟机Nested KVM,开启嵌套虚拟化即可。

1、查看宿主机是否开启嵌套虚拟化
cat /sys/module/kvm_intel/parameters/nested
N代表没有开启。

2、开启嵌套虚拟化
echo 'options kvm_intel nested=1' >> /etc/modprobe.d/qemu-system-x86.conf
然后重启系统。

书签

linux初学者-网络桥接篇

Documentation/Networking

]]>
<h1 id="libvirt简介"><a href="#libvirt简介" class="headerlink" title="libvirt简介"></a>libvirt简介</h1><p>参考<a href="https://blog.csdn.net/shengxia1999/article/details/52244119" target="_blank" rel="noopener">QEMU和QEMU-KVM的关系</a>,可以了解到,KVM实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构的,支持虚拟化功能的硬件支持(比如Intel VT,AMD-V),是一种全虚拟化架构。QEMU是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。</p> <p>总的来说,QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它本身自己可以做CPU和内存的模拟,只不过效率较低),而KVM是另一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),但本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,所以KVM方案一定要依赖QEMU。</p> <p>Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX,QEMU和其他虚拟化技术。</p> <p>Libvirt主要由三个部分组成:API库,一个守护进程libvirtd和一个默认命令行管理工具 virsh。</p> <p>更多内容参考<a href="https://blog.csdn.net/scucscheng/article/details/51803238" target="_blank" rel="noopener">libvirt 介绍</a>。</p>
Vim进阶 http://voidking.com/dev-vim-advance/ 2018-12-18T06:30:00.000Z 2018-12-19T02:20:11.739Z 前言

Vim是Linux和Unix上的编辑器,由Vi升级而来。

已经使用了Vim好多年,但是,水平仅仅停留在修改配置文件的水平。不会把它当做主要的编辑器,更不会用它进行编码开发。最近,童钢老师提醒了我,作为运维人员,Vim需要用得更加熟练一些,最好能把Vim作为默认编辑器使用。

所以,本文决定研究一下更高阶的Vim使用技巧,主要参考优雅玩转Vim

Vimrc

Vimrc指的是Vim的配置文件,rc=run command,Vim 的全局配置一般在/etc/vim/vimrc或者/etc/vimrc,对所有用户生效。用户个人的配置在~/.vimrc

如果只对单次编辑启用某个配置项,可以在命令模式下,先输入一个冒号,再输入配置。举例来说,set number这个配置可以写在.vimrc里面,也可以在命令模式输入。

配置项一般都有”打开”和”关闭”两个设置。”关闭”就是在”打开”前面加上前缀”no”。

1
2
3
4
5
" 打开
set number

" 关闭
set nonumber

上面代码中,双引号开始的行表示注释。

查询某个配置项是打开还是关闭,可以在命令模式下,输入该配置,并在后面加上问号。

1
:set number?

上面的命令会返回number或者nonumber。

如果想查看帮助,可以使用help命令。

1
:help number

更多内容参考Vim 配置入门

有一些大神把Vim配置得非常炫酷,比如amixhumiaozuzu

四种模式

普通模式

进入vim后默认普通模式,可以进行移动、复制、粘贴、删除、修改等。其他模式点击Esc返回普通模式。

可视模式

对一块区域进行操作,就像Windows中的鼠标选中。普通模式下点击v进入可视模式。

插入模式

插入模式和普通文本编辑器相同,可以进行输入和删除。普通模式下点击i进入插入模式。

命令模式

在命令模式中可以执行一些指令,就像在shell里一样。普通模式下点击Shift + :进入命令模式。

快捷键

移动跳转

为了减少右手移动距离,h可代替左,j可代替下,k可代替上,l可代替右。

0移动到行首,Shift + 6也是移动到行首(不包含空格)。Shift + 4移动到行尾。

w光标正向移动到下一个单词,3w正向移动3个单词,b反向移动。e正向移动到下一个单词词尾,ge反向移动。W(Shift+w)表示忽略特殊字符,比如逗号句号等。

gg跳回第一行,10gg跳到第10行,G跳到最后一行。g、Ctrl+g显示文件信息。

f、空格,跳到下一个空格。

>>右缩进,<<左缩进。

多行缩进,进入命令模式,输入:

1
2
75,80>
75>6

删除复制

yy复制一行,内容存入无名寄存器和0号寄存器。

准确地来说,Vim中没有删除,只有剪切。dd剪切一行,内容存入无名寄存器和1号寄存器。

p粘贴到光标下一行,P粘贴到光标前一行。
u撤销上一步的操作。
ctrl+r重做。

命令模式下输入reg可以查看寄存器。

yw复制当前单词,y2w复制正向两个单词。x复制当前字符。

dw删除当前单词,dj删除下一行,dk删除上一行,dh删除左边一个字符,dl删除当前字符。

d、Shift+6删除到行首,d、Shift+4删除到行尾。

3dd向下删除3行,5dw正向删除5个单词。

修改查找

shift+i,跳到行首并进入插入模式;shift+a,跳到行尾并进入插入模式。

o进入下一行插入模式,O进入上一行插入模式。

3i进入插入模式,输入内容,Esc,输入的内容会被复制3次。

5o进入下一行插入模式,输入内容,Esc,输入的内容会插入5行。

~单个字符大小写转换,g~w整个单词大小写转换,g~$整行大小写转换,.对上一个操作重复。

fa在行内查找a,Fa在行内反向查找a。

/word查找word,n查找下一个,N查找上一个。在命令模式下设置set hlsearch可以高亮显示。

进入命令模式,进行替换:

1
2
:s/oldword/newword/g
:%s/oldword/newword/g

r替换单个字符,shift+r替换当前行,cw替换当前单词,c$修改光标后的内容。

多文件编辑

假设有buffer1.txt、buffer2.txt、buffer3.txt三个文件,那么可以使用vim buffer*打开三个文件。当前显示buffer1.txt,进入命令行模式,查看缓冲区列表:

1
2
3
:files
:buffers
:ls

badd buffer4.txt打开一个缓冲区,bn切换下一个缓冲区,bp切换上一个缓冲区,bf切换到第一个缓冲区,bl切换到最后一个缓冲区,b3切换到第三个缓冲区,b buffer1.txt切换到buffer1.txt,ball编辑所有缓冲区,1,3bd删除1-3缓冲区列表,%bd删除所有缓冲区列表,qall退出所有。

bufdo set number所有缓冲区设置number。

多窗口与标签分组

vim -o3 buffer*,分屏打开三个文件,垂直方向分屏。vim -O3 buffer*,分屏打开三个文件,竖直方向分屏。

ctrl+w、s垂直复制分屏,ctrl+w、v水平复制分屏,ctrl+w、q删除分屏。

sp buffer4.txt打开buffer4.txt并且上下分屏,vsp buffer4.txt打开buffer4.txt并且左右分屏。

ctrl+w、h向左移动,ctrl+w、j向下移动,ctrl+w、k向上移动,ctrl+w、l向右移动。
ctrl+w、+增加高度,ctrl+w、-减少高度,ctrl+w、=设置高度相等。

标签里面可以包含多个窗口,使用类似于buffers。
命令模式下,tabnew创建标签,tabfind查找并在新标签中打开文件,tabs查看打开的标签列表,tabclose关闭当前标签页,tabonly只保留当前标签页,tabn/p/first/last切换标签页,tabm 0将标签页放到第一个位置。
普通模式下,gt/gT切换标签页。

文本对象和宏

文本对象:w代表word,s代表sentence,p代表paragraph,此外还有textblock块对象。

操作:

1
2
3
4
5
6
{operator}{i}{object}
{operator}{a}{object}
daw = delete a word
==a==n object: include the tail space
ciw = change inner word
==i==nner object: not include the tail space

viw选中单词,v3iw选中三个单词,vis选中句子,vip选中段落,vi(选中圆括号中的内容,vi[选中中括号中的内容,vit选中标签中的内容。

使用宏输入1到99:
普通模式下,o进入下一行插入,输入1,Esc返回普通模式,qa开始录制,yyp复制粘贴一行,ctrl+a当前数字加一,q完成录制,97@a执行97次。

Visual模式

在可视模式下,可以对一个文本块的整体进行操作。可视模式有三种子模式,v激活面向字符的可视模式,V激活面向行的可视模式,ctrl+v激活面向列块的可视模式。

gv重选刚才选择的选区,o在选择区两端跳动。
ctrl+v、3j垂直下拉三列,r进行替换。
ctrl+v、3j垂直下拉三列,e选择单词直到词尾,c进行单词替换,输入完成,Esc。
ctrl+v、3j垂直下拉三列,$选择到行尾,A进行插入,输入完成,Esc。

后记

至此,已经系统学习了Vim的高阶知识点,包括Vim配置、四种模式、快捷键、多文本编辑、多窗口标签、文本对象和宏、可视模式等。接下来,就是在学习工作中多多使用Vim,最终熟能生巧。

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>Vim是Linux和Unix上的编辑器,由Vi升级而来。</p> <p>已经使用了Vim好多年,但是,水平仅仅停留在修改配置文件的水平。不会把它当做主要的编辑器,更不会用它进行编码开发。最近,童钢老师提醒了我,作为运维人员,Vim需要用得更加熟练一些,最好能把Vim作为默认编辑器使用。</p> <p>所以,本文决定研究一下更高阶的Vim使用技巧,主要参考<a href="https://www.imooc.com/learn/1049" target="_blank" rel="noopener">优雅玩转Vim</a>。</p>
阿里云技术体系概览 http://voidking.com/dev-ali-tech-system-summary/ 2018-11-26T01:00:00.000Z 2018-12-14T02:10:39.563Z 阿里云

据Gartner发布的2017年度全球公有云市场份额分析报告,全球范围内的公有云市场已经形成了3A格局:亚马逊AWS、微软Azure、阿里云AliYun。

今年,天猫双11以2135亿的成交额再破记录。这背后,是阿里云的技术在支撑,阿里云的大数据计算平台已经拥有全世界最牛的大数据并发处理能力。

本文,就来研究整理一下阿里云的技术栈。

历史

2009年之前IOE(IBM小型机,Oracle数据库,EMC存储设备),Oracle之巅。

2009年9月阿里云成立,愿景是要做一套大数据分布式计算/存储的云平台,自主研发飞天体系,包括三大部分:底层的分布式存储系统——盘古、分布式调度系统——伏羲、开放数据处理服务——ODPS(Open Data Processing Service)。后来又添加了集群诊断系统——华佗、网络连接模块——夸父、监控系统——神农、集群部署——大禹。

2009-2011年期间云梯1(Hadoop)、云梯2(飞天),两套系统,云梯1承载初期集团淘宝的数据业务,云梯2助力阿里金融的第一个产品“牧羊犬”应用上线。

2011年,集团主要业务全部登上云梯1,阿里构建了国内领先的hadoop集群。两座云梯同时发展,开始进行博弈,规则很明确:要想成功肩负起阿里巴巴的底层计算系统,就必须有能力独自调度5000台服务器,“赢者通吃”,继承家业。

2011年,大数据实时计算发展也随业务而生。数据魔方研发了第一个版本的galaxy,b2b搜索团队也研发了一个叫iprocess的流计算系统。在12年7月份,数据平台事业部(CDO)成立,两个团队走到了一起组建了实时计算团队。

2012年冰火鸟:数据业务层统一。云梯1、云梯2运维团队合并。

2013年5K之战:突破集群存储的瓶颈。云梯2突破5K。

2014年-2015年登月计划:打造集团统一大数据平台。云梯1停止,云梯2成为集团统一的大数据平台。ODPS更名为“MaxCompute”。

2015年,支持公有云,阿里大数据计算能力,走出集团服务全球。

2016年,建设主备双链路容灾、实时全链路监控、Tesla运维诊断工具实时全链路保障方案。大力发展实时计算,Galaxy、JStorm和Search dump三支实时计算团队资源整合。

2017年,MaxCompute架构升级,在NewSQL、富结构化、联合计算平台、AliORC多个方向上发力,继续构建高可用、高性能、高自适性的一站式的大数据解决方案开放平台。

更详细历史,参考首次探秘!双11奇迹背后的大数据力量,十年发展五部曲

阿里大数据技术如何进化?资深技术专家带你回顾一文中作者观滔提到:

如果把阿里巴巴整体数据体系比作这个战队,那么MaxCompute就是中间的那艘航空母舰,几乎阿里巴巴99%的数据存储以及95%的计算能力都在这个平台上产生。

计算平台

阿里的计算平台服务主要有MaxCompute、流计算Blink、图计算FLASH、机器学习PAI。

MaxCompute

由历史可以看出,现在的阿里技术核心围绕MaxCompute。

上图是MaxCompute的技术架构。最下面一层是物理机器,MaxCompute有自己的物理集群,在集群之上有非常重要的能力:它把一个集群组织成了1万台计算机,MaxCompute 2.0很大的特性是集群能力得到了扩展,从5千变成了1万。黑色部分是飞天操作系统,提供整个分布式系统任务协同、资源管理、集群调度等功能,为上层云产品提供统一的操作系统服务。其上是MaxCompute统一的计算引擎,支持SQL、MR、迭代计算、图计算、流计算。

详情参考阿里巴巴大数据计算平台MaxCompute(原名ODPS)全套攻略性能追求之路——MaxCompute2.0(原ODPS)的前世今生

Apache Flink是面向数据流处理和批处理的分布式开源计算框架,2016年阿里巴巴引入Flink框架,改造为Blink。2017年,阿里整合了所有流计算产品,决定以Blink引擎为基础,打造一款全球领先的实时计算引擎。当年双11,Blink支持了二十多个事业部/群,同时运行了上千个实时计算job,每秒处理的日志数峰值达到惊人的4.7亿。

详情参考阿里新一代实时计算引擎 Blink,每秒支持数十亿次计算

FLASH

FLASH是阿里的图计算平台。简单的说图计算就是研究在大规模图数据下,如何高效计算,存储和管理图数据等相关问题的领域。

应用:搜索推荐、关联分析、实时预测等。

详情参考FLASH:大规模分布式图计算引擎及其应用大规模图计算系统综述

PAI

PAI是阿里自己的智能平台,该平台基于阿里云的云计算平台,具有处理超大规模数据的能力和分布式的存储能力,同时整个模型支持超大规模的建模以及GPU计算。此外,该平台还具有社区的特点:实验结果可共享、社区团队相互协作。该智能平台主要分为三层,第一层是Web UI界面,第二层是IDST算法层,最后一层是ODPS平台层。

详情参考阿里云机器学习平台——PAI平台

技术架构

除了MaxCompute,阿里还有很多其他的技术,如下图:

1、基础设施新技术
大规模文件分发系统、X-Cluster、时间序列异常检测算法、Changefre系统、阿里智能流量调度系统、StarAgent、调度混部技术、网络自愈技术、“无人值守”的全链路压测

2、新零售技术创新
时尚大脑、门店发货/自提、智慧门店天梭、随身购物袋、数据银行

3、菜鸟
菜鸟方舟

4、支付
OceanBase、离在线混部、GeaBase、支付工具精准推荐、海淘正品溯源

5、机器智能“新物种”战队
云小蜜、蚂蚁安安、首席拣货官、小G二代:智能配送员、天巡、尖兵、达灵、鲁班、蚂蚁佐罗、无人汽车售卖机

6、云计算
阿里云弹性计算ECS、ApsaraCache、阿里云数据集RDS、阿里云内容分发网络CDN、日志服务、移动云、阿里云OSS、阿里云DDoS防御技术、混合云架构、专有网络VPC、负载均衡SLB、高速通道、NAT网关、视频直播、云导播

7、安全
霸下——七层流量清洗、钱盾、MTEE3、御城河、CTU

技术点

调度混部技术

Sigma通过和离线任务的伏羲调度系统深度集成,突破了若干CPU、内存和网络资源隔离的关键技术,实现了在线和离线任务的混合部署。

Sigma调度可以跨多个不同平台来分配双11所需的资源,使双11 IT成本下降50%;混部技术把服务器资源利用率提升30%,复用计算任务集群为双11节约大量服务器。

在线服务的容器就像砖块,而计算任务就像沙子和水。当在线服务压力小的时候,计算任务就占住那些空隙,把空闲的资源都使用起来,而当在线服务忙的时候,计算任务便立即退出空隙,把资源还给在线服务。

详情参考想了解阿里巴巴的云化架构 看这篇就够了

Pouch容器

阿里的容器技术经历了一个从集中式到分布式架构上的演化,最开始是直接跑在物理机上,之后引入了虚拟化技术,但整体的资源使用率不高,因而过渡到了容器技术。2015 年以后,阿里巴巴引入Docker标准,形成一套新的容器技术——Pouch,并集成到整个运维体系。

全网Pouch化实现阿里在线服务全部容器化,内部达到百万级容器部署规模,Pouch容器已对外开源。

全链路压测

阿里巴巴双11备战期间,保障系统稳定性最大的难题在于容量规划,而容量规划最大的难题在于准确评估从用户登录到完成购买的整个链条中,核心页面和交易支付的实际承载能力。

最初采用的方式是在线上单机的生产环境的压力测试和容量规划,基于单台服务能力和预估即将到来的业务流量进行容量规划,确定所需服务器的数目。

2010-2012年双11暴露了不少问题,单个系统ready不代表全局ready,究其根本原因在于系统之间相互关联和依赖调用之间相互影响。在做单个系统的容量规划时,所有的依赖环节能力是无限的,进而使得获取的单机能力值是偏乐观的;同时,采用单系统规划时,无法保证所有系统均一步到位,大多数精力都集中核心少数核心系统;此外,部分问题只有在真正大流量下才会暴露,比如网络带宽等等。

阿里从13年起着手进行全链路压测。全链路压测的本质是让双11零点这一刻提前在系统预演(用户无感知),模拟“双11”同样的线上环境、用户规模、业务场景、业务量级,之后再针对性地进行系统调优,是站点的一次高仿真模拟考试。

全链路压测核心要素主要包括四点:

  • 压测环境,它是指具备数据与流量隔离能力的生产环境,不能影响到原有的用户体验和用户流程、BI报表以及推荐算法等;
  • 压测基础数据,它主要包括压测用户、店铺、商品等基础数据;
  • 压测场景模型,它主要是指压测哪些业务场景,每个场景下压测多大量等;
  • 压测流量,它主要由压测请求的协议来决定压测流量的输出

详情参考系统稳定性保障核武器——全链路压测

OceanBase

OceanBase是阿里完全自主研发的金融级分布式关系数据库,从架构上可以通过扩展机器来解决集群服务能力的扩展需求。OceanBase采用多副本复制的方案解决了可靠性和可用性的需求,而且构建在普通PC服务器上,不依赖于高端引擎。

OceanBase从诞生、到电商数据库、再到金融数据库及最终的云数据库,经历了四个阶段。

详情参考阿里蚂蚁金服的关系型数据库:OceanBase架构详解OceanBase 2.0 到底如何做到 50% 的性能提升?

Dubbo

Dubbo是阿里巴巴于 2012 年开源的分布式服务治理框架,目前已是国内影响力最大、使用最广泛的开源服务框架之一,在Github上的 fork、star数均已破万。

Dubbo 致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,使得应用可通过高性能RPC 实现服务的输出和输入功能, 和 Spring 框架无缝集成。Dubbo包含远程通讯、集群容错和自动发现三个核心部分。提供透明化的远程方法调用,实现像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

同时具备软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。可以实现服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的 IP 地址,并且能够平滑添加或删除服务提供者。

详情参考分布式服务框架Dubbo疯狂更新!阿里开源要搞大事情?

StarAgent

StarAgent 是一个生态平台。阿里所有的物理机、虚拟机以及容器都会装StarAgent,基本上要和机器交互都需要通过这个平台。它实际上不会做具体的业务,具体的业务还是通过各个业务平台去实现的。

StarAgent 核心功能就是一个命令的通道,它既可以同步执行任务又可以异步执行任务,还可以查询任务状态和插件管理。插件分为两种,一种是静态的,静态的实际上就是脚本、命令之类的。另一种动态的是一个常驻进程,必须常驻在系统里面。我们会守护这个进程,如果它挂了会重新拉起来,如果其占用内存、CPU超过设定的范围会删掉它。整个协议是比较简单的,使用起来耦合度也是比较低的。

详情参考双11黑科技,阿里百万级服务器自动化运维系统StarAgent揭秘阿里巴巴运维中台的演进与建设阿里巴巴运维中台的演进与建设ppt

蜻蜓

蜻蜓系统是纯碎的 P2P 的文件分发系统。

详情参考阿里巴巴运维中台的演进与建设

Normandy

Normandy 是运维整个阿里巴巴业务的PaaS平台。这个平台实际上提供三大功能,分别是基础设施即代码(Infrastructure as Code)、部署和应用运维支撑。

详情参考阿里巴巴运维中台的演进与建设

书签

阿里云的这群疯子
《阿里技术参考图册》
2017杭州云栖大会100位大咖视频+讲义全分享
阿里研究员毕玄谈应用运维体系的变迁,DevOPS是大势所趋
阿里巴巴毕玄解密AIOps:一文读懂阿里巴巴运维体系的前世今生

]]>
<h1 id="阿里云"><a href="#阿里云" class="headerlink" title="阿里云"></a>阿里云</h1><p>据Gartner发布的2017年度全球公有云市场份额分析报告,全球范围内的公有云市场已经形成了3A格局:亚马逊AWS、微软Azure、阿里云AliYun。</p> <p>今年,天猫双11以2135亿的成交额再破记录。这背后,是阿里云的技术在支撑,阿里云的大数据计算平台已经拥有全世界最牛的大数据并发处理能力。</p> <p>本文,就来研究整理一下阿里云的技术栈。</p>
虚拟机在线迁移实验 http://voidking.com/dev-openstack-vm-live-migration-experiment/ 2018-11-22T01:30:00.000Z 2018-12-20T12:40:15.261Z 前言

《虚拟机在线迁移的性能统计》解决了性能统计的问题,《虚拟机在线迁移过程中的故障注入》解决了环境模拟的问题。接下来我们进行一些虚拟机迁移实验,收集不同环境下迁移过程中产生的性能统计数据。

共享存储和非共享存储的虚拟机迁移,性能差别很大。本次实验,在共享存储的条件下进行。对于非共享存储的虚拟机迁移实验,放在其他文章中记录。

实例准备

《OpenStack中虚拟机的在线迁移》《OpenStack中共享存储的虚拟机在线迁移》两篇文章中,使用cirros作为迁移对象;本次实验中,使用ubuntu16作为迁移对象,因为这样可以更方便地注入故障,实例创建参考《OpenStack添加镜像》《Ubuntu16手动安装OpenStack——创建实例》

1、在horizon控制台,项目,计算,镜像。使用xenial-server-cloudimg-amd64-disk1.img镜像创建ubuntu16的镜像模板。

2、使用ubuntu16的镜像模板创建实例ubuntu0,实例类型选择m1.small,配置为1核2G内存20G存储。

3、创建成功后,分配浮动IP。本次分配的浮动IP为10.0.2.154。

4、登录ubuntu0实例,安装stress-ng,方便接下来的实验。

正常虚拟机迁移

1、controller节点ping实例并记录
sudo ping 10.0.2.154 -i 0.01 >> ping.log

2、在compute和compute2节点,都启动iptraf,监听49152 to 49261。

3、在控制节点执行迁移命令
nova live-migration ubuntu0 compute2

4、查看是否迁移完成
nova show ubuntu0

5、迁移完成后进行统计。
(1)在compute节点执行time.sh,得到总的迁移时间,22s。
(2)在controller执行downtime.sh,计算downtime,6.28s。
(3)根据iptraf的监听结果,得到迁出和迁入的数据量,283M,248M。

downtime不合理!为什么这么久?理论上是毫秒级的哇!参考《详解openstack下热迁移机制》,发现OpenStack可以进行迁移的参数设置,downtime可以进行调节。
查看迁移日志:
grep downtime /var/lib/docker/volumes/kolla_logs/_data/nova/nova-compute.log
发现日志中显示的downtime都是固定的50ms,每次迁移只有一次停机。感觉挺复杂的样子,先不管它,按照默认设置来实验吧。

取消迁移

如果虚拟机迁移失败,可以取消迁移。

1、查看迁移任务
nova server-migration-list ubuntu0
该命令查看到迁移任务的ID为12。

2、查看迁移过程
nova server-migration-show ubuntu0 12

3、取消迁移
nova live-migration-abort ubuntu0 12

CPU故障

1、在ubuntu0实例中创建一个CPU进程,CPU占用率10%
stress-ng -c 1 -l 10
使用top可以看到,CPU占用率不稳定,stress-ng进程偶尔跳到最高,占用率10%到90%不等。

2、实例迁移,得到总的迁移时间,34s。

3、设置CPU占用率分别为20%、30%到100%,统计结果如下:

CPU占用率迁移时间停机时间迁出数据量迁入数据量
0%18s6.28s283M248M
10%20s6.53s353M341M
20%19s4.52s323M300M
30%20s4.58s354M338M
40%21s4.62s336M347M
50%20s5.41s355M323M
60%19s4.54s303M309M
70%21s5.24s356M355M
80%19s4.41s351M338M
90%17s7.31s328M362M
99%19s5.77s351M348M

内存故障

1、在实例中创建一个100M的内存进程
stress-ng --vm 1 --vm-bytes 100M --vm-keep
使用free -h,可以看到内存被使用掉了100M。

2、虚拟机迁移,得到总的迁移时间,。

3、设置内存进程分别占用300M、600M到1.5G,统计结果如下:

内存占用迁移时间停机时间迁出数据量迁入数据量
100M22s7.63s501M653M
300M29s7.88s1238M1159M
600M26s7.72s1341M1279M
900M78s8.31s5572M6155M
1200M92s8.14s8208M8070M
1500M102s8.47s8396M9088M

IO故障

1、在实例中创建一个IO进程
stress-ng --io 1
使用iostat -d -k 2查看IO状态,发现tps稳定在200以上,而磁盘读写都为0。使用top命令可以看到,CPU占用率很高,在90%上下。

2、在实例中创建1-10个IO进程,统计结果如下:

IO进程数迁移时间停机时间迁出数据量迁入数据量
137s7.59s2067M1954M
240s6.83s2032M2007M
336s7.04s2071M1788M
436s8.08s1846M1969M
536s6.02s2074M2012M
635s7.44s1805M2032M
736s5.64s2066M2010M
836s8.60s1972M1987M
934s10.95s2064M1880M
1036s7.02s1865M1981M

磁盘故障

1、在虚拟机中创建一个写入进程
stress-ng -d 1
使用iostat -d -k 2查看IO状态,发现tps在30上下,kB_wrtn/s在30000上下。使用top命令可以看到,CPU占用率在25%到99%浮动。

2、在实例中创建1-10个写入进程,统计结果如下:

写入进程数迁移时间停机时间迁出数据量迁入数据量
135s4.83s2059M2023M
237s8.70s1874M1957M
334s8.92s2055M1980M
436s4.97s2024M1959M
536s5.50s2055M1960M
635s4.64s2025M1957M
734s6.02s2055M2041M
843s9.11s2009M1978M
935s6.60s2069M1997M
1034s8.89s1931M1942M

网络延迟

1、在compute节点(迁出节点)添加网络延迟10ms
tc qdisc add dev eth0 root netem delay 10ms
注:原本的延迟在0.5ms上下。

2、将网络延迟修改为20ms-100ms
tc qdisc replace dev eth0 root netem delay 20ms

统计结果如下:

延迟时间迁移时间停机时间迁出数据量迁入数据量
10ms28s10.43s325M307M
20ms36s8.80s305M287M
30ms38s5.73s344M305M
40ms43s11.28s305M290M
50ms44s6.81s240M292M
60ms47s7.09s256M295M
70ms52s14.48s303M292M
80ms50s12.17s242M297M
90ms51s11.37s249M297M
100ms63s18.22s298M344M

在延迟时间大于100ms后,迁移显示成功,实例状态active,但是无法ping通实例。

取消模拟:
tc qdisc del dev eth0 root

丢包

1、两个计算节点,都模拟丢包率1%
tc qdisc add dev eth0 root netem loss 1%

2、将模拟丢包率修改为2%-10%
tc qdisc change dev eth0 root netem loss 2%

统计结果如下:

丢包率迁移时间停机时间迁出数据量迁入数据量
0.5%20s8.55s295M330M
1%31s11.24s301M249M
1.5%29s7.44s335M313M
2%28s11.62s261M299M
2.5%40s10.34s300M325M
3%43s15.19s306M268M

在丢包率大于3%后,迁移显示成功,实例状态active,但是无法ping通实例。

取消模拟:
tc qdisc del dev eth0 root

包重复

1、两个计算节点,都模拟包重复率1%
tc qdisc add dev eth0 root netem duplicate 1%
随机产生 1% 重复的包。

2、将模拟包重复率修改为2%-10%-100%
tc qdisc change dev eth0 root netem duplicate 2%

统计结果如下:

包重复率迁移时间停机时间迁出数据量迁入数据量
1%18s4.82s288M283M
2%21s4.06s308M288M
3%18s8.02s249M309M
4%21s6.37s316M300M
5%19s4.70s314M307M
6%18s4.18s285M316M
7%21s3.81s324M315M
8%18s7.60s305M234M
9%21s6.87s328M316M
10%18s7.71s310M317M
20%21s11.24s360M347M
30%19s9.90s381M388M
40%22s6.67s429M376M
50%18s4.43s445M434M
60%24s8.04s499M438M
70%19s11.30s488M518M
80%25s5.61s581M485M
90%29s5.08s745M646M
100%21s7.89s706M727M

取消模拟:
tc qdisc del dev eth0 root

包损坏

1、两个计算节点,都模拟包损坏率1%
tc qdisc add dev eth0 root netem corrupt 1%
随机产生 1% 损坏的报文(在报文的随机位置造成一个比特的错误)。

在ping的时候会报错:Warning: time of day goes back , taking countermeasures,不过没关系,不影响我们的停机时间统计结果。

2、将模拟丢包率修改为2%-10%
tc qdisc change dev eth0 root netem corrupt 2%

包损坏率迁移时间停机时间迁出数据量迁入数据量
0.5%20s4.43s359M369M
1%24s5.90s371M351M
1.5%30s12.13s374M357M
2%32s9.09s331M362M
2.5%42s7.49s345M337M
3%48s13.46s378M374M

迁移成功率随着包损坏率的增加而降低,包损坏率大于3%之后,基本不会成功。会停留在迁移状态,每秒几K传输。

取消模拟:
tc qdisc del dev eth0 root

后记

至此,完成了系统故障对于OpenStack虚拟机在线迁移过程中的性能影响的实验。实验数据和预期差别很大,比如停机时间量级不合理,比如停机时间基本上不受系统故障影响,比如迁移成功后却出现无法ping通的现象等等。

后续任务有两个,一是需要进行共享存储的虚拟机在线迁移实验,用于对比。二是尝试进行调参,把停机时间调整到毫秒级。

再进一步的话,可以研究下虚拟机迁移成功后无法ping通的原因,还可以研究下同样故障下虚拟机迁移时而成功时而失败的原因。

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.voidking.com/dev-openstack-vm-live-migration-performance/" target="_blank" rel="noopener">《虚拟机在线迁移的性能统计》</a>解决了性能统计的问题,<a href="https://www.voidking.com/dev-openstack-vm-live-migration-fault-injection/" target="_blank" rel="noopener">《虚拟机在线迁移过程中的故障注入》</a>解决了环境模拟的问题。接下来我们进行一些虚拟机迁移实验,收集不同环境下迁移过程中产生的性能统计数据。</p> <p>共享存储和非共享存储的虚拟机迁移,性能差别很大。本次实验,在共享存储的条件下进行。对于非共享存储的虚拟机迁移实验,放在其他文章中记录。</p>
虚拟机在线迁移过程中的故障注入 http://voidking.com/dev-openstack-vm-live-migration-fault-injection/ 2018-11-20T01:30:00.000Z 2018-12-14T08:28:36.532Z 前言

《虚拟机在线迁移的性能统计》一文中,已经找到了虚拟机迁移过程中性能统计的方法,可以统计出迁移时间、停机时间、迁移数据量等指标。

而实际生产环境是复杂的,所以我们想模拟一些环境,看看这些环境(故障)对于虚拟机迁移性能的影响。本文就来研究一下CPU故障、内存故障、磁盘故障、网络故障等的模拟方法。

故障注入

本次故障注入主要有CPU故障、内存故障、磁盘故障、网络故障。请教了卢澄志同学,对于CPU故障、内存故障、磁盘故障的模拟,使用stress或者stress-ng,参考Linux 压力测试软件 Stress 使用指南stress-ng:模拟特定的cpu百分比;对于网络故障的模拟,使用netem,参考使用 tc netem 模拟网络异常netem wiki

故障注入有两个大的思路:一个是注入到被迁移的虚拟机,另一个是注入到宿主机。

stress

1、安装stress-ng
apt-get install stress-ng

2、产生3个CPU进程1分钟后关闭
stress-ng --cpu 3 --verbose --timeout 1m

3、产生2个10MB的内存进程1分钟后关闭
stress-ng --vm 2 --vm-bytes 10M --vm-keep --timeout 1m

4、产生3个IO进程1分钟后关闭
stress-ng --io 3 --timeout 1m

netem

在Ubuntu16中,tc netem不需要安装,系统自带。

1、模拟延迟传输
tc qdisc add dev eth0 root netem delay 100ms
报文延迟 100ms 发送。

tc qdisc replace dev eth0 root netem delay 100ms 20ms
报文延迟的时间在 100ms ± 20ms 之间,具体值随机选择。

2、模拟丢包率
tc qdisc change dev eth0 root netem loss 0.3% 25%
丢包率是 0.3%,并且当前报文丢弃的可能性和前一个报文 25% 相关。

3、模拟包重复
tc qdisc change dev eth0 root netem duplicate 50%
随机产生 50% 重复的包。

4、模拟包损坏
tc qdisc add dev eth0 root netem corrupt 2%
随机产生 2% 损坏的报文(在报文的随机位置造成一个比特的错误)。

5、模拟包乱序
tc qdisc change dev eth0 root netem reorder 50% gap 3 delay 100ms
固定的每隔一定数量的报文就乱序一次:每5个报文会正常发送,其他的报文延迟 100ms。

要想看到 ping 报文的乱序,我们要保证发送报文的间隔小于报文的延迟时间 100ms,这里用 -i 0.05 把发送间隔设置为 50ms。

tc qdisc change dev eth0 root netem reorder 50% 15% delay 300ms
使用概率来选择乱序的报文:50% 的报文会正常发送,其他报文(1-50%)延迟 300ms 发送。

6、取消模拟
tc qdisc del dev eth0 root

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.voidking.com/dev-openstack-vm-live-migration-performance/" target="_blank" rel="noopener">《虚拟机在线迁移的性能统计》</a>一文中,已经找到了虚拟机迁移过程中性能统计的方法,可以统计出迁移时间、停机时间、迁移数据量等指标。</p> <p>而实际生产环境是复杂的,所以我们想模拟一些环境,看看这些环境(故障)对于虚拟机迁移性能的影响。本文就来研究一下CPU故障、内存故障、磁盘故障、网络故障等的模拟方法。</p>
VirtualBox中Ubuntu扩容 http://voidking.com/dev-virtualbox-ubuntu-extend-storage/ 2018-11-15T02:00:00.000Z 2018-12-14T06:03:58.503Z 前言

VirtualBox中,安装了Ubuntu16,磁盘40G。现在,因为某些原因,要对磁盘进行扩容。有两个思路,一个是添加磁盘,另一个是对原磁盘进行扩容。

本文就来研究一下这两种思路的具体做法。

添加磁盘

VirtualBox配置

1、Settings,Storage,Controller: SATA,Adds hard disk。

2、Create new disk,VDI,Dynamically allocated,命名为sdb,大小选择512GB,Create。

分区挂载

参考《Linux的一些技巧》的硬盘挂载部分。

1、查看磁盘

1
2
df -h
fdisk -l

2、硬盘分区
fdisk /dev/sdb

按照提示,依次输入p,n,回车(Partition number),回车(First sector),回车(Last sector),w。

3、格式化
mkfs -t ext4 /dev/sdb1
或者:
mkfs.ext4 /dev/sdb1

4、挂载

1
2
3
mkdir /sdb
mount /dev/sdb1 /sdb
df -h

5、自动挂载
vi /etc/fstab
添加:

1
/dev/sdb1 /sdb ext4 defaults 0 0

扩展卷组

在硬盘分区、格式化之后,不要进行挂载。
参考VirtualBox下Linux虚机扩容,进行如下操作:

1、创建物理卷
pvcreate /dev/sdb1

2、查看物理卷
pvdisplay

3、查看卷组
vgdisplay

可以看到一个卷组ubuntu-vg。

4、扩展卷组
vgextend ubuntu-vg /dev/sdb1

5、查看逻辑卷
lvdisplay

可以看到root卷的LV Path为/dev/ubuntu-vg/root。

6、扩展逻辑卷

1
2
lvextend -L +512G -n /dev/ubuntu-vg/root
lvdisplay

7、调整root逻辑卷大小

1
2
resize2fs /dev/ubuntu-vg/root
df -h

原磁盘扩容

VirtualBox配置

1、切换到root用户
sudo -i

2、查看磁盘列表
vboxmanage list hdds

3、找到需要扩容的磁盘,记下UUID

4、扩容到512G
vboxmanage modifyhd --resize 512000 ba3e897a-742e-45dc-a99a-3302c07be984

分区挂载

1、查看磁盘

1
2
df -h
fdisk -l

2、增加分区
fdisk /dev/sda
输入n,报错:No free sectors available.

没有找到好的解决办法,只能搁置。

扩展卷组

无法分区,同样无法扩展卷组。

后记

以上两种方案,殊途同归。增加容量后,都要经过分区,格式化,然后分区挂载或者扩展卷组。鉴于第二种方案中分区会出错,所以使用第一个方案更好些。

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>VirtualBox中,安装了Ubuntu16,磁盘40G。现在,因为某些原因,要对磁盘进行扩容。有两个思路,一个是添加磁盘,另一个是对原磁盘进行扩容。</p> <p>本文就来研究一下这两种思路的具体做法。</p>
OpenStack中共享存储的虚拟机在线迁移 http://voidking.com/dev-openstack-vm-live-migration/ 2018-11-15T01:00:00.000Z 2018-12-14T02:11:11.906Z 前言

《OpenStack中虚拟机的在线迁移》一文中,虚拟机迁移时,把block一起进行了迁移。生产环境中,这些虚拟机往往是共享存储设备,不需要对block进行迁移。所以,本文就来重新配置一下环境,实现共享存储的虚拟机在线迁移。

原理

正常安装的OpenStack中,实例存放在/var/lib/nova/instances/目录;使用kolla安装的OpenStack中,实例存放在/var/lib/docker/volumes/nova_compute/_data/instances/目录。

共享存储,需要两个步骤:
1、有一台NFS(Network File System)服务器,共享某个目录,比如/nfs/share/instances。
2、所有计算节点的instances目录,都挂载上NFS服务器的/nfs/share/instances目录。

主机准备

使用virtualbox创建一个新的ubuntu16虚拟机,或者clone其他节点并且通过快照恢复初始状态,作为nfs存储节点。这里通过clone的方法得到一个新的主机,设置IP为192.168.56.130。参考《VirtualBox中Ubuntu扩容》,对虚拟机进行扩容。

NFS

NFS服务器

首先,我们要搭建一个NFS服务器,参考Ubuntu 16.04系统上NFS的安装与使用使用NFS实现Ubuntu的文件共享

1、安装nfs软件包
apt install nfs-kernel-server

2、编写配置文件
vim /etc/exports
添加如下内容:

1
2
# openstack instances
/nfs/share/instances *(rw,sync,no_root_squash)

3、创建共享目录并修改权限

1
2
mkdir -p /nfs/share/instances
chmod o+x /nfs/share/instances

4、重启nfs服务
service nfs-kernel-server restart

5、查看共享信息
exportfs

控制节点

在控制节点删除demo1实例,或者在horizon控制台删除demo1的实例。

计算节点

1、安装nfs客户端
apt-get install nfs-common

2、查看共享信息
showmount -e 192.168.56.130

3、挂载nfs目录
mount -t nfs 192.168.56.130:/nfs/share/instances /var/lib/docker/volumes/nova_compute/_data/instances/

instances目录中还有文件和文件夹,直接挂载覆盖确定没有影响吗?没有。

两个计算节点都执行同样的操作,此时它们的instances目录是同一个目录。

4、修改instances目录权限
chmod -R 777 /var/lib/docker/volumes/nova_compute/_data/instances/
一定要修改,否则创建实例时会报错。

5、自动挂载
vim /etc/fstab,添加:

1
192.168.56.130:/nfs/share/instances /var/lib/docker/volumes/nova_compute/_data/instances nfs default 0 0

6、重启compute服务

1
2
docker stop nova_compute
docker start nova_compute

如果不重启,那么创建的实例会存放在计算节点本地磁盘上,卸载instances目录后可以看到。

迁移

创建实例

参考《Kolla安装OpenStack多节点》的初始化配置部分,使用cirros镜像创建demo2实例。

1、使管理员环境生效
source /etc/kolla/admin-openrc.sh

2、创建实例

1
2
3
4
5
6
openstack server create \
--image cirros \
--flavor m1.tiny \
--key-name mykey \
--nic net-id=25e6c0ef-6a0a-481c-a08a-46f7ef67ad3e \
demo2

3、分配浮动IP

1
2
3
4
openstack network list
openstack floating list
openstack floating ip create public1
openstack server add floating ip demo2 10.0.2.156

3、查看实例
计算节点上,在/var/lib/docker/volumes/nova_compute/_data/instances目录中,可以看到新创建的实例。

迁移实验

1、查看实例列表
nova list

2、查看实例信息
nova show demo2

可以看到demo2位于compute节点。

3、实例迁移
nova live-migration demo2 compute2

4、再次查看实例信息
nova show demo2

可以看到demo2迁移到了compute2节点,迁移成功,nice。

书签

DAS、NAS、SAN三种存储架构比较及应用分析

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.voidking.com/dev-openstack-vm-block-live-migration/" target="_blank" rel="noopener">《OpenStack中虚拟机的在线迁移》</a>一文中,虚拟机迁移时,把block一起进行了迁移。生产环境中,这些虚拟机往往是共享存储设备,不需要对block进行迁移。所以,本文就来重新配置一下环境,实现共享存储的虚拟机在线迁移。</p>
OpenStack中虚拟机的在线迁移 http://voidking.com/dev-openstack-vm-block-live-migration/ 2018-11-13T01:00:00.000Z 2018-12-14T02:11:11.883Z 前言

虚拟机迁移主要有三种方式:P2V、V2V和V2P。P2V指迁移物理服务器上的操作系统及其上的应用软件和数据到VMM(Virtual Machine Monitor)管理的虚拟服务器中。V2V迁移是在虚拟机之间移动操作系统和数据。V2P 指把一个操作系统、应用程序和数据从一个虚拟机中迁移到物理机的主硬盘上,是 P2V 的逆操作。

V2V迁移又分为离线迁移和在线迁移。离线迁移也叫做常规迁移、静态迁移,在迁移之前需要将虚拟机关闭。在线迁移又称为实时迁移,是指保持虚拟机正常运行的同时进行迁移。本文要研究的,就是虚拟机的在线迁移。更多详细内容,请参考虚拟机迁移技术漫谈,第 1 部分

迁移相关命令

本文研究的是OpenStack集群中的虚拟机迁移,那么先研究一下OpenStack的虚拟机迁移命令。主要参考Live-migrate instancesBlock Live Migration in OpenStack environment

1、查看实例ID
openstack server list

PS:openstack server可以换成nova

2、查看实例详情
openstack server show 180617ec-1348-4144-a496-8751d12e84bf

PS:实例ID可以换成demo1。

3、查看可以迁移的节点
openstack compute service list

4、查看其它节点资源使用情况
openstack host list

openstack host show compute2

5、迁移
nova live-migration 180617ec-1348-4144-a496-8751d12e84bf compute2

啊嘞,没有反应是闹哪样?查看实例详情,依然位于compute节点。

6、调试迁移
nova live-migration 180617ec-1348-4144-a496-8751d12e84bf compute2 --debug
信息很多,找不到重点。在openstack热迁移和冷迁移一文中发现,在线迁移又可以分为两种:live migration和block migration。live migration需要实例保存在NFS共享存储中,这种迁移主要是实例的内存状态的迁移,速度应该会很快。block migration除了实例内存状态要迁移外,还得迁移磁盘文件,速度会慢些,但是它不要求实例存储在共享文件系统中。

而我们的这个集群,没有共享存储,所以应该用block migration?

7、再次迁移
nova live-migration --block-migrate 180617ec-1348-4144-a496-8751d12e84bf compute2

修改后的命令,在shell中同样没有更多提示,但是查看horizon,发现了惊喜,正在迁移。等到迁移完成,查看实例详情,却发现,实例所在主机依然没有发生变化!
是因为nova没有配置好吗?很有可能,那么修改一下nova的配置试试。

nova配置

因为是使用kolla部署的OpenStack,所以修改配置重启服务的方法,和传统方法有所不同。参考kolla(Ocata)部署nova组件关键配置和volume映射Openstack 之 调整nova相关参数。可以知道,主机中的/etc/kolla/nova-compute/nova.conf,对应容器中的/etc/nova/nova.conf。修改后重启容器,nova-compute服务配置就会发生改变。

1、在两个计算节点,修改nova.conf
vim /etc/kolla/nova-compute/nova.conf,添加:

1
live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE

2、重启nova-compute

1
2
docker stop nova_compute
docker start nova_compute

3、进入容器
docker exec -it nova_compute /bin/bash

4、查看配置是否生效
vi /etc/nova/nova.conf

再次迁移

1、在控制节点执行迁移命令
nova live-migration --block-migrate 180617ec-1348-4144-a496-8751d12e84bf compute2
满怀期望,但是依然失败。

2、在计算节点查看日志
tail -n 20 /var/lib/docker/volumes/kolla_logs/_data/nova/nova-compute.log
日志报错部分如下:

1
2018-11-13 19:12:04.614 6 ERROR nova.virt.libvirt.driver [req-e6654355-fcec-4b93-a662-c758a03766fa b2edc935f89d4d2684ec4039c02a21cc ab7e3eb8c00d4299afd8572e1ec437bf - default default] [instance: 180617ec-1348-4144-a496-8751d12e84bf] Live Migration failure: operation failed: Failed to connect to remote libvirt URI qemu+tcp://compute2/system: Unable to resolve address 'compute2' service '16509': Name or service not known: libvirtError: operation failed: Failed to connect to remote libvirt URI qemu+tcp://compute2/system: Unable to resolve address 'compute2' service '16509': Name or service not known

由日志可以看出,问题出现在libvirt上,那么修改一下libvirt的配置。

libvirt配置

参考OpenStack虚拟机冷迁移与热迁移虚拟机在 OpenStack 里没有共享存储条件下的在线迁移虚拟化之KVM virsh常用命令篇,对libvirt的配置进行修改。

1、查看libvirtd.conf
vim /etc/kolla/nova-libvirt/libvirtd.conf
修改配置如下:

1
2
3
4
5
6
7
listen_tcp = 1
listen_tls = 0
auth_tcp = "none"
ca_file = ""
log_level = 3
log_outputs = "3:file:/var/log/kolla/libvirt/libvirtd.log"
listen_addr = "0.0.0.0"

2、重启libvirt服务

1
2
docker stop nova_libvirt
docker start nova_libvirt

3、查看libvirt服务
netstat -anpt | grep libvirt
看到libvirtd监听在0.0.0.0:16509端口即为正常。

PS:可以在其他节点使用virsh命令测试连通性
virsh -c qemu+tcp://compute2/system

第三次迁移

1、在控制节点执行迁移命令
nova live-migration --block-migrate 180617ec-1348-4144-a496-8751d12e84bf compute2

2、查看实例详情
openstack server show demo1

迁移成功了,nice。

其他命令

1、查看迁移任务
nova server-migration-list 180617ec-1348-4144-a496-8751d12e84bf
该命令查看到迁移任务的ID,然后根据这个ID就可以看到更详细的迁移过程。

2、查看迁移过程
nova server-migration-show 180617ec-1348-4144-a496-8751d12e84bf 2

3、查看警告或者出错日志
grep WARNING.*180617ec-1348-4144-a496-8751d12e84bf /var/lib/docker/volumes/kolla_logs/_data/nova/nova-compute.log

4、取消迁移
nova live-migration-abort 180617ec-1348-4144-a496-8751d12e84bf 2

后记

以上,实现了OpenStack虚拟机的block live migration。后续实验,不妨再研究下共享存储的live migration。

书签

OpenStack命令行操作之虚机管理实现

虚拟机迁移之热迁移(live_migrate)源码解读.html)

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>虚拟机迁移主要有三种方式:P2V、V2V和V2P。P2V指迁移物理服务器上的操作系统及其上的应用软件和数据到VMM(Virtual Machine Monitor)管理的虚拟服务器中。V2V迁移是在虚拟机之间移动操作系统和数据。V2P 指把一个操作系统、应用程序和数据从一个虚拟机中迁移到物理机的主硬盘上,是 P2V 的逆操作。</p> <p>V2V迁移又分为离线迁移和在线迁移。离线迁移也叫做常规迁移、静态迁移,在迁移之前需要将虚拟机关闭。在线迁移又称为实时迁移,是指保持虚拟机正常运行的同时进行迁移。本文要研究的,就是虚拟机的在线迁移。更多详细内容,请参考<a href="https://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm1/index.html" target="_blank" rel="noopener">虚拟机迁移技术漫谈,第 1 部分</a>。</p>
Kolla安装OpenStack添加新节点 http://voidking.com/dev-kolla-openstack-add-new-node/ 2018-11-12T08:30:00.000Z 2018-12-14T02:11:11.858Z 前言

《Kolla安装OpenStack多节点》一文中,使用kolla安装了三个节点的openstack。

因为实验需要,现在需要再添加一个计算节点。那么问题来了,怎样在不破坏现有环境的基础上,添加一个新的计算节点呢?本文就来研究一下。

新节点配置

网络设置

在新添加的计算节点上,执行以下操作:

1、切换到root用户
sudo -i

2、vim /etc/network/interfaces,设置网卡为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.56.113
netmask 255.255.255.0

auto eth1
iface eth1 inet dhcp

auto eth2
iface eth2 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ifconfig $IFACE promisc

3、启用网卡
ifup eth2

4、修改/etc/hosts,添加:

1
2
3
4
192.168.56.110  controller
192.168.56.111 network
192.168.56.112 compute
192.168.56.113 compute2

python

安装python
apt -y install python-simplejson
不安装的话,在使用ansible的时候会报错/bin/sh: 1: /usr/bin/python: not found。

安装docker

1、安装docker
apt -y install docker.io

2、为docker和kolla创建配置文件

1
2
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/kolla.conf

修改为:

1
2
[Service]
MountFlags=shared

3、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

4、查看docker信息
docker info

密钥登录

1、在控制节点将公钥写入新的计算节点

1
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.11

2、在新的计算节点把voidking用户添加进sudo免密,方便以后的操作
sudo vim /etc/sudoers,添加

1
voidking ALL = NOPASSWD: ALL

控制节点配置

1、配置multinode文件
vim multinode,如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# line 3, change
[control]
#192.168.56.110 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 12, change
[network]
#192.168.56.111 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 17, change
[inner-compute]
#192.168.56.112 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
192.168.56.113 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 21, change
[external-compute]
#192.168.56.112 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
192.168.56.113 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 28, comment
[monitoring]
#monitoring01
# line 36, comment
[storage]
#storage01

2、测试连通
ansible -i multinode -m ping all

3、拷贝kolla.tar到新计算节点
scp kolla.tar voidking@192.168.56.113:~

4、在新计算节点导入所有images
docker load -i kolla.tar

5、在控制节点执行初始化
kolla-ansible -i ./multinode bootstrap-servers
报错如图:

参考《Ubuntu16使用Kolla安装OpenStack》解决。

6、预检查
kolla-ansible -i ./multinode prechecks

7、部署
kolla-ansible -i ./multinode deploy
报错,创建数据库失败。解决办法:取消multinode文件中control节点的注释,然后重新执行部署。
kolla-ansible -i ./multinode deploy --limit @/usr/local/share/kolla-ansible/ansible/site.retry
实际上,site.retry文件里面放的是一个单纯的IP地址192.168.56.113

如上图,等待几分钟后,出现部署成功的提示。

测试使用

新的问题来了,上面的操作显示新的计算节点部署成功,那么,安装过程中有没有对原系统产生影响?我们来测试查看一下。
1、使admin环境生效
source /etc/kolla/admin-openrc.sh

2、查看计算服务
openstack compute service list

如上图,此时已经有了两个计算节点。

3、查看以前的实例
openstack server list

之前的实例还在,没有受到影响,nice。

后记

上面的步骤,完美添加了一个新的计算节点,前提是《Kolla安装OpenStack多节点》一文中的globals.yml等配置文件保持不变。

我很好奇,如果主机清单multinode中的110、111、112三个节点没有添加注释,会不会对它们进行重新安装。于是,我把注释取消,执行了一次kolla-ansible -i ./multinode deploy。实践证明,没啥影响。那么,如果从bootstrap-servers开始执行呢?依次执行bootstrap-servers、prechecks、deploy三条命令会不会重装?于是,先执行bootstrap-servers。然后,卡在了时间同步,卡了一个钟头,遂Ctrl+C放弃。算了算了,不探究了,如无必要勿增实体,还是把精力放在更重要的事情上。

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.voidking.com/dev-ubuntu16-kolla-openstack-multinode/" target="_blank" rel="noopener">《Kolla安装OpenStack多节点》</a>一文中,使用kolla安装了三个节点的openstack。</p> <p>因为实验需要,现在需要再添加一个计算节点。那么问题来了,怎样在不破坏现有环境的基础上,添加一个新的计算节点呢?本文就来研究一下。</p>
AIOps概览 http://voidking.com/dev-aiops-summary/ 2018-11-02T01:00:00.000Z 2018-12-14T02:10:39.549Z AIOps是什么?

运维的发展,经历了手工运维、自动化运维、DevOps、AIOps。

Gartner公司2013提出ITOA(IT Operations Analytics),2016年将ITOA概念升级为AIOps(Algorithmic IT Operations),2017年发现AI越来越火,于是把AIOps重新定义为Artificial Intelligence for IT Operations,也就是智能运维。
AIOps将人工智能应用于运维领域,基于已有的运维数据(日志、监控信息、应用信息等),通过机器学习的方式来进一步解决自动化运维没办法解决的问题。

AIOps的目标是,利用大数据、机器学习和其他分析技术,通过预防预测、个性化和动态分析,直接和间接增强IT业务的相关技术能力,实现所维护产品或服务的更高质量、合理成本及高效支撑。

AIOps做什么?

知识领域

AIOps涉及到行业领域知识、运维场景领域知识和机器学习领域知识,如下图:

团队构成

一个AIOps团队,要有运维工程师、运维开发工程师、运维AI工程师,如下图:

研究方向

研究方向按照时间来分,可以分为针对历史事件、针对当前事件、针对未来事件,如下图:

研究方向按照应用场景来分,可以分为效率提升、质量保障、成本管理,如下图:

AIOps平台

能力分级

AIOps 的建设可以先由无到局部单点探索、再到单点能力完善,形成解决某个局部问题的运维AI“学件” ,再由多个具有 AI 能力的单运维能力点组合成一个智能运维流程。AIOps 能力分级可具体可᧿述为5级,如下图:

1) 开始尝试应用AI能力,还无较成熟单点应用
2) 具备单场景的AI运维能力,可以初步形成供内部使用的学件
3) 有由多个单场景AI运维模块串联起来的流程化AI运维能力,可以对外提供可靠的运维AI学件
4) 主要运维场景均已实现流程化免干预AI运维能力,可以对外提供可靠的AIOps服务。
5) 有核心中枢AI,可以在成本、质量、效率间从容调整,达到业务不同生命周期对三个方面不同的指标要求,可实现多目标下的最优或按需最优。

“学件”(Learnware)一词由南京大学周志华老师原创,学件=模型+规约。

学件,亦称AI运维组件,类似程序中的API或公共库,但API及公共库不含具体业务数据,只是某种算法,而 AI 运维组件(或称学件),则是在类似API的基础上,兼具对某个运维场景智能化解决的“记忆”能力,将处理这个场景的智能规则保存在了这个组件中。

这个智能规则是在一定量的数据下学习而来的,且具有“可重用” 、“可演进”、“可了解”的特性,既可共享由专家利用数据训练的算法,又可保护数据和隐私。

能力框架

基于上述 AIOps 能力分级, 对应的 AIOps 能力框架如下。

能力体系

AIOps工作平台能力体系主要功能是为AIOps的实际场景建设落地而提供功能的工具或者产
品平台,其主要目的是降低AIOps的开发人员成本,提升开发效率,规范工作交付质量。 AIOps平台功能与一般的机器学习(或者数据挖掘)平台极为类似,此类产品国外的比如Google的AutoML

平台要素

AIOps平台从底层到上层应该包含如下要素:

1) 数据源:大量并且种类繁多的 IT 基础设施
2) 大数据平台:用于处理历史和实时的数据
3) 计算与分析:通过已有的 IT 数据产生新的数据,例如数据清洗、去除噪声等
4) 算法:用于计算和分析,以产生 IT 运维场景所需要的结果
5) 机器学习:这里一般指无监督学习,可根据基于算法的分析结果来产生新的算法

AIOps关键技术

数据采集

数据采集负责将智能运维所需要的数据接入至AIOps平台,所接入的运维数据类型一般包括(但不限于)日志数据,性能指标数据,网络抓包数据,用户行为数据,告警数据,配置管理数据,运维流程类数据等。

数据采集方式可分为无代理采集以及有代理采集两种。其中无代理采集为服务端采集,支持SNMP、数据库JDBC、TCP/UDP监听、SYSLOG、Web Service,消息队列采集等主流采集方式。有代理采集则用于本地文件或目录采集,容器编排环境采集,以及脚本采集等。

数据处理

1) 数据字段提取:通过正则解析,KV解析,分隔符解析等解析方式提取字段
2) 规范化数据格式:对字段值类型重定义和格式转换
3) 数据字段内容替换:基于业务规则替换数据字段内容,比如必要的数据脱敏过程,同时可实现无效数据、缺失数据的替换处理
4) 时间规范化:对各类运维数据中的时间字段进行格式统一转换
5) 预聚合计算:对数值型字段或指标类数据基于滑动时间窗口进行聚合统计计算,如取1分钟CPU平均值

数据存储

1) 数据需要进行实时全文检索,分词搜索。可选用主流的 ElasticSearch 引擎
2) 时间序列数据(性能指标),主要以时间维度进行查询分析的数据,可选用主流的rrdtool、graphite、influxdb等时序数据库
3) 关系类数据,以及会聚集在基于关系进行递归查询的数据可选择图数据库
4) 数据的长期存储和离线挖掘以及数据仓库构建,可选用主流的 Hadoop、Spark 等大数据平台

离线和在线计算

离线计算:针对存储的历史数据进行挖掘和批量计算的分析场景,用于大数据量的离线模型训练和计算,如挖掘告警关联关系,趋势预测/容量预测模型计算,错误词频分析等场景。

在线计算:对流处理中的实时数据进行在线计算,包括但不限于数据的查询、预处理和统计分析,数据的实时异常检测,以及部分支持实时更新模型的机器学习算法运用等。主流的流处理框架包括:Spark Streaming、Kafka Streaming、Flink、Storm等。

算法技术

运维场景通常无法直接基于通用的机器学习算法以黑盒的方式解决,因此需要一些面向AIOps 的算法技术,作为解决具体运维场景的基础。
1) 指标趋势预测:通过分析指标历史数据,判断未来一段时间指标趋势及预测值,常见有Holt-Winters、时序数据分解、ARIMA等算法。该算法技术可用于异常检测、容量预测、容量规划等场景。
2) 指标聚类: 根据曲线的相似度把多个 KPI 聚成多个类别。该算法技术可以应用于大规模的指标异常检测:在同一指标类别里采用同样的异常检测算法及参数,大幅降低训练和检测开销。常见的算法有DBSCAN、K-medoids、CLARANS等,应用的挑战是数据量大,曲线模式复杂。
3) 多指标联动关联挖掘: 多指标联动分析判断多个指标是否经常一起波动或增长。该算法技术可用于构建故障传播关系,从而应用于故障诊断。常见的算法有Pearson correlation、Spearman correlation、Kendall correlation等,应用的挑战为KPI种类繁多,关联关系复杂。
4) 指标与事件关联挖掘: 自动挖掘文本数据中的事件与指标之间的关联关系( 比如在程序 A 每次启动的时候 CPU 利用率就上一个台阶)。该算法技术可用于构建故障传播关系,从而应用于故障诊断。常见的算法有 Pearson correlation、J-measure、Two-sample test等,应用的挑战为事件和KPI种类繁多,KPI测量时间粒度过粗会导致判断相关、先后、单调关系困难。
5) 事件与事件关联挖掘: 分析异常事件之间的关联关系,把历史上经常一起发生的事件关联在一起。该算法技术可用于构建故障传播关系,从而应用于故障诊断。常见的算法有 FP-Growth、Apriori、随机森林等,但前提是异常检测需要准确可靠。
6) 故障传播关系挖掘:融合文本数据与指标数据,基于上述多指标联动关联挖掘、指标与事件关联挖掘、事件与事件关联挖掘等技术、由 tracing 推导出的模块调用关系图、辅以服务器与网络拓扑,构建组件之间的故障传播关系。该算法技术可以应用于故障诊断,其有效性主要取决于其基于的其它技术。

顶会推荐

ACM SIGCOMM
ACM IMC
ACM/USENIX NSDI
ACM MobiSys
ACM CoNEXT
ACM MobiCom
ACM SIGMETRICS
IEEE INFOCOM
ACM KDD
USENIX Security
IEEE Security & Privacy
ACM CCS
NDSS

后记

总而言之,AIOps就是利用机器学习来做一些运维工作。涉及到行业知识、运维知识、机器学习知识,是一个很大的研究方向,可以细分为很多小的研究方向。

AIOps围绕质量保障、成本管理和效率提升的基本运维场景,逐步构建智能化运维场景。在质量保障方面,保障现网稳定运行细分为异常检测、故障诊断、故障预测、故障自愈等基本场景;在成本管理方面,细分为指标监控,异常检测,资源优化,容量规划,性能优化等基本场景;在效率方面,分为智能预测,智能变更、智能问答,智能决策等基本场景(注:三者之间不是完全独立的,是相互影响的,场景的划分侧重于主影响维度)。

每一个小方向,都是一个研究点,最终成果是一个学件。通过学件的组合,就构成了AIOps平台。

更多内容请参考书签中给出的链接。

书签

基于机器学习的智能运维
基于机器学习的智能运维-ppt
《企业级 AIOps 实施建议》白皮书-V0.6 版本

]]>
<h1 id="AIOps是什么?"><a href="#AIOps是什么?" class="headerlink" title="AIOps是什么?"></a>AIOps是什么?</h1><p>运维的发展,经历了手工运维、自动化运维、DevOps、AIOps。</p> <p>Gartner公司2013提出ITOA(IT Operations Analytics),2016年将ITOA概念升级为AIOps(Algorithmic IT Operations),2017年发现AI越来越火,于是把AIOps重新定义为Artificial Intelligence for IT Operations,也就是智能运维。<br>AIOps将人工智能应用于运维领域,基于已有的运维数据(日志、监控信息、应用信息等),通过机器学习的方式来进一步解决自动化运维没办法解决的问题。</p> <p>AIOps的目标是,利用大数据、机器学习和其他分析技术,通过预防预测、个性化和动态分析,直接和间接增强IT业务的相关技术能力,实现所维护产品或服务的更高质量、合理成本及高效支撑。</p>
Win10开热点 http://voidking.com/love-win10-wifi/ 2018-09-13T09:00:00.000Z 2018-12-14T02:05:33.278Z 问题描述

magicbook,使用wifi共享大师、猎豹免费wifi开热点,出现了一个十分诡异的问题:
启动热点后,使用手机连接热点,可以正常上网,可以访问电脑上的ftp等服务。
但是,如果手机息屏了,大概30秒后,打开手机依然显示wifi连接正常,但是无法再上网,无法再访问电脑的服务。必须先断开连接,然后重新连接wifi,才能恢复正常,非常麻烦。

尝试

修改网卡电源管理,去掉“允许计算机关闭此设备以节约电源”前的勾,不行。
回退网卡驱动版本,不行。
换成360wifi、wifi共享精灵,不行。
尝试了国外的connectfy、mhotspot,质量还不如国内的软件。换了几个版本,收费就算了,可以破解,但是有的窗口无法拖动,有的广告很多,有的读不出网卡,有的干脆启动后没反应。。。服!!!

解决办法

在尝试各种解决办法的过程中,发现win10其实自带移动热点的功能。但是,使用自带的移动热点,有时连接不上,有时连上没多久就掉线,还不如用第三方软件。

不过,峰回路转,在某次尝试的过程中,把网络频带固定为2.4GHz,居然,好了!再没有任何毛病!不会连接不上,也不会自动断开!

整个设置过程如下:

1、右键右下角网络图标,选择打开“网络和Internet”设置。
2、点击“移动热点”,“编辑”。
3、设置网络名称和密码,重点是网络频带选择2.4GHz,切记!
4、然后,就能开开心心上网了,再也没有出现过自动断开的情况,比所有的wifi共享软件都好用!

如果出现其他问题,参考知乎:win10系统开启移动热点一段时间后就自动关闭了怎么办?

注意

假设电脑IP为172.20.110.235,需要特别注意的是:
1、在使用第三方软件(比如wifi共享大师)开热点时,如果电脑要启动ftp服务给手机访问,那么需要绑定ftp服务的地址为172.20.110.235。ftp下载速度很快,大概20MB/s。
2、在使用win10自带的“移动热点”开热点时,如果电脑要启动ftp服务给手机访问,那么需要绑定ftp服务的地址为192.168.137.1。ftp下载速度很慢,大概2MB/s。如果想要加速到20MB/s,那么网络频带选择5GHz,这时有些设备无法连接。

很神奇,如果不这么设置,就访问不到ftp服务。由上面的经验可以总结如下:
如果使用win10自带的移动热点,那么此时的虚拟网卡相当于插在电脑上的一块网卡,可以通过访问它的IP而访问到电脑里的服务。
如果使用第三方软件,那么此时的虚拟网卡相当于路由器,所以访问它的IP只是访问到了路由器,需要访问电脑的IP才能访问到电脑的服务。

]]>
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>magicbook,使用wifi共享大师、猎豹免费wifi开热点,出现了一个十分诡异的问题:<br>启动热点后,使用手机连接热点,可以正常上网,可以访问电脑上的ftp等服务。<br>但是,如果手机息屏了,大概30秒后,打开手机依然显示wifi连接正常,但是无法再上网,无法再访问电脑的服务。必须先断开连接,然后重新连接wifi,才能恢复正常,非常麻烦。</p>
左神排序算法文字总结 http://voidking.com/dev-zuo-sort/ 2018-08-30T09:00:00.000Z 2018-12-14T01:44:34.108Z 前言

相见恨晚!看了左神的算法视频,才知道自己到底浪费了多少时间。算法,居然能讲的这么有意思,居然能讲的这么通俗易懂!左神,不愧是左“神”!

《leetcode刷题记录-排序算法总结》一文中,也总结过排序算法,但是和左神的讲解一比,简直就是渣渣。所以,本文按照左神的讲解,再次总结一下排序算法。

排序算法

常见的排序算法有9个,分别是冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序、计数排序和基数排序。它们的时间空间复杂度如下:

算法时间复杂度空间复杂度稳定性
冒泡排序$O(N^2)$$O(1)$稳定
选择排序$O(N^2)$$O(1)$不稳定
插入排序$O(N^2)$$O(1)$稳定
归并排序$O(N*logN)$$O(N)$稳定
快速排序$O(N*logN)$$O(logN)到O(N)$不稳定
堆排序$O(N*logN)$$O(1)$不稳定
希尔排序$O(N*logN)$$O(1)$不稳定
计数排序$O(N)$$O(M)$稳定
基数排序$O(N)$$O(M)$稳定

注:M代表桶数量。

如上图,按照时间复杂度的不同,分为三大类。
以下算法描述,实现的都是升序排序,N代表元素个数,a[i]代表i位置的元素。

笨蛋算法

冒泡排序

1、依次比较,a[i] < a[i+1] 则交换元素,结果最大元素位于N-1位置
2、范围缩小1

选择排序

1、0到N-1选出最小元素放在0位置(交换元素即可)
2、1到N-1选出最小元素放在1位置

插入排序

1、1位置和0位置元素比较,小则交换
2、2位置和1位置元素比较,小则交换;1位置和0位置元素比较,小则交换

聪明算法

归并排序

1、数组分割成长度为1的有序区间
2、有序区间两两合并,得到长度为2的有序区间

快速排序

1、数组中随机选择一个数,小于等于这个数的元素放左,大于这个数的元素放右
2、左右两边递归

快速划分过程:
(1)左区间初始值为0,划分值放在N-1位置
(2)遍历数组,元素大于划分值则跳过,小于等于划分值则交换该元素与左区间加一的元素,到N-1位置则交换划分值与左区间加一的元素。

堆排序

1、已有大根堆(数组表示),把堆顶元素与最后一个元素交换,交换后最后一个元素有序
2、调整后,把堆顶元素与倒第二个元素交换,交换后最后两个元素有序

希尔排序

1、设定初始步长,按照步长比较元素大小并交换
2、步长减一,比较元素大小并交换

注:希尔排序是改良版的插入排序

变态算法

计数排序

1、建立0-M号桶
2、把元素按大小放入对应桶
3、依次把0-M号桶中的元素倒出

基数排序

1、准备0-9号桶
2、元素按个位数放入对应桶
3、依次把0-9号桶中的元素倒出(先进先出),成为序列
4、按序列把元素按十位数放入对应桶

注:计数排序和基数排序都属于桶排序的实现,桶排序是一种排序思想。

后记

好记性不如烂笔头,后续计划对其他算法也进行总结。

书签

牛客算法基础班

牛客算法进阶班

直通BAT — 求职算法精品课

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>相见恨晚!看了左神的算法视频,才知道自己到底浪费了多少时间。算法,居然能讲的这么有意思,居然能讲的这么通俗易懂!左神,不愧是左“神”!</p> <p><a href="https://www.voidking.com/dev-leetcode-sort/" target="_blank" rel="noopener">《leetcode刷题记录-排序算法总结》</a>一文中,也总结过排序算法,但是和左神的讲解一比,简直就是渣渣。所以,本文按照左神的讲解,再次总结一下排序算法。</p>
使用frp进行内网穿透 http://voidking.com/dev-frp/ 2018-08-16T06:00:00.000Z 2018-12-14T08:01:58.459Z 前言

《使用lanproxy进行内网穿透》一文中,小编使用lanproxy搭建了一个内网穿透服务,并且介绍了使用方法。

但是,不知道最近出了什么幺蛾子,居然无法再提供内网穿透服务。本文,就研究一下另外一个内网穿透工具frp。主要参考frp内网穿透搭建,超级简单实用

准备

1、一台公网服务器(centos7,运行frp-server)。
2、一台内网pc或服务器(运行frp-client)。

服务端配置

安装frp

1、进入/opt目录
cd /opt

2、访问frp项目,下载最新版的frp,这里下载frp_0.21.0_linux_amd64.tar.gz(包含服务端和客户端)。
curl -C - -O -L https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz

3、解压并重命名
tar -xzvf frp_0.21.0_linux_amd64.tar.gz

mv frp_0.21.0_linux_amd64 frp

4、编辑frps.ini
cd frp && vim frps.ini,参考frps_full.ini,修改如下:

1
2
3
4
5
6
7
8
9
[common]
bind_addr = 0.0.0.0
bind_port = 7000

dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = voidking
dashboard_pwd = voidking
token = 12345678

5、启动frps
./frps -c ./frps.ini

后台启动:screen ./frps -c ./frps.ini,然后ctrl+A+D。

6、测试访问
在浏览器访问 http://120.77.36.182:7500 ,输入用户名和密码,即可看到frp dashboard。

nginx反向代理

1、添加域名解析frp到公网ip。

2、在/etc/nginx/conf.d/目录中,添加frp.voidking.com.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
server_name frp.voidking.com;
charset utf-8;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1024m;
client_body_buffer_size 128k;
client_body_temp_path data/client_body_temp;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path data/proxy_temp;

proxy_pass http://127.0.0.1:7500;
}
}

3、重启nginx
/usr/sbin/nginx -t,如果提示缺少目录,那么mkdir -p创建。

/usr/sbin/nginx -s reload

4、测试访问
访问 http://frp.voidking.com/ ,同样可以看到dashboard界面。

至此,服务端配置完成。

客户端配置

windows

1、访问frp项目,下载最新版的frp,这里下载frp_0.21.0_windows_amd64.zip(包含服务端和客户端)。

2、解压frp_0.21.0_windows_amd64.zip,并重命名为frp。

3、编辑frp/frpc.ini文件,修改为:

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 120.77.36.182
server_port = 7000
token = 12345678

[web_3480]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 3480

server_addr是服务器端的公网IP地址,server_port是frp服务端口号,auto_token是连接服务器的口令,必须和服务器保持一致。

web_3480是客户端和服务端之间的通道名,每个客户端必须不一样,remote_port是服务器端对外提供本机服务的端口号。

4、启动客户端
shift+右键,在此处打开powershell窗口,然后执行:
.\frpc.exe -c .\frpc.ini

5、本地启动web服务,在80端口提供服务。

5、测试访问
在浏览器访问 http://120.77.36.182:3480 ,即可看到本地80服务。

linux

1、进入/opt目录
cd /opt

2、访问frp项目,下载最新版的frp,这里下载frp_0.21.0_linux_amd64.tar.gz(包含服务端和客户端)。
curl -C - -O -L https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz

3、解压并重命名
tar -xzvf frp_0.21.0_linux_amd64.tar.gz

mv frp_0.21.0_linux_amd64 frp

4、编辑frps.ini
cd frp && vim frpc.ini,修改如下:

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 120.77.36.182
server_port = 7000
token = 12345678

[ssh_3422]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 3422

5、启动客户端
./frpc -c ./frpc.ini

6、测试登录
使用xshell连接本地服务器,IP填入120.77.36.182,端口填入3422,顺利连接。

结语

至此,大功告成,nice。frp和lanproxy相比,安装更加简便(不需要java环境),配置更加方便(客户端自己控制外网端口)。最重要的是,在使用centos7作为frp外网服务器的时候,不会出现无法代理22的问题。

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.voidking.com/dev-lanproxy/" target="_blank" rel="noopener">《使用lanproxy进行内网穿透》</a>一文中,小编使用lanproxy搭建了一个内网穿透服务,并且介绍了使用方法。</p> <p>但是,不知道最近出了什么幺蛾子,居然无法再提供内网穿透服务。本文,就研究一下另外一个内网穿透工具frp。主要参考<a href="https://blog.csdn.net/qq_25351621/article/details/78947477" target="_blank" rel="noopener">frp内网穿透搭建,超级简单实用</a>。</p>
Kolla安装OpenStack多节点 http://voidking.com/dev-ubuntu16-kolla-openstack-multinode/ 2018-08-13T01:00:00.000Z 2018-12-14T02:11:11.992Z 前言

《Ubuntu16使用Kolla安装OpenStack》一文中,使用kolla安装了单节点的openstack。

在实际的部署中,当然要安装多节点的openstack,本文就来研究一下在多个节点上使用kolla安装部署openstack的方法。

环境

VirtualBox虚拟机三台,系统为ubuntu-16.04.4-server-amd64,分别作为控制节点、网络节点和计算节点,用户名为voidking/root,密码为voidking。
控制节点4核8G内存40G存储,主机名为controller,eth0的IP为192.168.56.110,eth1为nat上网网卡,eth2为neutron服务网络。
网络节点2核4G内存40G存储,主机名为network,eth0的IP为192.168.56.111,eth1为nat上网网卡,eth2为neutron服务网络。
计算节点2核4G内存40G存储,主机名为compute,eth0的IP为192.168.56.112,eth1为nat上网网卡,eth2为neutron服务网络。

准备

网络设置

在控制节点上,执行以下操作:

1、切换到root用户
sudo -i

2、vim /etc/network/interfaces,设置网卡为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.56.110
netmask 255.255.255.0

auto eth1
iface eth1 inet dhcp

auto eth2
iface eth2 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ifconfig $IFACE promisc

3、启用网卡
ifup eth2

4、修改/etc/hosts,添加:

1
2
3
192.168.56.110  controller
192.168.56.111 network
192.168.56.112 compute

网络节点和计算节点参考控制节点配置即可。

python

在三台机器上安装python
sudo apt -y install python-simplejson
不安装的话,在使用ansible的时候会报错/bin/sh: 1: /usr/bin/python: not found。

安装docker

1、在三台机器上安装docker
curl -SSL https://get.docker.io | bash

或者:
apt install docker.io

2、为docker和kolla创建配置文件

1
2
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/kolla.conf

修改为:

1
2
[Service]
MountFlags=shared

3、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

4、查看docker信息
docker info

如果报错的话,参考《Ubuntu16使用Kolla安装OpenStack》解决。

加速镜像拉取

使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此DaoCloud推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。

1、访问DaoCloud官网,注册一个账号。

2、访问配置 Docker 加速器,可以获得一个专属加速地址(每次访问都会获得不同的地址)。

3、参考Docker 加速器,创建或修改 /etc/docker/daemon.json,内容为:

1
2
3
4
5
6
{
"registry-mirrors": [
"http://2fd0f33c.m.daocloud.io"
],
"insecure-registries": []
}

4、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

PS:也可以使用阿里云的镜像加速器

密钥登录

1、在控制节点生成密钥
ssh-keygen,连续回车即可。

2、将公钥写入三台机器

1
2
3
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.110
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.111
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.112

3、在三台机器把voidking用户添加进sudo免密,方便以后的操作
sudo vim /etc/sudoers,添加

1
voidking ALL = NOPASSWD: ALL

控制节点

主要参考OpenStack, Ansible, and Kolla on Ubuntu 16.04kolla queens on centos7.4Kolla-Ansible’s documentation!

安装依赖

1、安装并升级pip

1
2
3
apt-get update
apt-get install python-pip
pip install --upgrade pip

2、安装依赖
apt-get -y install python-dev libffi-dev gcc libssl-dev python-selinux

3、安装ansible

1
2
3
4
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible

4、vim /etc/ansible/ansible.cfg,添加如下:

1
2
3
4
5
line 10, add
[defaults]
host_key_checking=False
pipelining=True
forks=100

安装Kolla-ansible

1、安装kolla-ansible
pip install kolla-ansible

报错:ImportError: cannot import name main,参考升级pip后出现ImportError: cannot import name main,编辑/usr/bin/pip文件,如下修改:

1
2
3
4
# line 9, change
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())

报红:oslo-config 6.4.0 has requirement PyYAML>=3.12, but you’ll have pyyaml 3.11 which is incompatible.忽略。

2、拷贝globals.yml和passwords.yml到/etc/kolla目录
cp -r /usr/local/share/kolla-ansible/etc_examples/kolla /etc/

3、拷贝all-in-one和multinode清单文件到当前目录
cp /usr/local/share/kolla-ansible/ansible/inventory/* .

4、生成kolla密码
kolla-genpwd
我们部署中使用的密码存储在/etc/kolla/passwords.yml文件中。此文件中的所有密码都是空白的,必须手动填写或运行随机密码生成器。

5、配置multinode文件
vim multinode,如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# line 3, change
[control]
192.168.56.110 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 12, change
[network]
192.168.56.111 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 17, change
[inner-compute]
192.168.56.112 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 21, change
[external-compute]
192.168.56.112 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 28, comment
[monitoring]
#monitoring01
# line 36, comment
[storage]
#storage01

6、测试连通
ansible -i multinode -m ping all
报错:ERROR! to use the ‘ssh’ connection type with passwords, you must install the sshpass program
安装sshpass:apt install sshpass
然后重新测试连通。

配置globals.yml

1、查看globals.yml配置
grep -vE '^$|^#' /etc/kolla/globals.yml

2、vim /etc/kolla/globals.yml,如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# line 15,uncomment
kolla_base_distro: "centos"
# line 18,uncomment
kolla_install_type: "binary"
# line 21,uncomment and change
openstack_release: "queens"
# line 31,change
kolla_internal_vip_address: "192.168.56.120"
# line 85,uncomment and change
network_interface: "eth0"
# line 100,uncomment and change
neutron_external_interface: "eth2"
# line 331,uncomment
designate_backend: "bind9"
designate_ns_record: "sample.openstack.org"
# line 340,uncomment and change
nova_compute_virt_type: "qemu"
# other
tempest_image_id:
tempest_flavor_ref_id:
tempest_public_network_id:
tempest_floating_network_name:

因为是在虚拟机中安装openstack,所以nova_compute_virt_type设置为qemu。

部署

1、初始化
kolla-ansible -i ./multinode bootstrap-servers
时间很久,请耐心等待。

2、预检查
kolla-ansible -i ./multinode prechecks

3、拉取镜像
kolla-ansible -i ./multinode pull
这一步的时间特别久,挺耐心等待。如果拉取失败,就多尝试几次。
这里小编取巧一下,直接把《Ubuntu16使用Kolla安装OpenStack》一文中的images拷贝到控制节点、网络节点和计算节点。

(1)打包所有images
docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o kolla.tar

(2)导入所有images
docker load -i kolla.tar

4、查看镜像
docker images

5、部署
kolla-ansible -i ./multinode deploy

测试使用openstack

1、在控制节点安装openstack客户端
pip install python-openstackclient python-glanceclient python-neutronclient --ignore-installed

2、生成admin-openrc.sh等
kolla-ansible post-deploy

3、使admin环境生效
source /etc/kolla/admin-openrc.sh

4、查看计算服务
openstack compute service list

5、查看网络服务
openstack network agent list

初始化配置

1、执行init-runonce脚本
. /usr/local/share/kolla-ansible/init-runonce

2、根据提示,创建实例

1
2
3
4
5
6
openstack server create \
--image cirros \
--flavor m1.tiny \
--key-name mykey \
--nic net-id=25e6c0ef-6a0a-481c-a08a-46f7ef67ad3e \
demo1

3、给demo1实例分配浮动IP

1
2
3
4
source /etc/kolla/admin-openrc.sh
openstack network list
openstack floating ip create public1
openstack server add floating ip demo1 10.0.2.157

4、查看demo1
openstack server list

5、访问horizon服务
curl 192.168.56.120 -L

在浏览器访问 http://192.168.56.120 ,使用admin账号登录,密码在passwords.yml文件中查看。
less /etc/kolla/passwords.yml | grep keystone_admin_password

至此,使用kolla安装部署多节点openstack成功。

网络配置

网络节点

关于网络的配置,主要参考Kolla配置实例网络

1、在网络节点编辑/etc/network/interfaces,添加:

1
2
3
4
auto br-ex
iface br-ex inet static
address 10.0.2.1
netmask 255.255.255.0

2、启用br-ex
ifup br-ex

3、添加路由

1
2
3
ip netns
ip netns exec qrouter-9dbabbdd-cc45-42c3-b9e0-9dbbc03e66f1 ip add
route add -net 10.0.0.0/24 gw 10.0.2.153 dev br-ex

4、在网络节点连通demo1

1
2
ping 10.0.2.157 -c3
ping 10.0.0.3 -c3

5、设置demo1上网

1
2
3
4
iptables -I INPUT -i eth2 -j ACCEPT
iptables -I INPUT -i br-ex -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE

设置永久生效参考《Linux配置SNAT上网》

控制节点

1、添加路由
route add -net 10.0.2.0/24 gw 192.168.56.110 dev eth0

2、在控制节点连通demo1
ping 10.0.2.157 -c3

3、连接demo1
ssh cirros@10.0.2.157

4、测试外网连通
ping 8.8.8.8 -c3

书签

Kolla’s documentation!

Kolla让OpenStack部署更贴心

Kolla安装Ocata单节点

kolla部署openstack ocata版

Install and configure OpenStack Ocata with Kolla as a standalone

Kolla OpenStack系统视频课程

利用kolla快速搭建openstack-pike多节点

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.voidking.com/dev-ubuntu16-kolla-openstack-all-in-one/" target="_blank" rel="noopener">《Ubuntu16使用Kolla安装OpenStack》</a>一文中,使用kolla安装了单节点的openstack。</p> <p>在实际的部署中,当然要安装多节点的openstack,本文就来研究一下在多个节点上使用kolla安装部署openstack的方法。</p>
Ansible实战 http://voidking.com/dev-ansible-in-action/ 2018-08-08T11:00:00.000Z 2018-12-14T02:11:11.802Z 目标

本文,目标是使用ansible安装lnmp+haproxy。
共四台主机,都是ubuntu14 server版,一台作为ansible管理机,另外三台作为ansible客户机用来部署服务。
客户机A安装nginx+php+mysql,客户机B安装nginx+php,客户机C安装haproxy用来负载均衡。如下图:

设计

项目结构参考最佳实践-Content Organization,如下图:

注意点:

  • 角色分配简单明确。
  • 在hosts中分组添加变量,指定安装软件。
  • 二次执行脚本时不能影响已经安装的服务。

安装流程

1、添加密钥
2、设置sudo免密
3、更新安装源
4、时间同步
5、安装nginx+php+mysql+haproxy
6、检查安装

实践

文件准备

1、创建项目lnmp
mkdir lnmp && cd lnmp

2、创建角色目录
mkdir roles
mkdir -p roles/{1_key,2_sudo,3_sources,4_chrony,5_software,6_check}/{tasks,handlers,vars,files,templates}

3、创建变量目录
mkdir group_vars host_vars

4、创建hosts文件,分配安装组,内容如下:

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
[base]
192.168.56.102
192.168.56.103
192.168.56.104

[nginx_php_mysql]
192.168.56.102

[nginx_php]
192.168.56.103

[haproxy]
192.168.56.104

[base:vars]
install_nginx=false
install_php=false
install_mysql=false
install_haproxy=false

[nginx_php_mysql:vars]
install_nginx=true
install_php=true
install_mysql=true
install_haproxy=false

[nginx_php:vars]
install_nginx=true
install_php=true
install_mysql=false
install_haproxy=false

[haproxy:vars]
install_nginx=false
install_php=false
install_mysql=false
install_haproxy=true

5、创建site.yml文件,内容为:

1
2
3
4
5
6
7
8
9
10
---
- hosts: all
gather_facts: false
roles:
- 1_key
- 2_sudo
- 3_sources
- 4_chrony
- 5_software
- 6_check

6、关闭第一次使用ansible连接客户端时命令提示
sudo vim /etc/ansible/ansible.cfg,如下修改

1
2
# line 62, uncomment
host_key_checking = False

添加密钥

1、设置用户和密码
vim group_vars/base.yml,内容为:

1
2
3
4
5
---
ansible_ssh_user: voidking
ansible_ssh_pass: voidking
ansible_sudo: voidking
ansible_sudo_pass: voidking

2、vim test.yml,内容为:

1
2
3
4
5
6
---
- hosts: all
vars_files:
- group_vars/base.yml
roles:
- 1_key

3、vim roles/1_key/tasks/main.yml,内容为:

1
2
3
4
5
6
7
8
9
10
11
---
- name: copy public key
copy:
src: /home/voidking/.ssh/id_rsa.pub
dest: /home/voidking/.ssh/id_rsa.pub.tmp
owner: voidking
group: voidking
mode: 0600
force: yes
- name: add public key
shell: cd /home/voidking/.ssh && cat id_rsa.pub.tmp | tee >> authorized_keys

4、vim test_hosts,内容为:

1
2
[test]
192.168.56.102

5、执行脚本

1
2
ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

5、在客户端查看结果
ll .ssh

6、测试登录
ssh voidking@192.168.56.102

sudo免密

1、vim test.yml,内容为:

1
2
3
4
5
6
7
---
- hosts: all
vars_files:
- group_vars/base.yml
roles:
#- 1_key
- 2_sudo

2、vim roles/2_sudo/tasks/main.yml,内容为:

1
2
3
4
---
- name: add sudo user
shell: 'sudo sh -c "echo voidking ALL = NOPASSWD: ALL >> /etc/sudoers"'
#shell: 'echo "voidking ALL = NOPASSWD: ALL" | sudo tee >> /etc/sudoers'

3、执行脚本

1
2
ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts -s

4、在客户端查看结果
sudo ls

sudo免密2

上面的方法,虽然成功添加了sudo,但是从提示我们看出,在shell模块中sudo马上就不能使用了。

1、vim roles/2_sudo/tasks/main.yml,修改如下:

1
2
3
4
5
---
- name: add sudo user
become_user: root
become: true
shell: "echo voidking ALL = NOPASSWD: ALL >> /etc/sudoers"

2、执行脚本

1
2
ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

更新安装源

1、vim test.yml,内容为:

1
2
3
4
5
6
7
8
---
- hosts: all
vars_files:
- group_vars/base.yml
roles:
#- 1_key
#- 2_sudo
- 3_sources

2、vim roles/3_sources/files/sources.list,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
deb http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
##測試版源
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse
# 源碼
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
##測試版源
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse
# Canonical 合作夥伴和附加
# deb http://archive.canonical.com/ubuntu/ trusty partner
# deb http://extras.ubuntu.com/ubuntu/ trusty main

3、vim roles/3_sources/tasks/main.yml,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
---
- name: replace sources.list
copy:
src: ../files/sources.list
dest: /etc/apt/sources.list
force: yes
- name: update
become_user: root
become: true
shell: apt update
- name: upgrade
become_user: root
become: true
apt:
upgrade: yes

4、执行脚本

1
2
ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

时间同步

管理机准备

1、管理机安装chrony
apt -y install chrony

2、重启chrony
service chrony restart

3、拷贝chrony.conf
cp /etc/chrony/chrony.conf roles/4_chrony/files/

4、vim roles/4_chrony/files/chrony.conf,如下修改:

1
2
3
4
5
6
7
# line 20,comment
#server 0.debian.pool.ntp.org offline minpoll 8
#server 1.debian.pool.ntp.org offline minpoll 8
#server 2.debian.pool.ntp.org offline minpoll 8
#server 3.debian.pool.ntp.org offline minpoll 8
# line 24,add
server 192.168.56.101 iburst

playbook配置

1、vim test.yml,内容为:

1
2
3
4
5
6
7
8
9
---
- hosts: all
vars_files:
- group_vars/base.yml
roles:
#- 1_key
#- 2_sudo
#- 3_sources
- 4_chrony

2、vim group_vars/base.yml,内容为:

1
2
3
4
5
6
7
8
---
ansible_ssh_user: voidking
ansible_ssh_pass: voidking
ansible_sudo: voidking
ansible_sudo_pass: voidking
ansible_become_user: root
ansible_become_pass: voidking
ansible_become: true

3、vim roles/4_chrony/tasks/main.yml,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
- name: install chrony
apt:
name: chrony
state: latest
- name: change config
copy:
src: ../files/chrony.conf
dest: /etc/chrony/chrony.conf
owner: root
group: root
mode: 0644
force: yes
- name: restart chrony
service:
name: chrony
state: restarted

4、执行脚本

1
2
ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

5、在客户机验证chrony
chronyc sources

安装核心软件

1、vim test_hosts,内容为:

1
2
3
4
5
6
7
8
[test]
192.168.56.102

[test:vars]
install_nginx=true
install_php=true
install_mysql=true
install_haproxy=true

2、vim test.yml,内容为:

1
2
3
4
5
6
7
8
9
10
---
- hosts: all
vars_files:
- group_vars/base.yml
roles:
#- 1_key
#- 2_sudo
#- 3_sources
#- 4_chrony
- 5_software

3、vim roles/5_software/tasks/main.yml,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
---
- name: install nginx
apt:
name: nginx
state: latest
when: install_nginx
- name: install php
apt:
name: "{{item}}"
state: latest
update_cache: yes
with_items:
- php5
- libapache2-mod-php5
- php5-mcrypt
- php5-curl
- php5-imagick
- php5-cli
- php5-json
- php5-fpm
- php5-mysql
when: install_php
- name: install mysql
apt:
name: "{{item}}"
state: latest
with_items:
- mysql-common
- mysql-server
- mysql-client
- python-mysqldb
when: install_mysql
- name: config mysql passwd
mysql_user:
login_user: root
login_password: "\n"
name: root
password: "voidking"
host: "{{item}}"
priv: '*.*:ALL,GRANT'
state: present
check_implicit_admin: yes
with_items:
- "localhost"
- "%"
when: install_mysql
- name: comment bind-address
shell: sed -i 's/^bind-address/#bind-address/g' /etc/mysql/my.cnf
when: install_mysql
- name: restart mysql service
service:
name: mysql
state: restarted
enabled: true
when: install_mysql
- name: install haproxy
apt:
name: haproxy
state: latest
environment:
RUNLEVEL: 1
when: install_haproxy
- name: config haproxy
shell: sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/haproxy
when: install_haproxy
- name: config haproxy port
copy:
src: ../files/haproxy.cfg
dest: /etc/haproxy/haproxy.cfg
force: yes
when: install_haproxy
- name: restart haproxy
service:
name: haproxy
state: restarted
when: install_haproxy

4、vim roles/5_software/files/haproxy.cfg,内容为

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
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon

defaults
log global
mode http
option httplog
option dontlognull
contimeout 5000
clitimeout 50000
srvtimeout 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

frontend http_front
bind *:8080
stats uri /haproxy?stats
default_backend http_back

backend http_back
balance roundrobin
option httpchk GET /index.html
option forwardfor header X-Forwarded-For
server node1 192.168.56.102:80 check inter 2000 rise 3 fall 3 weight 30
server node2 192.168.56.103:80 check inter 2000 rise 3 fall 3 weight 30

5、执行脚本

1
2
ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

6、在客户机测试
mysql -uroot -p -h 192.168.56.102

curl localhost

curl localhost:8080

整合所有步骤

1、执行脚本

1
2
ansible-playbook site.yml -i hosts --syntax-check
ansible-playbook site.yml -i hosts

2、查看安装

1
2
3
curl 192.168.56.102
curl 192.168.56.103
curl 192.168.56.104:8080

检查安装

1、vim site.yml,修改为:

1
2
3
4
5
6
7
8
9
10
---
- hosts: all
gather_facts: false
roles:
#- 1_key
#- 2_sudo
#- 3_sources
#- 4_chrony
#- 5_software
- 6_check

2、vim roles/6_check/tasks/main.yml,内容为:

1
2
3
4
5
6
7
---
- name: copy index.html
template:
src: ../templates/index.j2
dest: /usr/share/nginx/html/index.html
force: yes
when: install_nginx

3、vim roles/6_check/templates/index.j2,内容为:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<body>
{{ ansible_eth0.ipv4.address }}
</body>
</html>

PS:查看变量ansible 192.168.56.102 -m setup > var.txt

4、执行脚本

1
2
ansible-playbook site.yml -i hosts --syntax-check
ansible-playbook site.yml -i hosts

5、测试访问
curl 192.168.56.104:8080

多次执行,可以看到两个不同的IP会来回切换。

源码分享

项目地址:https://github.com/voidking/lnmp.git

书签

Ansible Documentation

Ansible中文权威指南

Ansible精讲

烂泥:高负载均衡学习haproxy之安装与配置

HAproxy 配置参数详解

]]>
<h1 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h1><p>本文,目标是使用ansible安装lnmp+haproxy。<br>共四台主机,都是ubuntu14 server版,一台作为ansible管理机,另外三台作为ansible客户机用来部署服务。<br>客户机A安装nginx+php+mysql,客户机B安装nginx+php,客户机C安装haproxy用来负载均衡。如下图:<br><img src="http://cdn.voidking.com//imgs/ansible-in-action/structure.jpg?imageView2/0/w/700" alt=""></p>
Ansible Playbooks http://voidking.com/dev-ansible-playbooks/ 2018-08-07T06:00:00.000Z 2018-12-14T02:11:11.812Z Playbooks简介

与ad-hoc任务执行模式相比,Playbooks使用ansible是一种完全不同的方式,并且功能特别强大。

简而言之,playbooks是真正简单的配置管理和多机器部署系统的基础,与已有的系统不同,并且非常适合部署复杂的应用程序。

Playbooks可以声明配置,但它们也可以协调任何手动有序流程的步骤,即使不同的步骤必须按照特定顺序在机器组之间来回跳转。它们可以同步或异步启动任务。
更多playbooks的介绍参考官方文档

Playbooks以YAML格式表示(请参阅YAML语法),具有最少的语法,它不是编程语言或脚本,而是配置或进程的模型。

每个剧本由列表中的一个或多个“戏剧”组成。戏剧的目标是将一组主机映射到一些定义明确的角色,由ansible调用任务表示。在基本级别,任务只不过是对ansible模块的调用(请参阅使用模块)。

通过编写多个“戏剧”的剧本,可以编排多机部署,在Web服务器组中的所有计算机上运行某些步骤,然后在数据库服务器组上执行某些步骤,然后在Web服务器组上执行更多命令,等等。。

你可以有很多戏剧影响你的系统做不同的事情。这并不是说你只是定义了一个特定的状态或模型,而是可以在不同的时间运行不同的戏剧。

Playbooks Demo

以下是只包含一个戏剧的剧本:

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
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: write the apache config file
template:
src: /srv/httpd.j2
dest: /etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service:
name: httpd
state: started
handlers:
- name: restart apache
service:
name: httpd
state: restarted

  • 文件开头三个横杠代表yaml文件。
  • hosts表示一个主机组。
  • tasks表示动作集合。
  • name是一个注释说明。
  • yum和下面两行,表示使用yum安装最新版的httpd。
  • template和下面两行,表示使用ansible的template模块传输/srv/httpd.j2作为客户机的/etc/httpd.conf。和copy相比,template支持jinja语法。
  • notify和下面一行,表示传输成功后触发重启apache命令。它需要和handlers组合使用。
  • handlers中的name和notify中的信息要完全相同。service和下面两行,表示重启httpd。

Playbooks可以包含多个戏剧。您可能有一个首先针对Web服务器,然后是数据库服务器的playbook。例如:

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
---
- hosts: webservers
remote_user: root

tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: write the apache config file
template:
src: /srv/httpd.j2
dest: /etc/httpd.conf

- hosts: databases
remote_user: root

tasks:
- name: ensure postgresql is at the latest version
yum:
name: postgresql
state: latest
- name: ensure that postgresql is started
service:
name: postgresql
state: started

入门实例

目标:编写一个playbook,在客户机上安装chrony,然后检查启动情况。

1、新建chrony.yml,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---
- hosts: commonservers
tasks:
- name: install chrony
apt:
name: chrony
state: latest
notify:
- restart chrony
- name: ensure chrony is running
service:
name: chrony
state: started
handlers:
- name: restart chrony
service:
name: chrony
state: restarted

上面的playbook中用到了apt模块,如果有疑问可以查看帮助,ansible-doc apt。实际上,有一种更加简单的写法,就是把apt模块换成command模块,然后直接写命令。

2、检查playbook
ansible-playbook chrony.yml --syntax-check

3、以sudo权限执行playbook
ansible-playbook chrony.yml --user=voidking --private-key=/home/voidking/.ssh/id_rsa -s

4、在客户机测试
chronyc sources

角色

如果需要将一个大文件拆分为各个小文件,我们经常使用的就是include,这也是原先ansible拆分文件的做法。如今ansible使用roles来拆分文件,将nginx、mysql等分为各个角色,在各个角色内定义具体的小任务,方便管理。另一方面,类似于php类的自动加载,roles基于一个已知的文件结构,可以自动去加载某些vars_files、tasks、handlers等。

目标:使用角色的方式,编写配置playbook,在客户机上安装chrony,然后检查启动情况。

1、创建chrony角色目录
mkdir -p roles/chrony/tasks

mkdir -p roles/chrony/handlers

2、创建总的入口文件site.yml,内容为:

1
2
3
4
---
- hosts: commonservers
roles:
- chrony

3、创建安装剧本
vim roles/chrony/tasks/main.yml,内容为:

1
2
3
4
5
6
7
8
9
10
11
---
- name: install chrony
apt:
name: chrony
state: latest
notify:
- restart chrony
- name: ensure chrony is running
service:
name: chrony
state: started

vim roles/chrony/handlers/main.yml,内容为:

1
2
3
4
5
---
- name: restart chrony
service:
name: chrony
state: restarted

4、以sudo权限执行playbook
ansible-playbook site.yml --user=voidking --private-key=/home/voidking/.ssh/id_rsa -s

5、在客户机测试
chronyc sources

简单编程

变量

1
2
3
4
5
6
7
8
9
10
11
12
13
---
- hosts: commonservers
vars:
pre1: all info is
pre2: hostname is
tasks:
- name: register vars
shell: hostname
register: info
- name: display info
debug: msg="{{pre1}} {{info}}"
- name: display hostname
debug: msg="{{pre2}} {{info.stdout}}"

基本循环

1
2
3
4
5
6
7
8
9
---
- hosts: commonservers
tasks:
- name: loops demo
debug: msg="{{item}}"
with_items:
- one
- two
- three

循环字典

1
2
3
4
5
6
7
8
9
---
- hosts: commonservers
tasks:
- name: loops dict
debug: msg="key -> {{item.key}},value -> {{item.value}}"
with_items:
- {key: 1, value: "one"}
- {key: 2, value: "two"}
- {key: 3, value: "three"}

嵌套循环

1
2
3
4
5
6
7
8
---
- hosts: commonservers
tasks:
- name: loops2
debug: msg="item0 -> {{item[0]}},item1 -> {{item[1]}}"
with_nested:
- ['1','2']
- ['one','two','three']

散列循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
---
- hosts: commonservers
vars:
user:
voidking:
name: voidking
tel: 17600000000
haojin:
name: haojin
tel: 15100000000
tasks:
- name: loops3
debug: msg="key -> {{item.key}},value -> {{item.value}}"
with_dict:
- "{{user}}"

文件循环

1
2
3
4
5
6
7
---
- hosts: commonservers
tasks:
- name: loop file
debug: msg="{{item}}"
with_fileglob:
- /home/voidking/*.yml

命令循环

1
2
3
4
5
6
7
8
9
10
11
---
- hosts: commonservers
tasks:
- name: exec command
shell: "{{item}}"
with_items:
- hostname
- uname
register: ret
- name: display result
debug: msg="{% for i in ret.results %} {{i.stdout}} {% endfor %}"

条件判断

ansible的条件判断使用关键字when,有两种方式:

  • python语法支持的原生态格式 conditions > 1 or conditions == “ss”,in,not等等
  • ansible Jinja2 filters
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
- hosts: commonservers
vars:
pre: hostname is
tasks:
- name: register vars
shell: hostname
register: info
- name: display hostname
debug: msg="{{pre}} {{info.stdout}}"
- name: print true
debug: msg="result is ubuntu14"
when: info.stdout == "ubuntu14"
- name: print false
debug: msg="result is not ubuntu14"
when: info.stdout != "ubuntu14"
- name: print warning
debug: msg="client OS is ubuntu"
when: info['stdout'].startswith('u')

后记

至此,playbooks最基础的东西学习完毕。更高级的用法,在使用中再慢慢学习。

书签

Ansible Documentation

Ansible中文权威指南

Ansible精讲

]]>
<h1 id="Playbooks简介"><a href="#Playbooks简介" class="headerlink" title="Playbooks简介"></a>Playbooks简介</h1><p>与ad-hoc任务执行模式相比,Playbooks使用ansible是一种完全不同的方式,并且功能特别强大。</p> <p>简而言之,playbooks是真正简单的配置管理和多机器部署系统的基础,与已有的系统不同,并且非常适合部署复杂的应用程序。</p> <p>Playbooks可以声明配置,但它们也可以协调任何手动有序流程的步骤,即使不同的步骤必须按照特定顺序在机器组之间来回跳转。它们可以同步或异步启动任务。<br>更多playbooks的介绍参考<a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html" target="_blank" rel="noopener">官方文档</a>。</p>
Ansible入门 http://voidking.com/dev-ansible-start/ 2018-08-06T01:00:00.000Z 2018-12-14T02:11:11.819Z 前言

《Ubuntu16使用Kolla安装OpenStack》一文中,用到了ansible。本文,我们就来研究一下ansible的基本用法。

Ansible简介

ansible是一个用于自动化运维的配置管理和应用部署工具。基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric.SaltStack )的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署能力的是ansible所运行的模块。

ansible的基本架构:

  • 连接插件(connectior plugins)用于连接管理端和被管理端。
  • 核心模块(core modules)连接主机实现操作,它依赖于具体的模块来做具体的事情。
  • 自定义模块(custom modules)根据自己的需求编写具体的模块。
  • 插件(plugins)完成模块功能的补充。
  • 剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。
  • 主机清单(host inventory)定义ansible需要操作主机的范围。

上述简介摘自ansible基础

实验环境

两台主机,都是ubuntu14.04.4 server版,用户都是voidking。一台作为管理机,IP为192.168.56.101,一台作为被管理机(以下称为客户机),IP为192.168.56.102。

在管理机上安装ansible,一条命令搞定:sudo apt install ansible。不过,安装的ansible版本很低,默认1.5.4。这里我们通过添加源来安装最新版ansible:

1
2
3
4
5
sudo apt remove ansible
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

这样,就能安装好最新版的ansible。

连接准备

1、在管理机生成密钥
ssh-keygen,连续回车即可。

2、将公钥写入客户机
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.102

3、在管理机添加客户机到hosts
sudo vim /etc/ansible/hosts,在文档最后添加:

1
2
[commonservers]
192.168.56.102

4、在管理机第一条命令
ansible all -m ping

5、在客户机把voidking用户添加进sudo免密,方便以后的操作
sudo vim /etc/sudoers,添加

1
voidking ALL = NOPASSWD: ALL

ssh-agent

ansible可能使用到ssh-agent,那就顺便学习一下,参考了解ssh代理:ssh-agent

ssh-agent是ssh代理程序,ssh-agent可以帮助我们管理私钥。

那么什么时候需要ssh代理帮助我们管理私钥呢?当遇到如下情况时,我们会需要ssh代理。

  • 使用不同的密钥连接到不同的主机时,需要手动指定对应的密钥,ssh代理可以帮助我们选择对应的密钥进行认证,不用手动指定密钥即可进行连接。

  • 当私钥设置了密码,我们又需要频繁的使用私钥进行认证时,ssh代理可以帮助我们免去重复的输入密码的操作。

  • 管理机可以通过密钥连接到客户机A和客户机B,但是客户机A无法通过密钥连接到客户机B,ssh代理可以帮助我们在客户机A也能通过密钥连接到客户机B。

我们以添加.ssh/id_rsa私钥给ssh代理为例,查看一下使用流程。

1、启用ssh-agent
ssh-agent bash

2、把.ssh/id_rsa添加到ssh代理
ssh-add ~/.ssh/id_rsa

3、测试登录
ssh voidking@192.168.56.102
登录成功。
切换到root用户,ssh-agent失效。重新使用voidking登录,ssh-agent失效。想要重新登录依然生效,那就创建个脚本登录时自动执行。

常用命令:

  • ssh-agent $SHELL,启动
  • ssh-agent -k,关闭
  • ssh-add ~/.ssh/key_name,添加指定私钥
  • ssh-add -l,查看私钥
  • ssh-add -L,查看公钥
  • ssh-add -d /path/of/key/key_name,删除指定私钥
  • ssh-add -D,删除所有私钥
  • ssh-add -x,设置密码,锁定ssh代理
  • ssh-add -X,输入密码,解锁ssh代理

ansible命令

基本命令

  • ansible,主程序,临时命令执行工具
  • ansible-doc,查看配置文档,模块功能查看工具
  • ansible-galaxy,下载/上传优秀代码或Roles模块的官网平台
  • ansible-lint,对playbook的语法进行检查的一个工具。
  • ansible-playbook,定制自动化任务,编排剧本工具
  • ansible-pull,远程执行命令的工具
  • ansible-vault,文件加密工具。
  • ansible-console,基于console界面与用户交互的执行工具。

配置文件

  • /etc/ansible/ansible.cfg,主配置文件,配置ansible工作特性
  • /etc/ansible/hosts,主机清单
  • /etc/ansible/roles/,存放角色的目录

1、ansible.cfg的配置参考Configuring Ansible,主要留意inventory、forks、poll_interval、remote_port、log_path等参数。

2、hosts文件有一个特性很棒,可以指定变量,例如:

1
2
3
4
5
6
7
8
9
10
[commonservers]
192.168.56.102
[commonservers:vars]
ansible_ssh_pass='123456'
ansible_ssh_port=22

[commonservers1]
192.168.56.103
[commonservers:children]
commonservers1

内置变量小结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 主机名
ansible_ssh_host
# 端口号
ansible_ssh_port
# 用户名
ansible_ssh_user
# 密码
ansible_ssh_pass
# 使用sudo连接用户时的密码
ansible_sudo_pass
# 秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_ssh_private_key_file
# shell的类型默认sh
ansible_shell_type
# SSH 连接的类型
ansible_connection
# 指定python解释器的路径
ansible_python_interpreter

ansible

格式:ansible <host-pattern> [-m module_name] [options]

ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。command模块不是调用的shell的指令,所以没有bash的环境变量,也不能使用shell的一些操作方式,其他和shell模块没有区别。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看所有主机
ansible all --list-hosts
# 查看commonservers组的主机
ansible commonservers --list-hosts
# 测试连通
ansible all -m ping
# 查看客户机的内存
ansible all -m command -a "free -h"
# 在客户机执行管理机脚本
cp /bin/echo ~/echo.sh
ansible all -m script -a "~/echo.sh hello" -vvv
# 在客户机执行客户机脚本
ansible all -m command -a "cp /bin/echo /home/voidking/echo.sh"
ansible all -m shell -a "/home/voidking/echo.sh hello"
# 向客户机拷贝文件
ansible all -m copy -a "src=/home/voidking/echo.sh dest=/tmp/ owner=voidking group=voidking mode=0755"
# 后台执行命令
ansible all -m ping -B 3600 -P 0
ansible all -m async_status -a "jid='182829279182.2094'"

ansible-doc

格式:ansible-doc [options] [module...]

例子:

1
2
3
4
ansible-doc ping
ansible-doc -s ping
ansible-doc -l
ansible-doc -a

通配符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 匹配所有主机,相当于all
ansible '*' -m ping
# 匹配含有common的主机组
ansible '*common*' -m ping
# 匹配IP为100-109的主机
ansible '192.168.56.10?' -m ping
# 匹配IP段
ansible '192.168.56.101:192.168.56.200' -m ping
# 逻辑与
ansible 'commonservers:&dbservers' --list
# 逻辑非
ansible 'commonservers:!dbservers' --list
# 正则表达式
ansible '~192\.168\.56\.[1-254]' --list

书签

Ansible Documentation

Ansible中文权威指南

Ansible精讲

运维自动化-Ansible ( 一 )

Ansible 运维自动化 ( 配置管理工具 )

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.voidking.com/dev-ubuntu16-kolla-openstack-all-in-one/" target="_blank" rel="noopener">《Ubuntu16使用Kolla安装OpenStack》</a>一文中,用到了ansible。本文,我们就来研究一下ansible的基本用法。</p>
Kolla配置实例网络 http://voidking.com/dev-kolla-instance-network/ 2018-08-03T12:00:00.000Z 2018-12-14T02:11:11.850Z 前言

紧接着《Ubuntu16使用Kolla安装OpenStack》,假设已经使用kolla安装好了openstack,本文我们来研究一下怎样访问实例和怎样配置网络。

访问实例

1、在dashboard查看网络拓扑如下:

上图中网关的ip为10.0.2.158,ping不通。
上图中实例demo1的ip为10.0.0.3,ping不通。
这是因为,当前网络和实例的网络属于不同的命名空间。

2、查看命名空间
ip netns

3、查看qrouter的网络
ip netns exec qrouter-6e5d8c97-3f9c-4ce9-a9b4-580f2f38e0f3 ip add

4、登录实例demo1
ip netns exec qrouter-6e5d8c97-3f9c-4ce9-a9b4-580f2f38e0f3 ssh cirros@10.0.0.3

直接访问实例

上面的登录方式,比较麻烦,因为要指定命名空间。下面我们来配置一下,使得不指定命名空间也可以访问实例。

1、在/etc/network/interfaces中添加配置:

1
2
3
4
auto br-ex
iface br-ex inet static
address 10.0.2.1
netmask 255.255.255.0

2、启用br-ex
ifup br-ex

3、测试连接
此时,可以ping通网关10.0.2.158,ping不通实例10.0.0.3。

4、解决方法一,添加路由

1
2
route add -net 10.0.0.0/24 gw 10.0.2.158 dev br-ex
ping 10.0.0.3 -c3

5、解决方法二,给demo1实例分配浮动IP

1
2
3
4
5
source /etc/kolla/admin-openrc.sh
openstack network list
openstack floating ip create public1
openstack server add floating ip demo1 10.0.2.153
ping 10.0.2.153 -c3


外网配置

在实例中,ping不通8.8.8.8。参考Openstack实践(1)部署使用实例及neutron网络,可以通过修改init-runonce脚本解决,EXT_NET_CIDR、EXT_NET_RANGE和EXT_NET_GATEWAY需要根据物理网络配置。

这里,小编使用snat来解决。

1、参考Linux配置SNAT上网,设置snat

1
2
3
4
iptables -I INPUT -i eth2 -j ACCEPT
iptables -I INPUT -i br-ex -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE

这里的设置,使10.0.2.0/24网段和10.0.0.0/24网段都可以上网了。实际上,只要配置10.0.2.0/24网段可以上网就可以了,因为这个网段用于配置浮动IP。

2、测试网络
ssh cirros@10.0.0.3

ping 8.8.8.8 -c3

如上图,实例已经可以ping通外网。

书签

Openstack 之 kolla部署外部网络配置

Openstack 之 kolla部署外部网络配置

kolla queens on centos7.4

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>紧接着<a href="https://www.voidking.com/dev-ubuntu16-kolla-openstack-all-in-one/" target="_blank" rel="noopener">《Ubuntu16使用Kolla安装OpenStack》</a>,假设已经使用kolla安装好了openstack,本文我们来研究一下怎样访问实例和怎样配置网络。</p>
Ubuntu16使用Kolla安装OpenStack http://voidking.com/dev-ubuntu16-kolla-openstack-all-in-one/ 2018-08-02T01:00:00.000Z 2018-12-14T02:11:11.984Z 前言

完成了《Ubuntu16手动安装OpenStack——XXX》系列,看上去,我们已经总结出了一套不错的文档。遵照文档,理论上就能成功安装更多的机器。但是,设想是美好的,而在实际安装过程中,又出现很多莫名其妙的报错。有些错误可以解决,很好;有些错误解决不了,那么整个环境就废了,需要重装系统。而且,整个安装流程非常复杂,难以保证每一步都不出错。

于是,小编决定寻找更加通用、更加方便的方法。小伙子树添给出建议:能不能使用docker来进行部署?经过讨论和搜索资料,发现这条道路确实可行,而且有OpenStack官方文档。

本文,就来研究一下使用Kolla安装OpenStack Queens版本的方法,架构采用最简单的all-in-one。

Kolla简介

Kolla是OpenStack社区“Big Tent”开发模式下的项目,该项目由思科于2014年9月提出。Kolla的优势和使用场景体现在如下几个方面:

  • 原子性升级或者回退OpenStack部署。
  • 基于组件升级OpenStack。
  • 基于组件回退OpenStack。

Kolla为OpenStack的部署提供了有效、快捷、方便、易于维护、方便版本更新与回退的方案。

具体而言,Kolla的最终目标是为OpenStack的每一个服务都创建一个对应的Docker镜像,通过Docker镜像将升级的粒度减小到服务级别,从而在升级时对OpenStack的影响降到最小,并且一旦升级失败,也很容易回滚。升级只需要三步:拉取新版本的容器镜像,停止老版本的容器服务,启动新版本的容器。回滚也不需要重新安装包,直接启动老版本的容器服务就行,非常方便。

Kolla可以使用Ansible、Kubernetes或者Mesos来部署OpenStack环境,Kolla负责容器化OpenStack各个服务;后者则负责部署这些容器,搭建出一个可用的OpenStack环境。来实现基于Docker容器的OpenStack服务全生命周期管理,如安装、升级、回滚、迁移等。在部署Docker容器时,默认的网络配置都是Host模式。因为Kolla的Docker镜像粒度很小,它针对每个OpenStack服务都有特定的镜像,所以我们也可以通过Docker命令来操作某个具体的OpenStack服务。

Kolla项目及其相关的其他项目如下:

  • Kolla项目,负责docker build OpenStack每个服务,如nova-compute容器等;
  • Kolla-Ansible项目,使用Ansible部署这些容器,搭建OpenStack环境;
  • Kolla-Kubernetes项目,使用Kubernetes部署这些容器,搭建OpenStack环境;
  • Kolla-Mesos项目,使用Mesos部署这些容器,搭建OpenStack环境。

上述Kolla简介摘自微信分享DockOne微信分享(一二八):容器化部署OpenStack的正确姿势

环境

VirtualBox虚拟机一台,系统为ubuntu-16.04.4-server-amd64,4核8G内存40G存储,主机名为controller,eth0的IP为192.168.56.110,eth1为nat上网网卡,eth2为neutron服务提供网络。

网络设置

1、切换到root用户
sudo -i

2、vim /etc/network/interfaces,设置网卡为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.56.110
netmask 255.255.255.0

auto eth1
iface eth1 inet dhcp

auto eth2
iface eth2 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ifconfig $IFACE promisc

3、启用网卡
ifup eth2

安装配置

主要参考OpenStack, Ansible, and Kolla on Ubuntu 16.04kolla queens on centos7.4Kolla-Ansible’s documentation!

安装依赖

1、安装并升级pip

1
2
3
apt-get update
apt-get install python-pip
pip install --upgrade pip

2、安装依赖
apt-get -y install python-dev libffi-dev gcc libssl-dev python-selinux

3、安装ansible
apt-get -y install ansible

4、vim /etc/ansible/ansible.cfg,添加如下:

1
2
3
4
5
line 10, add
[defaults]
host_key_checking=False
pipelining=True
forks=100

安装docker

1、安装docker
curl -SSL https://get.docker.io | bash

2、为docker和kolla创建配置文件

1
2
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/kolla.conf

修改为:

1
2
[Service]
MountFlags=shared

3、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

4、查看docker信息
docker info
报错:

1
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.

5、重启docker
systemctl restart docker
报错:

1
2
Failed to restart docker.service: Unit docker.service is not loaded properly: Invalid argument.
See system logs and 'systemctl status docker.service' for details.

6、手动启动docker
/usr/bin/dockerd
报错:

1
2
3
INFO[0000] libcontainerd: new containerd process, pid: 7629 
WARN[0000] containerd: low RLIMIT_NOFILE changing to max current=1024 max=1048576
FATA[0001] Error starting daemon: error initializing graphdriver: "/var/lib/docker" contains several valid graphdrivers: aufs, overlay2; Please cleanup or explicitly choose storage driver (-s <DRIVER>)

7、查看docker的aufs挂载情况并取消挂载

1
2
cat /proc/mounts | grep "docker"
umount /var/lib/docker/aufs

8、删除/var/lib/docker/目录下的文件并重启docker

1
2
rm -rf /var/lib/docker/*
systemctl start docker

9、再次查看docker信息
docker info

加速镜像拉取

使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此DaoCloud推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。

1、访问DaoCloud官网,注册一个账号。

2、访问配置 Docker 加速器,可以获得一个专属加速地址(每次访问都会获得不同的地址)。

3、参考Docker 加速器,创建或修改 /etc/docker/daemon.json,内容为:

1
2
3
4
5
6
{
"registry-mirrors": [
"http://2fd0f33c.m.daocloud.io"
],
"insecure-registries": []
}

4、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

PS:也可以使用阿里云的镜像加速器

安装Kolla-ansible

1、安装kolla-ansible
pip install kolla-ansible

报错:ImportError: cannot import name main,参考升级pip后出现ImportError: cannot import name main,编辑/usr/bin/pip文件,如下修改:

1
2
3
4
# line 9, change
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())

报红:oslo-config 6.4.0 has requirement PyYAML>=3.12, but you’ll have pyyaml 3.11 which is incompatible.忽略。

2、拷贝globals.yml和passwords.yml到/etc/kolla目录
cp -r /usr/local/share/kolla-ansible/etc_examples/kolla /etc/

3、拷贝all-in-one和multinode清单文件到当前目录
cp /usr/local/share/kolla-ansible/ansible/inventory/* .

4、生成kolla密码
kolla-genpwd
我们部署中使用的密码存储在/etc/kolla/passwords.yml文件中。此文件中的所有密码都是空白的,必须手动填写或运行随机密码生成器。

配置globals.yml

1、查看globals.yml配置
grep -vE '^$|^#' /etc/kolla/globals.yml

2、vim /etc/kolla/globals.yml,如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# line 15,uncomment
kolla_base_distro: "centos"
# line 18,uncomment
kolla_install_type: "binary"
# line 21,uncomment and change
openstack_release: "queens"
# line 31,change
kolla_internal_vip_address: "192.168.56.120"
# line 85,uncomment and change
network_interface: "eth0"
# line 100,uncomment and change
neutron_external_interface: "eth2"
# line 331,uncomment
designate_backend: "bind9"
designate_ns_record: "sample.openstack.org"
# line 340,uncomment and change
nova_compute_virt_type: "qemu"
# other
tempest_image_id:
tempest_flavor_ref_id:
tempest_public_network_id:
tempest_floating_network_name:

因为是在虚拟机中安装openstack,所以nova_compute_virt_type设置为qemu。

部署

1、初始化
kolla-ansible -i ./all-in-one bootstrap-servers
报错:

查找资料,猜测是ansible版本问题。
(1)ansible --version,查看ansible版本为2.0.0.2,确实非常低。
(2)apt install ansible,提示已经是最新版本。
(3)更新apt库,然后重装ansible

1
2
3
4
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible

然后,重新编辑/etc/ansible/ansible.cfg,再次执行初始化命令,问题解决。时间比较久,请耐心等待。

2、预检查
kolla-ansible -i ./all-in-one prechecks

3、拉取镜像
kolla-ansible -i ./all-in-one pull
这一步的时间特别久,挺耐心等待。如果拉取失败,就多尝试几次。

4、查看镜像
docker images

5、部署
kolla-ansible -i ./all-in-one deploy

测试使用openstack

1、安装openstack客户端
pip install python-openstackclient python-glanceclient python-neutronclient --ignore-installed

2、生成admin-openrc.sh等
kolla-ansible post-deploy

3、使admin环境生效
source /etc/kolla/admin-openrc.sh

4、查看计算服务
openstack compute service list

初始化配置

1、执行init-runonce脚本
. /usr/local/share/kolla-ansible/init-runonce

2、根据提示,创建实例

1
2
3
4
5
6
openstack server create \
--image cirros \
--flavor m1.tiny \
--key-name mykey \
--nic net-id=e52fe099-c798-4ffd-8c3c-06de424a9de7 \
demo1

3、访问horizon服务
curl 192.168.56.120 -L

在浏览器访问 http://192.168.56.120 ,使用admin账号登录,密码在passwords.yml文件中查看。
less /etc/kolla/passwords.yml | grep keystone_admin_password

后记

至此,使用kolla安装openstack成功。但是,我们还不知道实例能否正常使用。关于实例的访问和网络配置,放在下一篇文章中研究。

书签

Kolla’s documentation!

Kolla让OpenStack部署更贴心

Kolla安装Ocata单节点

kolla部署openstack ocata版

Install and configure OpenStack Ocata with Kolla as a standalone

Kolla OpenStack系统视频课程

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>完成了《Ubuntu16手动安装OpenStack——XXX》系列,看上去,我们已经总结出了一套不错的文档。遵照文档,理论上就能成功安装更多的机器。但是,设想是美好的,而在实际安装过程中,又出现很多莫名其妙的报错。有些错误可以解决,很好;有些错误解决不了,那么整个环境就废了,需要重装系统。而且,整个安装流程非常复杂,难以保证每一步都不出错。</p> <p>于是,小编决定寻找更加通用、更加方便的方法。小伙子树添给出建议:能不能使用docker来进行部署?经过讨论和搜索资料,发现这条道路确实可行,而且有OpenStack官方文档。</p> <p>本文,就来研究一下使用Kolla安装OpenStack Queens版本的方法,架构采用最简单的all-in-one。</p>
Hexo使用livere作为评论插件 http://voidking.com/dev-hexo-livere-comment-plugin/ 2018-07-27T06:00:00.000Z 2018-12-14T01:44:32.799Z 前言

使用gitalk作为评论插件,差强人意,因为每篇文章都需要初始化。而且,加载速度很慢。想了一天,决定再换一个评论插件,换成韩国的评论插件livere。

livere简介

livere(来必力)是一个社会化评论插件,优点有:

  • 使用社交网站账户登录,免去注册过程。
  • 提高用户的参与和沟通意愿。
  • 管理/删除我的评论内容。
  • 提供管理页面,管理网站文章及评论内容。

准备

1、访问来必力官网,注册账号。

2、登录后点击导航栏“安装”,选择city版。

3、根据提示,申请获取代码。

4、小编获取到的一般网站的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 来必力City版安装代码 -->
<div id="lv-container" data-id="city" data-uid="MTAyMC8zODU3Mi8xNTEwMA==">
<script type="text/javascript">
(function(d, s) {
var j, e = d.getElementsByTagName(s)[0];

if (typeof LivereTower === 'function') { return; }

j = d.createElement(s);
j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
j.async = true;

e.parentNode.insertBefore(j, e);
})(document, 'script');
</script>
<noscript> 为正常使用来必力评论功能请激活JavaScript</noscript>
</div>
<!-- City版安装代码已完成 -->

使用配置

1、在yilia/layout/_partial/post目录下,新建livere.ejs,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div class="livere">
<!-- 来必力City版安装代码 -->
<div id="lv-container" data-id="city" data-uid="<%=theme.livere.uid%>">
<script type="text/javascript">
(function(d, s) {
var j, e = d.getElementsByTagName(s)[0];

if (typeof LivereTower === 'function') { return; }

j = d.createElement(s);
j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
j.async = true;

e.parentNode.insertBefore(j, e);
})(document, 'script');
</script>
<noscript> 为正常使用来必力评论功能请激活JavaScript</noscript>
</div>
<!-- City版安装代码已完成 -->
</div>

2、编辑yilia/layout/_partial/article.ejs,添加:

1
2
3
4
5
6
7
<% if (!index && theme.livere.enable && post.comments){ %>
<%- partial('post/livere', {
key: post.slug,
title: post.title,
url: config.url+url_for(post.path)
}) %>
<% } %>

3、编辑yilia/_config.yml,添加:

1
2
3
4
5
6
# 注释所有畅言配置
# 注释所有gitalk配置
# livere配置
livere:
enable: true
uid: MTAyMC8zODU3Mi8xNTEwMA==

4、在yilia/source/css/_partial/main.stly中添加:

1
2
3
.livere{
padding: 0 40px;
}

至此,配置livere评论插件完成,效果如下:

nice,看起来比gitalk强多了,就你了。

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>使用gitalk作为评论插件,差强人意,因为每篇文章都需要初始化。而且,加载速度很慢。想了一天,决定再换一个评论插件,换成韩国的评论插件livere。</p>