-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
1608 lines (1483 loc) · 326 KB
/
atom.xml
File metadata and controls
1608 lines (1483 loc) · 326 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>一本正经的小马</title>
<subtitle>假装不正经</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://www.hanbert.cn/"/>
<updated>2017-10-13T04:48:22.478Z</updated>
<id>https://www.hanbert.cn/</id>
<author>
<name>小马</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Kolla相关零零碎碎</title>
<link href="https://www.hanbert.cn/2017/10/03/Kolla%E7%9B%B8%E5%85%B3%E9%9B%B6%E9%9B%B6%E7%A2%8E%E7%A2%8E/"/>
<id>https://www.hanbert.cn/2017/10/03/Kolla相关零零碎碎/</id>
<published>2017-10-03T05:19:18.000Z</published>
<updated>2017-10-13T04:48:22.478Z</updated>
<content type="html"><![CDATA[<p>本部分主要介绍一些Kolla使用过程中总结的经验和技巧等零碎知识,不成体系,也会附带一部分Sahara Plugin在由Kolla部署OpenStack环境下,如何增加和生效。</p>
<a id="more"></a>
<h4 id="节点规划"><a href="#节点规划" class="headerlink" title="节点规划"></a>节点规划</h4><p>节点的规划和容器的分布由<code>inventory</code>控制,<code>/usr/share/kolla/ansible/inventory</code>目录下的<code>all-in-one</code>和<code>multinode</code>,如果单节点部署,需要指定<code>all-in-one</code>;如果是多节点部署,你需要指定<code>multinode</code>。尽量不要动<code>all-in-one</code>,但是如果采用多节点安装,则<code>multinode</code>应该根据自己的实际情况改写。</p>
<h4 id="变量配置"><a href="#变量配置" class="headerlink" title="变量配置"></a>变量配置</h4><p>部署过程中用到的很多参数,大部分都写在<code>kolla-ansible/ansible/group_vars/all.yml</code>这个文件里面,有一部分写在<code>kolla-ansible/etc/kolla/globals.yml</code>中,两者有部分是重复的,<code>globals.yml</code>会覆盖<code>all.yml</code>的配置项。<br>这些变量的值,最终会替换<code>ansible</code>的<code>playbook</code>里面对应的变量的值,控制<code>playbook</code>的最终结果。这些<code>playbook</code>主要分为4类:</p>
<ul>
<li><strong>default</strong>:代表默认的一些配置</li>
<li><strong>meta</strong>:代表依赖于哪个playbook</li>
<li><strong>task</strong>:代表具体的部署任务</li>
<li><strong>template</strong>:代表模板,主要包含容器的配置文件,以及容器启动时的一些初始化操作,主要是拷贝配置文件和启动该容器对应的服务。</li>
</ul>
<p>这些配置<code>playbook</code>全部放在<code>kolla-ansible/ansible/roles</code>对应的目录下。</p>
<h4 id="部署前检测"><a href="#部署前检测" class="headerlink" title="部署前检测"></a>部署前检测</h4><p><code>kolla</code>提供了一个检测命令,可以对各个角色节点进行一些检测,主要是包括:</p>
<ul>
<li><strong>版本检测:</strong><code>docker-py</code>,<code>Ansible</code></li>
<li><strong>端口检测:</strong>所有容器配置的监听端口是否已经被占用</li>
<li><strong>服务检测:</strong>这里检测的就比较杂了,比如libvirt是否在运行,如果运行就会报错,比如Docker版本是否满足要求等等</li>
</ul>
<p>你可以查看<code>kolla-ansible/ansible/rolesprechecks/tasks</code>下面的playbook,知道所有的检测项。当检测出错时,你就需要根据出错的信息,对某些角色的节点进行些修改配置。 检测通过,下面的部署不一定成功,但检测没通过,下面的部署是肯定失败的。</p>
<h4 id="部署完成后的清理"><a href="#部署完成后的清理" class="headerlink" title="部署完成后的清理"></a>部署完成后的清理</h4><p>在某些情况下,可能需要对环境中的容器,镜像,甚至节点上的所有关于kolla的配置,进行清理,可以使用<code>kolla-ansible destroy -i inventory/multinode</code>的子命令对环境清理。</p>
<h4 id="部署完成后的扩展"><a href="#部署完成后的扩展" class="headerlink" title="部署完成后的扩展"></a>部署完成后的扩展</h4><p>kolla增加节点理论上很简单,只需要两步,一是修改对应的<code>inventory</code>,二是对待添加节点做好部署前的准备工作。</p>
<h4 id="修改某个容器的配置"><a href="#修改某个容器的配置" class="headerlink" title="修改某个容器的配置"></a>修改某个容器的配置</h4><p>通过修改对应节点<code>/etc/kolla/</code>目录下对应的服务的配置文件,然后重启对应的容器,就可以修改相关配置。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">docker restart CONTAINER1 CONTAINER2 CONTAINER3 ......</div></pre></td></tr></table></figure></p>
<p>如果是修改多个容器的配置,可以通过修改<code>kolla-ansible/ansible/roles</code>目录下对应的配置文件的模板,<code>/etc/kolla/globals.yml</code>下面的配置项,<code>kolla-ansible/ansible/group_vars/all.yml</code>里面的配置项,然后执行 <code>kolla-ansible reconfigure</code>命令即可。</p>
<blockquote>
<p><strong><em>Note:</em></strong><br>这种方式会将所有容器的配置重新覆盖一次,所有容器都会重启一次</p>
</blockquote>
<h4 id="修改代码"><a href="#修改代码" class="headerlink" title="修改代码"></a>修改代码</h4><p>使用<code>docker exec -it -u root CONTAINER_ID /bin/bash</code>命令以<code>root</code>用户的身份登录到相应的<code>container</code>中,然后直接修改里面的代码,如果需要修改配置文件,可以直接修改<code>/etc/kolla/</code>相应目录下的<code>.conf</code>文件,然后重启容器即可。</p>
<p>如果需要复用这个修改后的容器,可以使用<code>docker commit</code>基于你改动的容器,重新制作一个镜像,指定一个合适的<code>tag</code>(即容器镜像的版本,不要和已有镜像的重复),最后上传到本地镜像仓库中即可。 </p>
<blockquote>
<p><strong><em>Note:</em></strong><br>当移除旧的容器,如果简单的执行<code>docker run</code>的相关命令启动一个新的容器会出错,原因是启动容器时会做些初始化的操作,由于涉及到文件的拷贝,所以会出现缺少相关文件的报错。而启动容器以及容器的初始化的操作由<code>kolla_toolbox</code>(这是kolla在部署过程中,第二个启动的容器)执行,具体的由<code>kolla_toolbox</code>里的<code>/usr/local/bin/kolla_start</code>和 <code>/usr/local/bin/kolla_set_configs</code>来控制。</p>
</blockquote>
<h4 id="基于Dockerfile重新制作的镜像:"><a href="#基于Dockerfile重新制作的镜像:" class="headerlink" title="基于Dockerfile重新制作的镜像:"></a>基于Dockerfile重新制作的镜像:</h4><p>由于采用源码的方式安装相关的第三方库,我们可以在<code>git</code>上维护相关的所有代码,在我们提交新的<code>commit</code>的时候,通过拉取新的源码,重新用<code>Dockerfile</code>制作镜像。一般来说<code>Dockerfile</code>都不需要变化。 </p>
<h4 id="部署完成后的环境的升级"><a href="#部署完成后的环境的升级" class="headerlink" title="部署完成后的环境的升级"></a>部署完成后的环境的升级</h4><p>可以通过修改<code>/etc/kolla/global.yml</code>里面<code>openstack-release</code>的参数,然后执行<code>kolla-ansible upgrade</code>的命令升级环境。理论上可以做到单个容器的升级,但是具体能不能实现,有待验证。</p>
<p>如果需要回滚就只是将<code>/etc/kolla/global.yml</code>里面<code>openstack-release</code>的参数,改回原来的版本即可。</p>
<h4 id="kolla网络相关参数"><a href="#kolla网络相关参数" class="headerlink" title="kolla网络相关参数"></a>kolla网络相关参数</h4><ul>
<li><strong>network_interface:</strong>为下面几种<code>interface</code>提供默认值</li>
<li><strong>api_interface: </strong>用于<code>management network</code>,即<code>openstack</code>内部服务间通信,以及服务于数据库通信的网络。这是系统的风险点,所以,这个网络推荐使用内网,不能够接出到外网,默认值为:<code>network_interface</code></li>
<li><strong>kolla_external_vip_interface: </strong>这是一个公网网段,当你想要<code>HAProxy Public endpoint</code>暴漏在不同的网络中的时候,需要用到。当<code>kolla_enables_tls_external</code>设置为<code>yes</code>的时候,是个必选项。默认值为:<code>network_interface</code></li>
<li><strong>storage_interface: </strong> 虚拟机与<code>Ceph</code>通信接口,这个接口负载较重,推荐放在<code>10Gig</code>网口上。默认值为:<code>network_interface</code></li>
<li><strong>cluster_interface: </strong>这是<code>Ceph</code>用到的另外一个接口,用于数据的<code>replication</code>,这个接口同样负载很重,当其成为bottleneck的时候,会影响数据的一致性和整个集群的性能。默认:<code>network_interface</code></li>
<li><strong>tunnel_interface: </strong>这个接口用于虚拟机与虚拟机之间的通信,通过 <code>tunneled</code>网路进行,比如:<code>Vxlan</code>,<code>GRE</code>等,默认为:<code>network_interface</code></li>
<li><strong>neutron_external_interface: </strong>这是<code>Neutron</code>需要的接口,<code>Neutron</code>会将其绑定在<code>br-ex</code>上,既可以是<code>flat</code>网络,也可以是<code>tagged vlan</code>网络,必须单独设置</li>
</ul>
<h4 id="Docker的一些配置建议"><a href="#Docker的一些配置建议" class="headerlink" title="Docker的一些配置建议"></a>Docker的一些配置建议</h4><p><code>Docker</code>是<code>kolla</code>的核心依赖,配置好<code>Docker</code>能够有效改变<code>kolla</code>的使用体验,在某些版本中<code>Docker</code>的存储驱动默认是<code>devicemapper</code>,这个<code>driver</code>严重损害性能。我们推荐使用<code>btrfs</code>或者<code>aufs</code>作为驱动。</p>
<p><code>kolla</code>将所有的永久数据存放在<code>Docker volumes</code>中,默认这个<code>volumes</code>在<code>docker</code>的工作目录下面创建,默认是:<code>/var/lib/docker</code>,建议确认这个目录具有足够的空间,否则会影响<code>Database</code>的<code>commits</code>和<code>rabbitmq</code>的性能<br>尤其当<code>enable_central_logging</code>和<code>openstack_logging_debug</code>设置为<code>true</code>的时候,更需要关注.</p>
<h4 id="部署完成后的服务运行日志"><a href="#部署完成后的服务运行日志" class="headerlink" title="部署完成后的服务运行日志"></a>部署完成后的服务运行日志</h4><p>所有组件的日志都放在<code>/var/lib/docker/volumes/kolla_logs/_data/</code>对应的目录下。</p>
<h4 id="替换Horizon的图标"><a href="#替换Horizon的图标" class="headerlink" title="替换Horizon的图标"></a>替换Horizon的图标</h4><p>提前将需要用到的文件凡在一台可以被<code>container</code> 通过<code>ssh</code>连接到的<code>host</code>的<code>/opt</code>目录下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">//登陆Horizon的container中</div><div class="line">docker exec -it -u root horizon /bin/bash</div><div class="line"></div><div class="line">//替换下面这个目录下的对应文件</div><div class="line">cd /var/lib/kolla/venv/lib/python2.7/site-packages/openstack_dashboard/static/dashboard/img</div><div class="line">scp root@[SERVER_IP]:/opt/logo-splash.svg ./</div><div class="line">scp root@[SERVER_IP]:/opt/logo.svg ./</div><div class="line">scp root@[SERVER_IP]:/opt/favicon.ico ./</div><div class="line"></div><div class="line">//替换下面这个目录下的对应文件</div><div class="line">cd /var/lib/kolla/venv/lib/python2.7/site-packages/static/dashboard/img</div><div class="line">scp root@[SERVER_IP]:/opt/logo-splash.svg ./</div><div class="line">scp root@[SERVER_IP]:/opt/logo.svg ./</div><div class="line">scp root@[SERVER_IP]:/opt/favicon.ico ./</div><div class="line"></div><div class="line">//退出登陆</div><div class="line">exit</div></pre></td></tr></table></figure></p>
<p>以上过程做完后,无需重启容器,清空浏览器缓存,从新刷新<code>Dashboard</code>页面即可看到生效。</p>
<blockquote>
<p><strong><em>Note:</em></strong><br>如果存在多个<code>controller</code>节点,需要每个<code>controller</code>节点都做修改!!!</p>
</blockquote>
<h4 id="部署Sahara的Plugin代码"><a href="#部署Sahara的Plugin代码" class="headerlink" title="部署Sahara的Plugin代码"></a>部署Sahara的Plugin代码</h4><p>首先先将需要部署的<code>Plugin</code>代码放置到一台可以被<code>container</code> 通过<code>ssh</code>连接到的<code>host</code>的<code>/opt</code>目录下:</p>
<p>① 修改<code>Sahara_engine</code>服务容器<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line">//登陆Sahara_engine容器</div><div class="line">docker exec -u root -it sahara_engine /bin/bash</div><div class="line"></div><div class="line">//拷贝Plugin代码</div><div class="line">cd /var/lib/kolla/venv/lib/python2.7/site-packages/sahara/plugins</div><div class="line">scp -r root@[SERVER_IP]:/opt/sandbox/ ./</div><div class="line"></div><div class="line">//修改 *.egg-info/entry_points.txt文件</div><div class="line">//在[sahara.cluster.plugins]选项下,添加“sandbox = sahara.plugins.sandbox.plugin:VanillaProvider”</div><div class="line">cd /var/lib/kolla/venv/lib/python2.7/site-packages/sahara-6.0.1-py2.7.egg-info</div><div class="line">vi entry_points.txt </div><div class="line"></div><div class="line">//退出容器</div><div class="line">exit</div><div class="line"></div><div class="line">//修改Sahara_engine的配置文件</div><div class="line">//在[DEFAULT]下,添加“plugins = sandbox,vanilla,spark,cdh,ambari,storm,mapr”</div><div class="line">docker restart sahara_engine</div><div class="line">cd /etc/kolla/sahara-engine</div><div class="line">vi sahara.conf</div><div class="line"></div><div class="line">//重启Sahara_engine容器</div><div class="line">docker restart sahara_engine</div></pre></td></tr></table></figure></p>
<p>② 修改<code>Sahara_api</code>服务容器<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line">//登陆Sahara_api容器</div><div class="line">docker exec -u root -it sahara_api /bin/bash</div><div class="line"></div><div class="line">//拷贝Plugin代码</div><div class="line">cd /var/lib/kolla/venv/lib/python2.7/site-packages/sahara/plugins</div><div class="line">scp -r root@[SERVER_IP]:/opt/sandbox/ ./</div><div class="line"></div><div class="line">//修改 *.egg-info/entry_points.txt文件</div><div class="line">//在[sahara.cluster.plugins]选项下,添加“sandbox = sahara.plugins.sandbox.plugin:VanillaProvider”</div><div class="line">cd /var/lib/kolla/venv/lib/python2.7/site-packages/sahara-6.0.1-py2.7.egg-info</div><div class="line">vi entry_points.txt </div><div class="line"></div><div class="line">//退出容器</div><div class="line">exit</div><div class="line"></div><div class="line">//修改Sahara_api的配置文件</div><div class="line">//在[DEFAULT]下,添加“plugins = sandbox,vanilla,spark,cdh,ambari,storm,mapr”</div><div class="line">docker restart sahara_api</div><div class="line">cd /etc/kolla/sahara-api</div><div class="line">vi sahara.conf</div><div class="line"></div><div class="line">//重启Sahara_api容器</div><div class="line">docker restart sahara_api</div></pre></td></tr></table></figure></p>
<p>上述过程做完后,登陆<code>Dashboard</code>,找到<code>Data processing</code>下的<code>Plugin</code>,即可以看到已经生效。</p>
<blockquote>
<p><strong><em>Note:</em></strong><br>如果存在多个<code>controller</code>节点,需要每个<code>controller</code>节点都做修改!!!</p>
</blockquote>
<h4 id="通过Kolla工具进行Build镜像"><a href="#通过Kolla工具进行Build镜像" class="headerlink" title="通过Kolla工具进行Build镜像"></a>通过Kolla工具进行Build镜像</h4><p>此处的Kolla不同于上面的Kolla,上面的Kolla是指Kolla-ansible这个部署工具,这里的kolla 是个OpenStack的服务组件的Docker镜像构建工具,这点一定要分清。</p>
<p>① 安装kolla,源码安装<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">git clone http://git.trystack.cn/openstack/kolla</div><div class="line">cd kolla</div><div class="line">//切换到O版的分支</div><div class="line">git checkout origin/stable/ocata</div><div class="line">pip install ./</div><div class="line">pip show kolla //查看kolla的版本</div></pre></td></tr></table></figure></p>
<p>② 开始build镜像<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">kolla-build –b centos –t binary –p default</div></pre></td></tr></table></figure></p>
<p>相关参数说明:</p>
<ul>
<li><strong>-b:</strong>指定build的镜像系统类型,<code>centos</code>或者<code>ubuntu</code></li>
<li><strong>-t:</strong>制定安装类型,<code>binary</code>为二进制安装,<code>source</code>为源码安装</li>
<li><strong>-p:</strong>指定build哪些镜像,默认:<code>chrony</code>,<code>cron</code>,<code>kolla-toolbox</code>,<code>glance</code>,<code>haproxy</code>,<code>heat</code>,<code>heka</code>,<code>horizon</code>,<code>keepalived</code>,<code>keystone</code>,<code>mariadb</code>,<code>memcached</code>,<code>neutron</code>,<code>nova</code>,<code>openvswitch</code>,<code>rabbitmq</code>;如果不指定<code>-p</code>可以单独指定build某个,如:<code>nova</code></li>
</ul>
<blockquote>
<p><strong><em>Note:</em></strong><br>这个过程可能会因为网络问题导致build失败,可以重复几次。</p>
</blockquote>
<p>③ build完成后查看本地镜像,并打包保存:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">// 查看本地镜像</div><div class="line">docker images</div><div class="line"></div><div class="line">//镜像打包保存</div><div class="line">docker save lokolla/centos-binary-haproxy >/opt/centos-binary-haproxy.tar</div></pre></td></tr></table></figure></p>
<p>④ 在目标机器上启动一个<code>Registry</code>服务:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">docker run -d -p 4000:5000 --restart=always --name registry registry:2</div></pre></td></tr></table></figure></p>
<p>⑤ 将打包好的本地镜像,先拷贝到目标机器上,<code>load</code>一下推送到<code>registry</code>中去:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">//导入到目标机器上</div><div class="line">docker load < /opt/centos-binary-haproxy.tar</div><div class="line">//给单独的一个镜像打标签,以haproxy为例</div><div class="line">docker tag 7f5595d85f41 [SERVER_IP]:4000/test/centos-binary-haproxy:4.0.3</div><div class="line">//推送到本地registry中</div><div class="line">docker push [SERVER_IP]:4000/test/centos-binary-haproxy</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong><em>Reference:</em></strong></p>
<ul>
<li>OpenStack实战分享:Kolla多节点部署加Ceph后端: <a href="http://www.99cloud.net/html/2017/jiuzhouyuanchuang_0317/302.html" target="_blank" rel="external">http://www.99cloud.net/html/2017/jiuzhouyuanchuang_0317/302.html</a></li>
</ul>
</blockquote>
<h4 id="Docker更换国内镜像下载源"><a href="#Docker更换国内镜像下载源" class="headerlink" title="Docker更换国内镜像下载源"></a>Docker更换国内镜像下载源</h4><p>由于国内特殊的网络环境,往往我们从Docker Hub中拉取镜像并不能成功,而且速度特别慢。那么我们可以给Docker配置一个国内的registry mirror,当我们需要的镜像在mirror中则直接返回,如果没有则从Docker Hub中拉取。是否使用registry mirror对Docker用户来说是透明的。</p>
<p>DaoCloud在国内提供了首个Docker Hub镜像服务,而且免费,大大提高了国内Docker用户的使用热情,非常感谢DaoCloud。</p>
<p><strong>使用方法:</strong></p>
<p>① 修改Docker配置文件<code>/etc/default/docker</code>,添加如下内容:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io"</div></pre></td></tr></table></figure>
<p>② 重启Docker服务:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">service docker restart</div></pre></td></tr></table></figure>
<p>现在就可以直接从国内源pull镜像啦!</p>
]]></content>
<summary type="html">
<p>本部分主要介绍一些Kolla使用过程中总结的经验和技巧等零碎知识,不成体系,也会附带一部分Sahara Plugin在由Kolla部署OpenStack环境下,如何增加和生效。</p>
</summary>
<category term="学习" scheme="https://www.hanbert.cn/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Openstack" scheme="https://www.hanbert.cn/tags/Openstack/"/>
<category term="Kolla" scheme="https://www.hanbert.cn/tags/Kolla/"/>
<category term="安装部署" scheme="https://www.hanbert.cn/tags/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/"/>
</entry>
<entry>
<title>Kolla多节点物理机部署OpenStack</title>
<link href="https://www.hanbert.cn/2017/10/03/Kolla%E5%A4%9A%E8%8A%82%E7%82%B9%E7%89%A9%E7%90%86%E6%9C%BA%E9%83%A8%E7%BD%B2OpenStack/"/>
<id>https://www.hanbert.cn/2017/10/03/Kolla多节点物理机部署OpenStack/</id>
<published>2017-10-02T17:42:57.000Z</published>
<updated>2017-10-03T04:16:14.055Z</updated>
<content type="html"><![CDATA[<p>2014年下半年,OpenStack基金会已经意识到Docker对OpenStack可能造成的威胁,研究OpenStack和Docker如何并存迫在眉睫,在2015年的温哥华峰会上,推出了3个项目:</p>
<ul>
<li>kolla:把OpenStack放到容器里面,部署OpenStack</li>
<li>Magnum: 在OpenStack平台上面部署容器,后来改成COE(Container Orchestration Engine)</li>
<li>Solum:利用Docker来实现CI(Continuous Integration)/CD(Continuous Delivery)</li>
</ul>
<a id="more"></a>
<p>这就是当初基金会的设想,只不过经过2年的发展,目前就Kolla项目是最靠谱的。Magnum修改了自己的方向,并且带来的价值不大。Solum已经基本快要死掉了。</p>
<p>目前依据OpenStack的传统,Kolla项目被拆分成了三个项目:</p>
<ul>
<li>Kolla:主要负责OpenStack各个组件Docker镜像的制作</li>
<li>Kolla-Ansible:负责容器的管理配置,即OpenStack的部署,以Ansible作为编排引擎</li>
<li>Kolla-Kubernetes:和上面功能一样,只不过是以Kubernetes作为编排引擎</li>
</ul>
<p>Kolla项目自诞生以来,短短一年内投入生产环境,真正放到生产环境是在Mitaka版本。又经过了一年的完善,终于在Ocata版本,做到了一个很完善的地步。</p>
<p>Kolla的优势和使用场景,体现在如下几个方面:</p>
<ul>
<li>原子性的升级或者回退OpenStack部署;</li>
<li>基于组件升级OpenStack;</li>
<li>基于组件回退OpenStack;</li>
</ul>
<p>Kolla的最终目标是为OpenStack的每一个服务都创建一个对应的Docker Image,通过Docker Image将升级的粒度减小到Service级别,从而使升级时,对OpenStack影响能达到最小,并且一旦升级失败,也很容易回滚。升级只需要三步:Pull新版本的容器镜像,停止老版本的容器服务,然后启动新版本容器。回滚也不需要重新安装包了,直接启动老版本容器服务就行,非常方便。</p>
<p>Kolla使用到的技术如下:</p>
<ul>
<li>Docker</li>
<li>Ansible</li>
<li>Python</li>
<li>Docker-py</li>
<li>Jinja2</li>
</ul>
<blockquote>
<p><strong><em>Note:</em></strong><br>很多对Docker不熟悉人,以为把OpenStack放到Docker里,虚拟机也是跑在Docker里。其实这是误解。Kolla仅仅是把OpenStack各个服务的进程,放到Docker里而已。以前的vm怎么运行,现在还是怎么运行,没做任何的改变。</p>
</blockquote>
<h4 id="一、Kolla部署OpenStack的架构"><a href="#一、Kolla部署OpenStack的架构" class="headerlink" title="一、Kolla部署OpenStack的架构"></a>一、Kolla部署OpenStack的架构</h4><p>如下图所看到,通过Kolla部署OpenStack能够实现,全组件HA(High Available),其中,像其他OpenStack部署项目一样,对于MySQL的HA方案,默认采用的均是Galera。</p>
<p><img src="http://img.blog.csdn.net/20160205085614730" alt="kolla-ansible/specs/ha.svg"></p>
<h4 id="二、前期准备"><a href="#二、前期准备" class="headerlink" title="二、前期准备"></a>二、前期准备</h4><p>目前Kolla能够在Ubuntu和Centos两种Linux发行版上部署OpenStack,本次部署使用Centos7,OpenStack组件Nova,Cinder,Swift后端存储使用Ceph,Glance理论上后端存储也可以采用Ceph,但是采用Ceph作为后端存储的话,Glance的镜像格式必须是<code>raw</code>,目前主流镜像格式<code>img</code>、<code>qcow2</code>都需要转换为<code>raw</code>格式才能够正常使用,但是<code>raw</code>镜像不支持快照。可以自行搜索这些镜像格式之间的区别。具体基础环境要求如下:</p>
<ul>
<li>物理机最小配置:8 GB 内存,40 GB 存储</li>
<li>Centos7 操作系统,最小化安装,最好根据自己规划,在安装过程中及时更改主机名</li>
<li>最少2块网卡,此处部署使用3块,其中一个网卡是万兆网卡</li>
<li>数据盘与系统盘分离,至少1块数据盘,理想状态3块数据盘</li>
<li>至少保证部署机有<code>root</code>登陆权限,其余节点可以视情况而定</li>
</ul>
<blockquote>
<p><strong><em>Reference:</em></strong></p>
<ul>
<li>QCOW2/RAW/qemu-img 概念浅析: <a href="http://blog.csdn.net/Jmilk/article/details/69418999?locationNum=5&fps=1" target="_blank" rel="external">http://blog.csdn.net/Jmilk/article/details/69418999?locationNum=5&fps=1</a></li>
<li>qcow2、raw、vmdk等镜像格式的比较和基本转换: <a href="http://blog.chinaunix.net/uid-14735472-id-4220089.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-14735472-id-4220089.html</a></li>
</ul>
</blockquote>
<h4 id="三、网络环境准备"><a href="#三、网络环境准备" class="headerlink" title="三、网络环境准备"></a>三、网络环境准备</h4><p>本次部署,使用一台单独的48口交换机,因为采用了三个网卡,故在交换机上划分出了三个网段:</p>
<ul>
<li>Admin Network:部署过程中各节点通信,部署完成后OpenStack各组件间通信,能够连接互联网</li>
<li>Public Network:给OpenStack平台上的VM提供Floating IP以使其能够正常远程SSH和连接网络,能够连接互联网</li>
<li>Storage Network:Ceph节点间通信和数据传输的网段,内网网段,与互联网隔离</li>
</ul>
<p>本次部署三个网卡与三个网段的对应的情况如下:</p>
<ul>
<li>em1:连接到Admin Network,提前在网卡上配置好IP地址,确保能够远程SSH,且能够连接互联网</li>
<li>em2:连接到Pubic Network,只需要把网上连接到相应Port上,网卡状态为UP即可,不需要配置IP</li>
<li>p5p2:连接到 Storage Network,万兆网卡,需要提前配置一个内网地址段IP确保各个节点间能通信</li>
</ul>
<blockquote>
<p><strong><em>Note:</em></strong></p>
<ul>
<li>Public Network需要提前划分出一个地址段,预留足够的IP地址给OpenStack的VM使用</li>
<li>em2网卡一定不要配置IP地址</li>
<li>p5p2网卡不要配置<code>GateWay</code>,否则可能会与em1网卡的<code>Gateway</code>冲突,导致该主机不能够正常联网</li>
</ul>
</blockquote>
<h4 id="四、部署规划"><a href="#四、部署规划" class="headerlink" title="四、部署规划"></a>四、部署规划</h4><p>本次部署共12个节点,其中3个<code>controller</code>节点,分别命名为:controller1,controller2,controller3;9个<code>compute</code>节点,分别命名为:compute1~9;其中一台<code>controller</code>节点还承担<strong>Kolla部署机</strong>角色,具体角色划分如下:</p>
<ul>
<li>Kolla部署机:controller1</li>
<li>OpenStack镜像本地源服务器:controller1</li>
<li>3台controller节点:controller1~3</li>
<li>9台compte节点:compute1~9</li>
<li>Ceph的OSD节点:controller1~3,compute1~9的所有的数据盘</li>
</ul>
<h4 id="五、配置免密登陆"><a href="#五、配置免密登陆" class="headerlink" title="五、配置免密登陆"></a>五、配置免密登陆</h4><p>这一过程不是必须的,但是为了方便操作,最好在各个节点之间实现免密登陆,以下过程在所有的节点上执行:</p>
<p>① 生成秘钥对,输入以下命令,然后一路回车:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# ssh-keygen -t rsa</div></pre></td></tr></table></figure></p>
<p>② 将所有的公钥复制到<code>authorized_keys</code>文件中:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# cd ~/.ssh/</div><div class="line">[root@controller1 ~]# vim authorized_keys</div></pre></td></tr></table></figure></p>
<p>搜集每个节点上的<code>id_rsa.pub</code>文件内容,添加到<code>authorized_keys</code>文件中,然后保存退出。</p>
<p>③ 同样的过程,在剩余所有节点上执行一遍,然后修改<code>hosts</code>文件:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# vim /etc/hosts</div></pre></td></tr></table></figure></p>
<p>输入每个主机的<code>IP 主机名</code>,然后退出保存。</p>
<p>④ 验证是否成功:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# ssh controller2</div></pre></td></tr></table></figure></p>
<h4 id="六、安装依赖包"><a href="#六、安装依赖包" class="headerlink" title="六、安装依赖包"></a>六、安装依赖包</h4><p>以下过程在所有节点上都:</p>
<p>安装<code>epel-release</code>、<code>pip</code>、<code>git</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# yum install -y epel-release python-pip git</div></pre></td></tr></table></figure></p>
<p>如果安装过程特别慢,可以考虑更换软件源,以下是Centos7更换阿里云源的方法:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak</div><div class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</div><div class="line">或者:</div><div class="line">curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</div></pre></td></tr></table></figure></p>
<p>升级<code>pip</code>到最新版:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# pip install -U pip</div></pre></td></tr></table></figure></p>
<p>如果pip下载包也比较慢,可以更换<code>pip</code>的源为豆瓣源或者阿里云源,以下以更换为阿里云源为例:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# mkdir -p ~/.pip</div><div class="line">[root@controller1 ~]# vim ~/.pip/pip.conf</div><div class="line">// 添加以下内容:</div><div class="line">[global]</div><div class="line">index-url = http://mirrors.aliyun.com/pypi/simple/</div><div class="line">[install]</div><div class="line">trusted-host=mirrors.aliyun.com</div></pre></td></tr></table></figure></p>
<p>安装其他的一些依赖:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# yum install python-devel libffi-devel gcc openssl-devel libselinux-python</div></pre></td></tr></table></figure></p>
<p><code>OpenStack</code>、<code>RabbitMQ</code>、<code>Ceph</code>等都对节点间的时间差有一定的要求,如果时间差过大,可能导致服务不能够正常运行,为此,我们最好能够安装<code>NTP</code>服务,让每个节点自动进行时间同步:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# yum install ntp</div><div class="line">[root@controller1 ~]# systemctl enable ntpd.service</div><div class="line">[root@controller1 ~]# systemctl start ntpd.service</div></pre></td></tr></table></figure></p>
<p>安装<code>ansible</code>,并升级到最新版:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# yum install ansible</div><div class="line">[root@controller1 ~]# pip install -U ansible</div></pre></td></tr></table></figure></p>
<p>停止<code>libvirt</code>组件,否则后面安装会失败:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# systemctl stop libvirtd.service</div><div class="line">[root@controller1 ~]# systemctl disable libvirtd.service</div></pre></td></tr></table></figure></p>
<p>安装最新版<code>Docker</code>,升级到最新版,然后检查Docker的版本:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# curl -sSL https://get.docker.io | bash</div><div class="line">[root@controller1 ~]# pip install -U docker</div><div class="line">[root@controller1 ~]# docker --version</div></pre></td></tr></table></figure></p>
<p>如果由于网络原因,以上安装方法<code>Docker</code>不能够成功安装,可以使用下面的方法进行安装:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">// 设置repo</div><div class="line">[root@controller1 ~]# tee /etc/yum.repos.d/docker.repo << 'EOF'</div><div class="line">[dockerrepo]</div><div class="line">name=Docker Repository</div><div class="line">baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/</div><div class="line">enabled=1</div><div class="line">gpgcheck=1</div><div class="line">gpgkey=https://yum.dockerproject.org/gpg</div><div class="line">EOF</div><div class="line">// 安装Docker</div><div class="line">[root@controller1 ~]# yum install docker-engine docker-engine-selinux</div><div class="line">[root@controller1 ~]# pip install -U docker</div><div class="line">[root@controller1 ~]# docker --version</div></pre></td></tr></table></figure></p>
<p>对<code>Docker</code>进行配置:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# mkdir /etc/systemd/system/docker.service.d</div><div class="line">[root@controller1 ~]# tee /etc/systemd/system/docker.service.d/kolla.conf <<-'EOF'</div><div class="line">[Service]</div><div class="line">MountFlags=shared</div><div class="line">EOF</div></pre></td></tr></table></figure></p>
<p>重新加载守护进程,并重启<code>Docker</code>服务:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# systemctl daemon-reload</div><div class="line">[root@controller1 ~]# systemctl restart docker</div><div class="line">// 设置docker开机自启</div><div class="line">[root@controller1 ~]# systemctl enable docker</div></pre></td></tr></table></figure></p>
<p>为<code>Docker</code>配置访问私有仓库,修改<code>ExecStart</code>字段:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# vim /usr/lib/systemd/system/docker.service</div><div class="line">#ExecStart=/usr/bin/dockerd</div><div class="line">ExecStart=/usr/bin/dockerd --insecure-registry [SERVICE_IP]:4000</div></pre></td></tr></table></figure></p>
<p>其中<code>[SERVICE_IP]</code>换成你部署的私有仓库所在主机的<code>IP</code>,本次部署在<code>controller1</code>上,所以用<code>controller1</code>的<code>IP</code>。<br>重启<code>Docker</code>服务:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# systemctl daemon-reload</div><div class="line">[root@controller1 ~]# systemctl restart docker</div></pre></td></tr></table></figure></p>
<h4 id="七、配置Docker的私有仓库"><a href="#七、配置Docker的私有仓库" class="headerlink" title="七、配置Docker的私有仓库"></a>七、配置Docker的私有仓库</h4><p>限于国内网络环境的问题,如果直接在线安装很容易失败,所以我们非常有必要建立一个本地仓库。建立本地仓库所需要的OpenStack的各个组件的镜像,既可以通过<code>Kolla</code>进行<code>build</code>,也可以直接下载官网制作好的镜像。<br>运行<code>Registry</code>服务的容器,由于<code>5000</code>端口与<code>keystone</code>端口号冲突,所以我们需要修改其映射到本地<code>4000</code>端口上:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# docker run -d -v /opt/registry:/var/lib/registry -p 4000:5000 --restart=always --name registry registry:2</div><div class="line">// 查看是否成功启动</div><div class="line">[root@controller1 ~]# docker ps</div></pre></td></tr></table></figure></p>
<p>运行以上命令后,会自动在线拉取<code>registry:2</code>的镜像,如果因为网络环境不能够正常下载,也可以在一个网络状况比较好的机器上先下载好,然后导出为<code>.tar</code>包,再在相应的机器上导入:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">// 网络状况较好的机器上</div><div class="line">[root@localhost ~]# docker pull registry:2</div><div class="line">[root@localhost ~]# docker images</div><div class="line">[root@localhost ~]# docker save -o registry_v2.tar registry:2</div><div class="line">// 手动将 registry_v2.tar 包拷贝到目标机器上,然后导入</div><div class="line">[root@controller1 ~]# docker load -i ./registry_v2.tar</div><div class="line">[root@controller1 ~]# docker images</div></pre></td></tr></table></figure></p>
<p>当前机器内有了本地镜像了以后,在运行<code>docker run</code>,启动<code>registry</code>容器:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# docker run -d -v /opt/registry:/var/lib/registry -p 4000:5000 --restart=always --name registry registry:2</div><div class="line">// 查看是否正常启动</div><div class="line">[root@controller1 ~]# docker ps</div></pre></td></tr></table></figure></p>
<p>提前下载好官方的镜像包,本次使用:<code>centos-source-registry-ocata.tar.gz</code>,将其解压到:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tar -zxvf centos-source-registry-ocata.tar.gz -C /opt/registry/</div></pre></td></tr></table></figure></p>
<p>在浏览器中输入:[SERVICE_IP]:4000/v2/_catalog,如果现实如下,则说明已经成功安装了本地仓库:<br><img src="http://img.blog.csdn.net/20171002195129769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVveGl1anVl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="registry"></p>
<blockquote>
<p><strong><em>Reference:</em></strong></p>
<ul>
<li>OpenStack官方kolla镜像包下载地址:<a href="http://tarballs.openstack.org/kolla/images/" target="_blank" rel="external">http://tarballs.openstack.org/kolla/images/</a></li>
</ul>
<h4 id="八、安装Kolla-ansible部署工具"><a href="#八、安装Kolla-ansible部署工具" class="headerlink" title="八、安装Kolla-ansible部署工具"></a>八、安装Kolla-ansible部署工具</h4><p>此过程只需要在部署机上面执行,kolla-ansible既可以使用<code>pip</code>来安装,也可以通过<code>git</code>源码安装,本次通过源码安装:<br>下载源码包,一定要下载对应的版本,我们此次部署的是O版,所以下载O版的kolla-ansible:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# cd /opt</div><div class="line">[root@controller1 ~]# git clone http://git.trystack.cn/openstack/kolla-ansible –b stable/ocata</div></pre></td></tr></table></figure></p>
</blockquote>
<p>安装kolla-ansible:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# cd kolla-ansible</div><div class="line">[root@controller1 ~]# pip install ./</div></pre></td></tr></table></figure></p>
<p>复制配置文件和inventory文件:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# cp -r etc/kolla /etc/kolla/</div><div class="line">[root@controller1 ~]# cp -r ansible/inventory /home/inventory/</div></pre></td></tr></table></figure></p>
<p>如果是在虚拟机里装kolla,希望可以启动再启动虚拟机,那么你需要把virt_type=qemu,默认是kvm:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# mkdir -p /etc/kolla/config/nova</div><div class="line">[root@controller1 ~]# cat << EOF > /etc/kolla/config/nova/nova-compute.conf</div><div class="line">[libvirt]</div><div class="line">virt_type=qemu</div><div class="line">cpu_mode = none</div><div class="line">EOF</div></pre></td></tr></table></figure></p>
<p>生成密码文件:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# kolla-genpwd</div></pre></td></tr></table></figure></p>
<p>修改登录dashboard的admin用户的登录密码:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# vim /etc/kolla/passwords.yml</div><div class="line">// 修改以下字段</div><div class="line">keystone_admin_password: admin</div></pre></td></tr></table></figure></p>
<h4 id="九、开始部署"><a href="#九、开始部署" class="headerlink" title="九、开始部署"></a>九、开始部署</h4><p>由于我们采用的是多节点物理机部署,在部署之前,我们需要修改<code>globals.yml</code>和<code>multinode</code>两个配置文件。</p>
<p>① 修改<code>globals.yml</code><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# vim /etc/kolla/globalss.yml</div></pre></td></tr></table></figure></p>
<p>给出以下样例,附带部分相关说明:<br><figure class="highlight yaml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div><div class="line">241</div><div class="line">242</div><div class="line">243</div><div class="line">244</div><div class="line">245</div><div class="line">246</div><div class="line">247</div><div class="line">248</div><div class="line">249</div><div class="line">250</div><div class="line">251</div><div class="line">252</div><div class="line">253</div><div class="line">254</div><div class="line">255</div><div class="line">256</div><div class="line">257</div><div class="line">258</div><div class="line">259</div><div class="line">260</div><div class="line">261</div><div class="line">262</div><div class="line">263</div><div class="line">264</div><div class="line">265</div><div class="line">266</div><div class="line">267</div><div class="line">268</div><div class="line">269</div><div class="line">270</div><div class="line">271</div><div class="line">272</div><div class="line">273</div><div class="line">274</div><div class="line">275</div><div class="line">276</div><div class="line">277</div><div class="line">278</div><div class="line">279</div><div class="line">280</div><div class="line">281</div><div class="line">282</div><div class="line">283</div><div class="line">284</div><div class="line">285</div><div class="line">286</div><div class="line">287</div><div class="line">288</div><div class="line">289</div><div class="line">290</div><div class="line">291</div><div class="line">292</div><div class="line">293</div><div class="line">294</div><div class="line">295</div><div class="line">296</div><div class="line">297</div><div class="line">298</div><div class="line">299</div><div class="line">300</div><div class="line">301</div><div class="line">302</div><div class="line">303</div><div class="line">304</div><div class="line">305</div><div class="line">306</div><div class="line">307</div><div class="line">308</div><div class="line">309</div><div class="line">310</div><div class="line">311</div><div class="line">312</div><div class="line">313</div><div class="line">314</div><div class="line">315</div><div class="line">316</div><div class="line">317</div><div class="line">318</div><div class="line">319</div><div class="line">320</div><div class="line">321</div><div class="line">322</div><div class="line">323</div><div class="line">324</div><div class="line">325</div><div class="line">326</div><div class="line">327</div><div class="line">328</div><div class="line">329</div><div class="line">330</div><div class="line">331</div><div class="line">332</div><div class="line">333</div><div class="line">334</div><div class="line">335</div><div class="line">336</div><div class="line">337</div><div class="line">338</div><div class="line">339</div><div class="line">340</div><div class="line">341</div><div class="line">342</div><div class="line">343</div><div class="line">344</div><div class="line">345</div><div class="line">346</div></pre></td><td class="code"><pre><div class="line"><span class="meta">---</span></div><div class="line"><span class="comment">###################</span></div><div class="line"><span class="comment"># Kolla options</span></div><div class="line"><span class="comment">###################</span></div><div class="line"><span class="comment"># Valid options are [ COPY_ONCE, COPY_ALWAYS ]</span></div><div class="line"><span class="comment">#config_strategy: "COPY_ALWAYS"</span></div><div class="line"></div><div class="line"><span class="comment"># Valid options are [ centos, oraclelinux, ubuntu ]</span></div><div class="line"><span class="comment"># 和我们使用的操作系统有关系,此处我们用的centos7,所以填写“centos”</span></div><div class="line"><span class="attr">kolla_base_distro:</span> <span class="string">"centos"</span> </div><div class="line"></div><div class="line"><span class="comment"># Valid options are [ binary, source ]</span></div><div class="line"><span class="comment"># 我们下载的官方镜像包是“source”类型的,如果是“binary”就改成“binary”</span></div><div class="line"><span class="attr">kolla_install_type:</span> <span class="string">"source"</span></div><div class="line"></div><div class="line"><span class="comment"># Valid option is Docker repository tag</span></div><div class="line"><span class="comment"># 这个可以看看官方镜像包中软件的tag是多少,我们下载的O版对应:4.0.3</span></div><div class="line"><span class="attr">openstack_release:</span> <span class="string">"4.0.3"</span></div><div class="line"></div><div class="line"><span class="comment"># Location of configuration overrides</span></div><div class="line"><span class="comment">#node_custom_config: "/etc/kolla/config"</span></div><div class="line"></div><div class="line"><span class="comment"># This should be a VIP, an unused IP on your network that will float between</span></div><div class="line"><span class="comment"># the hosts running keepalived for high-availability. When running an All-In-One</span></div><div class="line"><span class="comment"># without haproxy and keepalived, this should be the first IP on your</span></div><div class="line"><span class="comment"># 'network_interface' as set in the Networking section below.</span></div><div class="line"><span class="comment">#这个IP地址是和em1网卡在同一个网段,但是没有使用的地址,用来做HA的绑定地址</span></div><div class="line"><span class="attr">kolla_internal_vip_address:</span> <span class="string">"xxx.xxx.xxx.xxx"</span></div><div class="line"></div><div class="line"><span class="comment"># This is the DNS name that maps to the kolla_internal_vip_address VIP. By</span></div><div class="line"><span class="comment"># default it is the same as kolla_internal_vip_address.</span></div><div class="line"><span class="comment">#kolla_internal_fqdn: "{{ kolla_internal_vip_address }}"</span></div><div class="line"></div><div class="line"><span class="comment"># This should be a VIP, an unused IP on your network that will float between</span></div><div class="line"><span class="comment"># the hosts running keepalived for high-availability. It defaults to the</span></div><div class="line"><span class="comment"># kolla_internal_vip_address, allowing internal and external communication to</span></div><div class="line"><span class="comment"># share the same address. Specify a kolla_external_vip_address to separate</span></div><div class="line"><span class="comment"># internal and external requests between two VIPs.</span></div><div class="line"><span class="comment">#kolla_external_vip_address: "{{ kolla_internal_vip_address }}"</span></div><div class="line"></div><div class="line"><span class="comment"># The Public address used to communicate with OpenStack as set in the public_url</span></div><div class="line"><span class="comment"># for the endpoints that will be created. This DNS name should map to</span></div><div class="line"><span class="comment"># kolla_external_vip_address.</span></div><div class="line"><span class="comment">#kolla_external_fqdn: "{{ kolla_external_vip_address }}"</span></div><div class="line"></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># Docker options</span></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># Below is an example of a private repository with authentication. Note the</span></div><div class="line"><span class="comment"># Docker registry password can also be set in the passwords.yml file.</span></div><div class="line"></div><div class="line"><span class="comment">#填写本地仓库的运行的服务器地址+端口号</span></div><div class="line"><span class="attr">docker_registry:</span> <span class="string">"[SERVICE_IP]:4000"</span></div><div class="line"><span class="comment">#如果使用的是OpenStack官方的镜像包,此项必须为:“lokolla”</span></div><div class="line"><span class="attr">docker_namespace:</span> <span class="string">"lokolla"</span></div><div class="line"><span class="comment">#docker_registry_username: "sam"</span></div><div class="line"><span class="comment">#docker_registry_password: "correcthorsebatterystaple"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">###############################</span></div><div class="line"><span class="comment"># Neutron - Networking Options</span></div><div class="line"><span class="comment">###############################</span></div><div class="line"><span class="comment"># This interface is what all your api services will be bound to by default.</span></div><div class="line"><span class="comment"># Additionally, all vxlan/tunnel and storage network traffic will go over this</span></div><div class="line"><span class="comment"># interface by default. This interface must contain an IPv4 address.</span></div><div class="line"><span class="comment"># It is possible for hosts to have non-matching names of interfaces - these can</span></div><div class="line"><span class="comment"># be set in an inventory file per host or per group or stored separately, see</span></div><div class="line"><span class="comment"># http://docs.ansible.com/ansible/intro_inventory.html</span></div><div class="line"><span class="comment"># Yet another way to workaround the naming problem is to create a bond for the</span></div><div class="line"><span class="comment"># interface on all hosts and give the bond name here. Similar strategy can be</span></div><div class="line"><span class="comment"># followed for other types of interfaces.</span></div><div class="line"><span class="comment">#此处配置第一块网卡,也是其他未制定网卡的Interface的默认选项</span></div><div class="line"><span class="attr">network_interface:</span> <span class="string">"em1"</span></div><div class="line"></div><div class="line"><span class="comment"># These can be adjusted for even more customization. The default is the same as</span></div><div class="line"><span class="comment"># the 'network_interface'. These interfaces must contain an IPv4 address.</span></div><div class="line"><span class="comment">#kolla_external_vip_interface: "{{ network_interface }}"</span></div><div class="line"><span class="comment">#api_interface: "{{ network_interface }}"</span></div><div class="line"><span class="comment">#Ceph数据传输专用网卡,此项最好为万兆网卡,以提升总体性能</span></div><div class="line"><span class="attr">storage_interface:</span> <span class="string">"p5p2"</span></div><div class="line"><span class="attr">cluster_interface:</span> <span class="string">"p5p2"</span></div><div class="line"><span class="comment">#tunnel_interface: "{{ network_interface }}"</span></div><div class="line"><span class="comment">#dns_interface: "{{ network_interface }}"</span></div><div class="line"></div><div class="line"><span class="comment"># This is the raw interface given to neutron as its external network port. Even</span></div><div class="line"><span class="comment"># though an IP address can exist on this interface, it will be unusable in most</span></div><div class="line"><span class="comment"># configurations. It is recommended this interface not be configured with any IP</span></div><div class="line"><span class="comment"># addresses for that reason.</span></div><div class="line"><span class="comment">#floatingIP用来外转数据包的网卡,就是我们空出来,没有配置IP的那个网卡</span></div><div class="line"><span class="attr">neutron_external_interface:</span> <span class="string">"em2"</span></div><div class="line"></div><div class="line"><span class="comment"># Valid options are [ openvswitch, linuxbridge ]</span></div><div class="line"><span class="comment">#neutron_plugin_agent: "openvswitch"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># keepalived options</span></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># Arbitrary unique number from 0..255</span></div><div class="line"><span class="comment">#keepalived_virtual_router_id: "51"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># TLS options</span></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># To provide encryption and authentication on the kolla_external_vip_interface,</span></div><div class="line"><span class="comment"># TLS can be enabled. When TLS is enabled, certificates must be provided to</span></div><div class="line"><span class="comment"># allow clients to perform authentication.</span></div><div class="line"><span class="comment">#kolla_enable_tls_external: "no"</span></div><div class="line"><span class="comment">#kolla_external_fqdn_cert: "{{ node_config_directory }}/certificates/haproxy.pem"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># OpenStack options</span></div><div class="line"><span class="comment">####################</span></div><div class="line"><span class="comment"># Use these options to set the various log levels across all OpenStack projects</span></div><div class="line"><span class="comment"># Valid options are [ True, False ]</span></div><div class="line"><span class="comment">#openstack_logging_debug: "False"</span></div><div class="line"></div><div class="line"><span class="comment"># Valid options are [ novnc, spice ]</span></div><div class="line"><span class="comment">#nova_console: "novnc"</span></div><div class="line"></div><div class="line"><span class="comment"># OpenStack services can be enabled or disabled with these options</span></div><div class="line"><span class="comment"># 以下选项根据自己想要安装的OpenStack组件,把相应选项前的注释去掉即可</span></div><div class="line"><span class="attr">enable_aodh:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_barbican: "no"</span></div><div class="line"><span class="attr">enable_ceilometer:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_central_logging: "no"</span></div><div class="line"><span class="attr">enable_ceph:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#如果用ceph作为swift的后端存储,enable_ceph_rgw必须为yes</span></div><div class="line"><span class="attr">enable_ceph_rgw:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_chrony: "no"</span></div><div class="line"><span class="attr">enable_cinder:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_cinder_backend_hnas_iscsi: "no"</span></div><div class="line"><span class="comment">#enable_cinder_backend_hnas_nfs: "no"</span></div><div class="line"><span class="comment">#enable_cinder_backend_iscsi: "no"</span></div><div class="line"><span class="comment">#enable_cinder_backend_lvm: "no"</span></div><div class="line"><span class="comment">#enable_cinder_backend_nfs: "no"</span></div><div class="line"><span class="comment">#enable_cloudkitty: "no"</span></div><div class="line"><span class="comment">#enable_collectd: "no"</span></div><div class="line"><span class="comment">#enable_congress: "no"</span></div><div class="line"><span class="comment">#enable_designate: "no"</span></div><div class="line"><span class="comment">#enable_destroy_images: "no"</span></div><div class="line"><span class="comment">#enable_etcd: "no"</span></div><div class="line"><span class="attr">enable_freezer:</span> <span class="string">"yes"</span></div><div class="line"><span class="attr">enable_gnocchi:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_grafana: "no"</span></div><div class="line"><span class="attr">enable_heat:</span> <span class="string">"yes"</span></div><div class="line"><span class="attr">enable_horizon:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_horizon_cloudkitty: "{{ enable_cloudkitty | bool }}"</span></div><div class="line"><span class="attr">enable_horizon_freezer:</span> <span class="string">"<span class="template-variable">{{ enable_freezer | bool }}</span>"</span></div><div class="line"><span class="comment">#enable_horizon_ironic: "{{ enable_ironic | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_karbor: "{{ enable_karbor | bool }}"</span></div><div class="line"><span class="attr">enable_horizon_magnum:</span> <span class="string">"<span class="template-variable">{{ enable_magnum | bool }}</span>"</span></div><div class="line"><span class="comment">#enable_horizon_manila: "{{ enable_manila | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_mistral: "{{ enable_mistral | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_murano: "{{ enable_murano | bool }}"</span></div><div class="line"><span class="attr">enable_horizon_neutron_lbaas:</span> <span class="string">"<span class="template-variable">{{ enable_neutron_lbaas | bool }}</span>"</span></div><div class="line"><span class="attr">enable_horizon_sahara:</span> <span class="string">"<span class="template-variable">{{ enable_sahara | bool }}</span>"</span></div><div class="line"><span class="comment">#enable_horizon_searchlight: "{{ enable_searchlight | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_senlin: "{{ enable_senlin | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_solum: "{{ enable_solum | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_tacker: "{{ enable_tacker | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_trove: "{{ enable_trove | bool }}"</span></div><div class="line"><span class="comment">#enable_horizon_watcher: "{{ enable_watcher | bool }}"</span></div><div class="line"><span class="comment">#enable_influxdb: "no"</span></div><div class="line"><span class="comment">#enable_ironic: "no"</span></div><div class="line"><span class="comment">#enable_karbor: "no"</span></div><div class="line"><span class="comment">#enable_kuryr: "no"</span></div><div class="line"><span class="attr">enable_magnum:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_manila: "no"</span></div><div class="line"><span class="comment">#enable_manila_backend_generic: "no"</span></div><div class="line"><span class="comment">#enable_manila_backend_hnas: "no"</span></div><div class="line"><span class="comment">#enable_mistral: "no"</span></div><div class="line"><span class="attr">enable_mongodb:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_murano: "no"</span></div><div class="line"><span class="comment">#enable_multipathd: "no"</span></div><div class="line"><span class="comment">#enable_neutron_dvr: "yes"</span></div><div class="line"><span class="comment">#enable_neutron_lbaas: "yes"</span></div><div class="line"><span class="comment">#enable_neutron_fwaas: "yes"</span></div><div class="line"><span class="comment">#enable_neutron_qos: "yes"</span></div><div class="line"><span class="comment">#enable_neutron_agent_ha: "no"</span></div><div class="line"><span class="comment">#enable_neutron_vpnaas: "yes"</span></div><div class="line"><span class="comment">#enable_nova_serialconsole_proxy: "no"</span></div><div class="line"><span class="comment">#enable_octavia: "no"</span></div><div class="line"><span class="comment">#enable_panko: "no"</span></div><div class="line"><span class="comment">#enable_rally: "no"</span></div><div class="line"><span class="attr">enable_sahara:</span> <span class="string">"yes"</span></div><div class="line"><span class="comment">#enable_searchlight: "no"</span></div><div class="line"><span class="comment">#enable_senlin: "no"</span></div><div class="line"><span class="comment">#enable_solum: "no"</span></div><div class="line"><span class="comment">#这个如果开启了enable_ceph_rgw_keystone, enable_swift必须为no,两者只能启用一个</span></div><div class="line"><span class="comment">#enable_swift: "no"</span></div><div class="line"><span class="comment">#enable_telegraf: "no"</span></div><div class="line"><span class="comment">#enable_tacker: "no"</span></div><div class="line"><span class="comment">#enable_tempest: "no"</span></div><div class="line"><span class="comment">#enable_trove: "no"</span></div><div class="line"><span class="comment">#enable_vmtp: "no"</span></div><div class="line"><span class="comment">#enable_watcher: "yes"</span></div><div class="line"></div><div class="line"><span class="comment">###################</span></div><div class="line"><span class="comment"># Ceph options</span></div><div class="line"><span class="comment">###################</span></div><div class="line"><span class="comment"># Ceph can be setup with a caching to improve performance. To use the cache you</span></div><div class="line"><span class="comment"># must provide separate disks than those for the OSDs</span></div><div class="line"><span class="comment">#ceph_enable_cache: "no"</span></div><div class="line"><span class="comment"># Valid options are [ forward, none, writeback ]</span></div><div class="line"><span class="comment">#ceph_cache_mode: "writeback"</span></div><div class="line"></div><div class="line"><span class="comment"># A requirement for using the erasure-coded pools is you must setup a cache tier</span></div><div class="line"><span class="comment"># Valid options are [ erasure, replicated ]</span></div><div class="line"><span class="comment">#ceph_pool_type: "replicated"</span></div><div class="line"></div><div class="line"><span class="comment"># Integrate ceph rados object gateway with openstack keystone</span></div><div class="line"><span class="comment">#和enable_swift两个只能选择一个为“yes”</span></div><div class="line"><span class="attr">enable_ceph_rgw_keystone:</span> <span class="string">"yes"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">##############################</span></div><div class="line"><span class="comment"># Keystone - Identity Options</span></div><div class="line"><span class="comment">##############################</span></div><div class="line"></div><div class="line"><span class="comment"># Valid options are [ uuid, fernet ]</span></div><div class="line"><span class="comment">#keystone_token_provider: 'uuid'</span></div><div class="line"></div><div class="line"><span class="comment"># Interval to rotate fernet keys by (in seconds). Must be an interval of</span></div><div class="line"><span class="comment"># 60(1 min), 120(2 min), 180(3 min), 240(4 min), 300(5 min), 360(6 min),</span></div><div class="line"><span class="comment"># 600(10 min), 720(12 min), 900(15 min), 1200(20 min), 1800(30 min),</span></div><div class="line"><span class="comment"># 3600(1 hour), 7200(2 hour), 10800(3 hour), 14400(4 hour), 21600(6 hour),</span></div><div class="line"><span class="comment"># 28800(8 hour), 43200(12 hour), 86400(1 day), 604800(1 week).</span></div><div class="line"><span class="comment">#fernet_token_expiry: 86400</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">#########################</span></div><div class="line"><span class="comment"># Glance - Image Options</span></div><div class="line"><span class="comment">#########################</span></div><div class="line"><span class="comment"># Configure image backend.</span></div><div class="line"><span class="comment"># 此处我们选择glance后端为file,因为ceph作为后端的时候,只能使用raw的镜像</span></div><div class="line"><span class="attr">glance_backend_file:</span> <span class="string">"yes"</span></div><div class="line"><span class="attr">glance_backend_ceph:</span> <span class="string">"no"</span></div><div class="line"></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Ceilometer options</span></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Valid options are [ mongodb, mysql, gnocchi ]</span></div><div class="line"><span class="comment"># 此时我们用gnocchi作为ceilometer的数据库,也可以选用mongodb</span></div><div class="line"><span class="attr">ceilometer_database_type:</span> <span class="string">"gnocchi"</span></div><div class="line"></div><div class="line"><span class="comment"># Valid options are [ mongodb, gnocchi, panko ]</span></div><div class="line"><span class="comment"># 此时我们用gnocchi作为ceilometer的数据库,也可以选用mongodb</span></div><div class="line"><span class="attr">ceilometer_event_type:</span> <span class="string">"gnocchi"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Barbican options</span></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Valid options are [ simple_crypto, p11_crypto ]</span></div><div class="line"><span class="comment">#barbican_crypto_plugin: "simple_crypto"</span></div><div class="line"><span class="comment">#barbican_library_path: "/usr/lib/libCryptoki2_64.so"</span></div><div class="line"></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment">## Panko options</span></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Valid options are [ mongodb, mysql ]</span></div><div class="line"><span class="comment">#panko_database_type: "mysql"</span></div><div class="line"></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Gnocchi options</span></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Valid options are [ file, ceph ]</span></div><div class="line"><span class="comment">#gnocchi_backend_storage: "{{ 'ceph' if enable_ceph|bool else 'file' }}"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">#################################</span></div><div class="line"><span class="comment"># Cinder - Block Storage Options</span></div><div class="line"><span class="comment">#################################</span></div><div class="line"><span class="comment"># Enable / disable Cinder backends</span></div><div class="line"><span class="comment">#用ceph作为cinder的后端存储</span></div><div class="line"><span class="attr">cinder_backend_ceph:</span> <span class="string">"<span class="template-variable">{{ enable_ceph }}</span>"</span></div><div class="line"><span class="comment">#cinder_volume_group: "cinder-volumes"</span></div><div class="line"><span class="comment">#cinder_backup_driver: "nfs"</span></div><div class="line"><span class="comment">#cinder_backup_share: ""</span></div><div class="line"><span class="comment">#cinder_backup_mount_options_nfs: ""</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Designate options</span></div><div class="line"><span class="comment">#######################</span></div><div class="line"><span class="comment"># Valid options are [ bind9 ]</span></div><div class="line"><span class="attr">designate_backend:</span> <span class="string">"bind9"</span></div><div class="line"><span class="attr">designate_ns_record:</span> <span class="string">"sample.openstack.org"</span></div><div class="line"></div><div class="line"><span class="comment">#########################</span></div><div class="line"><span class="comment"># Nova - Compute Options</span></div><div class="line"><span class="comment">#########################</span></div><div class="line"><span class="comment">#用ceph作为nova的后端存储</span></div><div class="line"><span class="attr">nova_backend_ceph:</span> <span class="string">"<span class="template-variable">{{ enable_ceph }}</span>"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">##############################</span></div><div class="line"><span class="comment"># Horizon - Dashboard Options</span></div><div class="line"><span class="comment">##############################</span></div><div class="line"><span class="comment">#horizon_backend_database: "{{ enable_murano | bool }}"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">#######################################</span></div><div class="line"><span class="comment"># Manila - Shared File Systems Options</span></div><div class="line"><span class="comment">#######################################</span></div><div class="line"><span class="comment"># HNAS backend configuration</span></div><div class="line"><span class="comment">#hnas_ip:</span></div><div class="line"><span class="comment">#hnas_user:</span></div><div class="line"><span class="comment">#hnas_password:</span></div><div class="line"><span class="comment">#hnas_evs_id:</span></div><div class="line"><span class="comment">#hnas_evs_ip:</span></div><div class="line"><span class="comment">#hnas_file_system_name:</span></div><div class="line"></div><div class="line"><span class="comment">##################################</span></div><div class="line"><span class="comment"># Swift - Object Storage Options</span></div><div class="line"><span class="comment">##################################</span></div><div class="line"><span class="comment"># Swift expects block devices to be available for storage. Two types of storage</span></div><div class="line"><span class="comment"># are supported: 1 - storage device with a special partition name and filesystem</span></div><div class="line"><span class="comment"># label, 2 - unpartitioned disk with a filesystem. The label of this filesystem</span></div><div class="line"><span class="comment"># is used to detect the disk which Swift will be using.</span></div><div class="line"></div><div class="line"><span class="comment"># Swift support two mathcing modes, valid options are [ prefix, strict ]</span></div><div class="line"><span class="comment">#swift_devices_match_mode: "strict"</span></div><div class="line"></div><div class="line"><span class="comment"># This parameter defines matching pattern: if "strict" mode was selected,</span></div><div class="line"><span class="comment"># for swift_devices_match_mode then swift_device_name should specify the name of</span></div><div class="line"><span class="comment"># the special swift partition for example: "KOLLA_SWIFT_DATA", if "prefix" mode was</span></div><div class="line"><span class="comment"># selected then swift_devices_name should specify a pattern which would match to</span></div><div class="line"><span class="comment"># filesystems' labels prepared for swift.</span></div><div class="line"><span class="comment">#swift_devices_name: "KOLLA_SWIFT_DATA"</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">################################################</span></div><div class="line"><span class="comment"># Tempest - The OpenStack Integration Test Suite</span></div><div class="line"><span class="comment">################################################</span></div><div class="line"><span class="comment"># following value must be set when enable tempest</span></div><div class="line"><span class="attr">tempest_image_id:</span></div><div class="line"><span class="attr">tempest_flavor_ref_id:</span></div><div class="line"><span class="attr">tempest_public_network_id:</span></div><div class="line"><span class="attr">tempest_floating_network_name:</span></div><div class="line"></div><div class="line"><span class="comment"># tempest_image_alt_id: "{{ tempest_image_id }}"</span></div><div class="line"><span class="comment"># tempest_flavor_ref_alt_id: "{{ tempest_flavor_ref_id }}"</span></div></pre></td></tr></table></figure></p>
<p>② 配置<code>multinode</code>文件,这个文件主要是指定物理节点的角色,供ansible使用:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# vim /home/inventory/multinode</div></pre></td></tr></table></figure></p>
<p>给出如下样例:<br><figure class="highlight yaml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># These initial groups are the only groups required to be modified. The</span></div><div class="line"><span class="comment"># additional groups are for more control of the environment.</span></div><div class="line"><span class="string">[control]</span></div><div class="line"><span class="comment"># These hostname must be resolvable from your deployment host</span></div><div class="line"><span class="string">controller1</span></div><div class="line"><span class="string">controller2</span></div><div class="line"><span class="string">controller3</span></div><div class="line"></div><div class="line"><span class="comment"># The above can also be specified as follows:</span></div><div class="line"><span class="comment">#control[01:03] ansible_user=kolla</span></div><div class="line"></div><div class="line"><span class="comment"># The network nodes are where your l3-agent and loadbalancers will run</span></div><div class="line"><span class="comment"># This can be the same as a host in the control group</span></div><div class="line"><span class="string">[network]</span></div><div class="line"><span class="string">controller1</span></div><div class="line"><span class="string">controller2</span></div><div class="line"><span class="string">controller3</span></div><div class="line"></div><div class="line"><span class="string">[compute]</span></div><div class="line"><span class="string">compute1</span></div><div class="line"><span class="string">compute2</span></div><div class="line"><span class="string">compute3</span></div><div class="line"><span class="string">compute4</span></div><div class="line"><span class="string">compute5</span></div><div class="line"><span class="string">compute6</span></div><div class="line"><span class="string">compute7</span></div><div class="line"><span class="string">compute8</span></div><div class="line"><span class="string">compute9</span></div><div class="line"></div><div class="line"><span class="string">[monitoring]</span></div><div class="line"><span class="string">controller1</span></div><div class="line"></div><div class="line"><span class="comment"># When compute nodes and control nodes use different interfaces,</span></div><div class="line"><span class="comment"># you can specify "api_interface" and other interfaces like below:</span></div><div class="line"><span class="comment">#compute01 neutron_external_interface=eth0 api_interface=em1 storage_interface=em1 tunnel_interface=em1</span></div><div class="line"></div><div class="line"><span class="string">[storage]</span></div><div class="line"><span class="string">controller1</span></div><div class="line"><span class="string">controller2</span></div><div class="line"><span class="string">controller3</span></div><div class="line"><span class="string">compute1</span></div><div class="line"><span class="string">compute2</span></div><div class="line"><span class="string">compute3</span></div><div class="line"><span class="string">compute4</span></div><div class="line"><span class="string">compute5</span></div><div class="line"><span class="string">compute6</span></div><div class="line"><span class="string">compute7</span></div><div class="line"><span class="string">compute8</span></div><div class="line"><span class="string">compute9</span></div><div class="line"></div><div class="line"><span class="comment"># 以下剩余的部分不需要修改</span></div></pre></td></tr></table></figure></p>
<p>③ 为安装Ceph准备OSD节点,在所有的存储节点上执行如下命令,此次我们以有两块数据盘 <code>sdb</code>、<code>sdc</code>为例:<br>格式化<code>sdb</code>数据盘:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# parted /dev/sdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP 1 -1</div><div class="line">[root@controller1 ~]# parted /dev/sdb print</div><div class="line">Model: VMware, VMware Virtual S (scsi)</div><div class="line">Disk /dev/sdb: 500GB</div><div class="line">Sector size (logical/physical): 512B/512B</div><div class="line">Partition Table: gpt</div><div class="line">Number Start End Size File system Name Flags</div><div class="line"> 1 1049kB 10.7GB 10.7GB KOLLA_CEPH_OSD_BOOTSTRAP</div></pre></td></tr></table></figure></p>
<p>格式化<code>sdc</code>数据盘:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# parted /dev/sdc -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP 1 -1</div><div class="line">[root@controller1 ~]# parted /dev/sdc print</div><div class="line">Model: VMware, VMware Virtual S (scsi)</div><div class="line">Disk /dev/sdc: 500GB</div><div class="line">Sector size (logical/physical): 512B/512B</div><div class="line">Partition Table: gpt</div><div class="line">Number Start End Size File system Name Flags</div><div class="line"> 1 1049kB 10.7GB 10.7GB KOLLA_CEPH_OSD_BOOTSTRAP</div></pre></td></tr></table></figure></p>
<p>④ 部署前检查,只需要在部署节点上执行如下命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# kolla-ansible prechecks -i /home/inventory/multinode</div></pre></td></tr></table></figure></p>
<p>这时候,kolla会自动对配置文件,和当前机器的部署环境做检测,如果全是<code>ok</code>,那就可以开始部署,如果出现了<code>fail</code>可以根据相应的提示,查找问题并是修复,然后再检查一遍,如此循环,直到全部<code>ok</code>为止。预计执行大概需要半个小时,如果相看详细的输出日志,可以在命令后面加上<code>-vvv</code>。</p>
<p>④ 开始部署,只需要在部署节点上执行如下命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# kolla-ansible deploy -i /home/inventory/multinode</div></pre></td></tr></table></figure></p>
<p>这时候,kolla便开始自动从本地仓库中拉取相应的镜像,在<code>/etc/kolla/</code>目录下生成各个组件的配置文件,根据配置文件启动相应的组件的<code>container</code>并调用<code>kolla_start</code>脚本进行初始化,然后配置各个服务的<code>endpoint</code>地址,最终完成<code>OpenStack</code>的安装。首次执行需要拉取镜像,时间会比较长,以后每次重复执行不需要拉取镜像,大概运行时间为半个小时左右,如果想看详细的日志信息,可以在命令后面加上<code>-vvv</code>。</p>
<p>⑤ 部署过程中如果遇到什么错误导致了<code>fail</code>,可以先看看输出信息,是否能够定位到具体的问题,如果可以则修复问题,如果没有什么头绪,可以直接重试运行上述命令,进行再次部署,基本可能会成功,如果问题重复出现,则需要好好看看输出日志,找找问题所在并修复。</p>
<p>⑥ 成功部署后,可以通过如下命令查看是否所有的<code>container</code>都在正常运行:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# docker ps -a</div></pre></td></tr></table></figure></p>
<p>如果都正常,可以在浏览器中输入你再<code>globals.yml</code>制定的<code>kolla_internal_vip_address</code>的IP地址来访问<code>dashboard</code>。用户名为:<code>admin</code>,登陆密码为你再<code>passwords.yml</code>中制定的<code>keystone_admin_password</code>字段的值。</p>
<p>⑦ 如果想要增加组件,可以直接修改<code>globals.yml</code>文件中的配置项,然后运行④中的命令。</p>
<p>⑧ 如果想要重新部署,可以使用如下命令清理环境,然后再次运行④中的命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# kolla-ansible destroy -i /home/inventory/multinode</div></pre></td></tr></table></figure></p>
<p>会有一个提示你确认的过程,只需要按照它的提示,输入相应的命令选项确认即可。</p>
<blockquote>
<p><strong><em>Note:</em></strong><br>在执行<code>destroy</code>命令之前一定要确保,当前OpenStack平台上没有存储镜像,也没有相应的<code>instance</code>和<code>volume</code>,也没有swift的存储空间,总而言之,OpenStack上面除了配置选项外,不能存有任何额外的东西,否则会导致清理环境失败。<strong>这点一定要切记,很重要!!!</strong></p>
</blockquote>
<p>如果使用的Ceph储存,还需要删除相应的挂在盘并重新打上<code>OSD</code>标签,此处以有<code>sdb</code>,<code>sdc</code>两块数据盘为例:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">//查看当前</div><div class="line">[root@controller1 ~]# df -h</div><div class="line">......</div><div class="line">/dev/sdb1 495G 41M 495G 1% /var/lib/ceph/osd/40d7390c-43d5-48f9-ad94-9cd59393b111</div><div class="line">/dev/sdc1 495G 41M 495G 1% /var/lib/ceph/osd/2d4f594e-5212-4fcc-ada3-e9553f7c8050</div><div class="line">......</div><div class="line"></div><div class="line">//卸载这两块盘</div><div class="line">[root@controller1 ~]# umount /dev/sdb1</div><div class="line">[root@controller1 ~]# umount /dev/sdc1</div><div class="line"></div><div class="line">//重新为两块盘打上OSD标签</div><div class="line">[root@controller1 ~]# parted /dev/sdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP 1 -1</div><div class="line">[root@controller1 ~]# parted /dev/sdc -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP 1 -1</div></pre></td></tr></table></figure></p>
<p>此时部署环境已经准备好,再次运行④中的命令,进行部署,非常方便。</p>
<h4 id="十、验证部署并初始化"><a href="#十、验证部署并初始化" class="headerlink" title="十、验证部署并初始化"></a>十、验证部署并初始化</h4><p>部署完成后,我们需要进行验证,会在<code>/etc/kolla</code>目录下生成<code>admin-openrc.sh</code>文件:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# kolla-ansible post-deploy</div></pre></td></tr></table></figure></p>
<p>安装OpenStack的client端:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# pip install python-openstackclient</div></pre></td></tr></table></figure></p>
<p>编辑初始化脚本文件<code>/usr/share/kolla-ansible/init-runonce</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# vim /usr/share/kolla-ansible/init-runonce</div><div class="line">// 修改一下部分</div><div class="line">EXT_NET_CIDR='192.168.12.0/24'</div><div class="line">EXT_NET_RANGE='start=192.168.12.30,end=192.168.12.40'</div><div class="line">EXT_NET_GATEWAY='192.168.12.1'</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong><em>Note:</em></strong><br>192.168.12.0只是一个示例网络,这个网络是给VM的floatingIP来用,就是我上面em2接的网络,这个网络需要可以通过路由器访问互联网,并且能够远程SSH。此处的IP地址请根据自己的实际情况修改。</p>
</blockquote>
<p>运行初始化脚本,进行初始化:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@controller1 ~]# source /etc/kolla/admin-openrc.sh</div><div class="line">[root@controller1 ~]# cd /usr/share/kolla-ansible</div><div class="line">[root@controller1 ~]# ./init-runonce</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong><em>Note:</em></strong><br>上面这个初试化过程中需要从<code>http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img</code>下载一个测试镜像,限于网络原因,有可能下载很慢或者下载失败,我们可以手动用下载工作下载好,放到<code>/usr/share/</code>目录下,这样,脚本就会检测到已经下载完成,不会再进行下载,直接上传。</p>
</blockquote>
<p>可以根据脚本最后运行完的提示运行如下命令,创建一个VM:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">openstack server create \</div><div class="line"> --image cirros \</div><div class="line"> --flavor m1.tiny \</div><div class="line"> --key-name mykey \</div><div class="line"> --nic net-id=2ba93782-71e2-44d6-ad64-796c5853dcce \</div><div class="line"> demo1</div></pre></td></tr></table></figure></p>
<p>登陆dashboard,正常使用OpenStack。</p>
<h4 id="十一、附Docker常用命令:"><a href="#十一、附Docker常用命令:" class="headerlink" title="十一、附Docker常用命令:"></a>十一、附Docker常用命令:</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line">// 列出当前宿主机上已有的镜像</div><div class="line">[root@controller1 ~]# docker images</div><div class="line">// 在docker index中搜索image</div><div class="line">[root@controller1 ~]# docker search IMAGE_NAME</div><div class="line">// 从docker registry server 中下拉image或repository,只写名字为从官方hub拉取</div><div class="line">[root@controller1 ~]# docker pull [SERVICE_IP]:4000/mongo:latest</div><div class="line">// 推送一个image或repository到registry</div><div class="line">[root@controller1 ~]# docker push [SERVICE_IP]:4000/mongo:2014-10-27</div><div class="line">// 从image启动一个container</div><div class="line">[root@controller1 ~]# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]</div><div class="line">// 将一个container固化为一个新的image</div><div class="line">[root@controller1 ~]# docker commit <container> [repo:tag]</div><div class="line">// 开启/停止/重启container(start/stop/restart)</div><div class="line">[root@controller1 ~]# docker start/stop/restart CONTAINER_ID</div><div class="line">// 查看image或container的底层信息(inspect)</div><div class="line">[root@controller1 ~]# docker inspect CONTAINER_ID</div><div class="line">// 删除一个或多个container</div><div class="line">[root@controller1 ~]# docker rm <container_id/contaner_name></div><div class="line">// 删除所有停止的容器</div><div class="line">[root@controller1 ~]# docker rm $(docker ps -a -q)</div><div class="line">// 删除一个或多个image</div><div class="line">[root@controller1 ~]# docker rmi <image_id/image_name ...></div><div class="line">// 查看容器的信息container</div><div class="line">[root@controller1 ~]# docker ps -a</div><div class="line">// 查看容器中正在运行的进程</div><div class="line">[root@controller1 ~]# docker top CONTAINER_ID</div><div class="line">// 查看容器的运行日志</div><div class="line">[root@controller1 ~]# docker logs CONTAINER_ID</div><div class="line">// 导出当前宿主机上已有的镜像</div><div class="line">[root@controller1 ~]# docker save -o NAME.tar IMAGE_NAEM:TAG</div><div class="line">// 导入已有的镜像tar包</div><div class="line">[root@controller1 ~]# docker Load -i NAME.tar</div><div class="line">// 以root权限登陆container内部</div><div class="line">[root@controller1 ~]# docker exec -it -u root CONTAINER_ID /bin/bash</div></pre></td></tr></table></figure>
<h4 id="十二、参考资料"><a href="#十二、参考资料" class="headerlink" title="十二、参考资料"></a>十二、参考资料</h4><blockquote>
<p><strong><em>Reference:</em></strong></p>
<ul>
<li>官方文档:<a href="https://docs.openstack.org/kolla-ansible/latest/user/quickstart.html" target="_blank" rel="external">https://docs.openstack.org/kolla-ansible/latest/user/quickstart.html</a></li>
<li>Kolla安装Ocata 单节点:<a href="http://www.chenshake.com/kolla-installation/" target="_blank" rel="external">http://www.chenshake.com/kolla-installation/</a></li>
<li>OpenStack实战分享:Kolla多节点部署加Ceph后端:<a href="http://www.99cloud.net/html/2017/jiuzhouyuanchuang_0317/302.html" target="_blank" rel="external">http://www.99cloud.net/html/2017/jiuzhouyuanchuang_0317/302.html</a></li>
<li>Docker私有仓库Registry的搭建验证:<a href="http://www.cnblogs.com/lienhua34/p/4922130.html" target="_blank" rel="external">http://www.cnblogs.com/lienhua34/p/4922130.html</a></li>
<li>Jeffrey Zhang的blog:<a href="http://xcodest.me/" target="_blank" rel="external">http://xcodest.me/</a></li>
<li>kolla的一点心得:<a href="http://blog.csdn.net/pengdake300/article/details/54581499" target="_blank" rel="external">http://blog.csdn.net/pengdake300/article/details/54581499</a></li>
</ul>
</blockquote>
]]></content>
<summary type="html">
<p>2014年下半年,OpenStack基金会已经意识到Docker对OpenStack可能造成的威胁,研究OpenStack和Docker如何并存迫在眉睫,在2015年的温哥华峰会上,推出了3个项目:</p>
<ul>
<li>kolla:把OpenStack放到容器里面,部署OpenStack</li>
<li>Magnum: 在OpenStack平台上面部署容器,后来改成COE(Container Orchestration Engine)</li>
<li>Solum:利用Docker来实现CI(Continuous Integration)/CD(Continuous Delivery)</li>
</ul>
</summary>
<category term="学习" scheme="https://www.hanbert.cn/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Openstack" scheme="https://www.hanbert.cn/tags/Openstack/"/>
<category term="Kolla" scheme="https://www.hanbert.cn/tags/Kolla/"/>
<category term="安装部署" scheme="https://www.hanbert.cn/tags/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/"/>
</entry>
<entry>
<title>修改Sahara源码后的部署问题</title>
<link href="https://www.hanbert.cn/2017/05/24/%E4%BF%AE%E6%94%B9Sahara%E6%BA%90%E7%A0%81%E5%90%8E%E7%9A%84%E9%83%A8%E7%BD%B2%E9%97%AE%E9%A2%98/"/>
<id>https://www.hanbert.cn/2017/05/24/修改Sahara源码后的部署问题/</id>
<published>2017-05-24T11:16:43.000Z</published>
<updated>2017-10-02T17:47:29.635Z</updated>
<content type="html"><![CDATA[<p>此处以增加名为 <code>sandbox</code> 的plugin为例,进行开发环境和生产环境两种环境部署的介绍。</p>
<a id="more"></a>
<h3 id="部署到Devstack开发环境上"><a href="#部署到Devstack开发环境上" class="headerlink" title="部署到Devstack开发环境上"></a>部署到Devstack开发环境上</h3><p>由于Devstack采用的源码安装的方式,所以我们只需要将我们自己写的源码复制到Devstack用到的源码的相应位置,替换原来的代码,然后做一些配置,重启相应的服务后既可以正常测试使用我们自己写的源码,但要注意copy过程中的源码文件的权限问题,最好能与其他的plugin保持一致。</p>
<p>需要修改以下几个地方:</p>
<p><strong>① 修改Sahara的配置文件<code>sahara.conf</code>:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># vim /etc/sahara/sahara.conf</div></pre></td></tr></table></figure></p>
<p>将<code>[DEFAULT]</code>下面<code>plugins</code>配置项后面添加<code>sandbox</code><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[DEFAULT]</div><div class="line">.......</div><div class="line">use_syslog = False</div><div class="line">use_neutron = true</div><div class="line">plugins = sandbox,hdp,cdh,mapr,spark,storm,fake</div><div class="line">debug = True</div><div class="line">verbose = True</div><div class="line">rpc_backend = rabbit</div></pre></td></tr></table></figure></p>
<p><strong>② 修改sahara源码包的根目录下的<code>setup.cfg</code>文件:</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># vim ./sahara/setup.cfg</div></pre></td></tr></table></figure>
<p>在<code>[entry_points]</code>下的<code>sahara.cluster.plugins</code>下面添加一行新增加的plugin的主类名:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">sahara.cluster.plugins =</div><div class="line"> vanilla = sahara.plugins.vanilla.plugin:VanillaProvider</div><div class="line"> ambari = sahara.plugins.ambari.plugin:AmbariPluginProvider</div><div class="line"> mapr = sahara.plugins.mapr.plugin:MapRPlugin</div><div class="line"> cdh = sahara.plugins.cdh.plugin:CDHPluginProvider</div><div class="line"> fake = sahara.plugins.fake.plugin:FakePluginProvider</div><div class="line"> spark = sahara.plugins.spark.plugin:SparkProvider</div><div class="line"> storm = sahara.plugins.storm.plugin:StormProvider</div><div class="line"> sandbox = sahara.plugins.sandbox.plugin:VanillaProvider</div></pre></td></tr></table></figure>
<p><strong>③ 修改<code>/sahara/sahara.egg-info/</code>目录下<code>entry_points.txt</code>文件:</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># vim ./sahara/sahara.egg-info/entry_points.txt</div></pre></td></tr></table></figure>
<p>在<code>[sahara.cluster.plugins]</code>下面增加一行plugin的主类名:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[sahara.cluster.plugins]</div><div class="line">ambari = sahara.plugins.ambari.plugin:AmbariPluginProvider</div><div class="line">cdh = sahara.plugins.cdh.plugin:CDHPluginProvider</div><div class="line">fake = sahara.plugins.fake.plugin:FakePluginProvider</div><div class="line">mapr = sahara.plugins.mapr.plugin:MapRPlugin</div><div class="line">spark = sahara.plugins.spark.plugin:SparkProvider</div><div class="line">storm = sahara.plugins.storm.plugin:StormProvider</div><div class="line">vanilla = sahara.plugins.vanilla.plugin:VanillaProvider</div></pre></td></tr></table></figure>
<p><strong>④ 修改<code>sahara/devstack</code>目录下面的<code>settings</code>文件:</strong></p>
<p>这一步主要是为了在Devstack重新部署的时候,能够使新生成的<code>sahara.conf</code>文件能自动包含新增的plugin的配置信息,否则会导致sahara的服务不能正常启动。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># vim ./sahara/devstack/settings</div></pre></td></tr></table></figure>
<p>在<code>SAHARA_ENABLED_PLUGINS</code>下面添加<code>sandbox</code>:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">SAHARA_ENABLED_PLUGINS=${SAHARA_ENABLED_PLUGINS:-\</div><div class="line">sandbox,vanilla,cdh,mapr,spark,storm,fake}</div></pre></td></tr></table></figure>
<p><strong>⑤ 重启<code>sahara-api</code>和<code>sahara-eng</code>两个服务:</strong></p>
<p>centos:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">systemctl restart openstack-sahara-api</div><div class="line">systemctl restart openstack-sahara-engine</div></pre></td></tr></table></figure>
<p>ubuntu:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">service sahara-api restart</div><div class="line">service sahara-engine restart</div></pre></td></tr></table></figure>
<p>至此可以正常测试使用!</p>
<h3 id="部署到生产环境上"><a href="#部署到生产环境上" class="headerlink" title="部署到生产环境上"></a>部署到生产环境上</h3><p>生产环境和开发环境相比,区别在于,你不能够直接指定源码包的位置,在生产环境下,由于采用的是直接包安装的方式,而非源码安装的方式,所以修改部分设置的时候不太一样,但好在python是一个解释型的语言,不需要事先编译好再部署。</p>
<p><strong>① 将我们自己写的plugin相关的code拷贝到<code>/usr/lib/python2.7/site-packages/sahara/plugins</code>目录下,注意文件权限的问题:</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># cp -r [SOURCE_CODE] /usr/lib/python2.7/site-packages/sahara/plugins/</div></pre></td></tr></table></figure>
<p><strong>② 修改Sahara的配置文件<code>sahara.conf</code>:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># vim /etc/sahara/sahara.conf</div></pre></td></tr></table></figure></p>
<p>将<code>[DEFAULT]</code>下面<code>plugins</code>配置项后面添加<code>sandbox</code><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[DEFAULT]</div><div class="line">.......</div><div class="line">use_syslog = False</div><div class="line">use_neutron = true</div><div class="line">plugins = sandbox,vanilla, hdp,cdh,mapr,spark,storm,fake</div><div class="line">debug = True</div><div class="line">verbose = True</div><div class="line">rpc_backend = rabbit</div></pre></td></tr></table></figure></p>
<p><strong>③ 修改<code>/usr/lib/python2.7/site-packages/sahara-XXX-py2.7.egg-info</code>目录下的<code>entry_points.txt</code>文件:</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># vim /usr/lib/python2.7/site-packages/sahara-XXX-py2.7.egg-info/entry_points.txt</div></pre></td></tr></table></figure>
<p>在<code>[sahara.cluster.plugins]</code>下面增加一行plugin的主类名:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[sahara.cluster.plugins]</div><div class="line">ambari = sahara.plugins.ambari.plugin:AmbariPluginProvider</div><div class="line">cdh = sahara.plugins.cdh.plugin:CDHPluginProvider</div><div class="line">fake = sahara.plugins.fake.plugin:FakePluginProvider</div><div class="line">mapr = sahara.plugins.mapr.plugin:MapRPlugin</div><div class="line">spark = sahara.plugins.spark.plugin:SparkProvider</div><div class="line">storm = sahara.plugins.storm.plugin:StormProvider</div><div class="line">vanilla = sahara.plugins.vanilla.plugin:VanillaProvider</div></pre></td></tr></table></figure>
<p><strong>④ 重启<code>sahara-api</code>和<code>sahara-eng</code>两个服务:</strong></p>
<p>centos:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">systemctl restart openstack-sahara-api</div><div class="line">systemctl restart openstack-sahara-engine</div></pre></td></tr></table></figure>
<p>ubuntu:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">service sahara-api restart</div><div class="line">service sahara-engine restart</div></pre></td></tr></table></figure>
<p>至此可以正常测试使用!</p>
]]></content>
<summary type="html">
<p>此处以增加名为 <code>sandbox</code> 的plugin为例,进行开发环境和生产环境两种环境部署的介绍。</p>
</summary>
<category term="学习" scheme="https://www.hanbert.cn/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Openstack" scheme="https://www.hanbert.cn/tags/Openstack/"/>
<category term="Sahara" scheme="https://www.hanbert.cn/tags/Sahara/"/>
<category term="二次开发" scheme="https://www.hanbert.cn/tags/%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>Kolla部署工具简介</title>
<link href="https://www.hanbert.cn/2017/04/10/Kolla%E9%83%A8%E7%BD%B2%E5%B7%A5%E5%85%B7%E7%AE%80%E4%BB%8B/"/>
<id>https://www.hanbert.cn/2017/04/10/Kolla部署工具简介/</id>
<published>2017-04-10T01:02:37.000Z</published>
<updated>2017-04-10T01:06:14.746Z</updated>
<content type="html"><![CDATA[<h3 id="基本介绍"><a href="#基本介绍" class="headerlink" title="基本介绍"></a>基本介绍</h3><p>Kolla项目是2014年9月份,Steven Dake提交的,这位老兄以前是HeatPTL,还是Corosync作者,牛的一塌糊涂。对于OpenStack的项目是非常熟悉,并且以前是红帽工程师,目前跳槽到思科,代表思科推出Kolla项目。</p>
<a id="more"></a>
<p>Kolla的目标,就是要做到100个节点开箱即用,所有的组件的HA都具备。简单说,Fuel装完是什么,他就是什么样子。实现的代价肯定比Fuel小很多。</p>
<p>Kolla,就是把目前OpenStack项目用到的所有组件都容器化。</p>
<p><img src="http://www.chenshake.com/wp-content/uploads/2016/06/kolla.jpg" alt="架构图"></p>
<p>除了上面之外,还包括一下内容:</p>
<ul>
<li>libvirt</li>
<li>qemu</li>
<li>OVS 和linux bridge</li>
<li>Ceph</li>
<li>HAproxy,Keeplived</li>
<li>MariaDB</li>
<li>ELK ( Heka )</li>
<li>MongoDB</li>
<li>rabbitmq</li>
</ul>
<p>Kolla 会对OpenStack下面的50多个项目进行build镜像,如果能够全部完成,那么就能够实现OpenStack的全面容器化。<br><strong>目前已经支持的组件镜像有:</strong></p>
<ul>
<li>Aodh</li>
<li>Barbican</li>
<li>Bifrost</li>
<li>Cinder</li>
<li>CloudKitty</li>
<li>Congress</li>
<li>Designate</li>
<li>Freezer</li>
<li>Glance</li>
<li>Gnocchi</li>
<li>Heat</li>
<li>Horizon</li>
<li>Ironic</li>
<li>Karbor</li>
<li>Keystone</li>
<li>Kuryr</li>
<li>Magnum</li>
<li>Manila</li>
<li>Mistral</li>
<li>Monasca</li>
<li>Murano</li>
<li>Neutron</li>
<li>Nova</li>
<li>Octavia</li>
<li>Panko</li>
<li>Rally</li>
<li>Sahara</li>
<li>Senlin</li>
<li>Solum</li>
<li>Swift</li>
<li>Tacker</li>
<li>Tempest</li>
<li>Trove</li>
<li>Vmtp</li>
<li>Watcher</li>
<li>Zaqar</li>
<li>Zun</li>
</ul>
<p><strong>支持的基础组件镜像有:</strong></p>
<ul>
<li><code>Ceph</code> implementation for Cinder, Glance and Nova</li>
<li><code>Collectd</code>, <code>InfluxDB</code>, and <code>Grafana</code> for performance monitoring.</li>
<li><code>Elasticsearch</code> and <code>Kibana</code> to search, analyze, and visualize log messages.</li>
<li><code>Etcd</code> a distributed key value store that provides a reliable way to store data across a cluster of machines.</li>
<li><code>Fluentd</code> as an open source data collector for unified logging layer.</li>
<li><code>HAProxy</code> and <code>Keepalived</code> for high availability of services and their endpoints.</li>
<li><code>Kafka</code> A distributed streaming platform.</li>
<li><code>MariaDB</code> and <code>Galera Cluster</code> for highly available MySQL databases.</li>
<li><code>Memcached</code> a distributed memory object caching system.</li>
<li><code>MongoDB</code> as a database back end for Ceilometer and Gnocchi.</li>
<li><code>Open vSwitch</code> and <code>Linuxbridge</code> back ends for Neutron.</li>
<li><code>RabbitMQ</code> as a messaging back end for communication between services.</li>
<li><code>Telegraf</code> as a plugin-driven server agent for collecting & reporting metrics.</li>
</ul>
<h3 id="Kolla的架构"><a href="#Kolla的架构" class="headerlink" title="Kolla的架构"></a>Kolla的架构</h3><p>社区目前按照功能大概分成一下三个模块:</p>
<ul>
<li>Kolla,主要是负责Docker的镜像制作</li>
<li>Koola-Ansible 负责我能够取得配置管理</li>
<li>Kolla-Kubernetes 也是负责容器的配置管理</li>
</ul>
<p>kolla的Docker镜像制作,支持Radhat的rpm包,Ubuntu和Debian的Deb包,还能支持源码的方式。理论上源码制作的镜像,是可以跑在所有的支持容器的操作系统。</p>
<h3 id="Kolla解决的问题"><a href="#Kolla解决的问题" class="headerlink" title="Kolla解决的问题"></a>Kolla解决的问题</h3><p>采用Kolla来部署OpenStack,装好系统后,你大概只需要10分钟的时间,就可以搭建完成full feature的功能OpenStack。各种社区的最佳实践,高可用,都集成在上面。而且全都是运维人员都明白的python语言。</p>
<p>容器化后的OpenStack,让人感觉真的像积木一样,你需要什么,就拿过来放上去就可以。</p>
<p>也就是说,Kolla让以前很多OpenStack的部署,安装,升级的问题,解决起来更加优雅。</p>
<p>所谓升级就是把以前的删掉,再装新的版本。如果你是采用包的安装,例如rdo,那你就慢慢熬夜搞定吧,对于容器来说,做到这点就太简单了,非常优雅。</p>
<p>对于部署,已经没有安装的过程,你只需要把相应的容器放到相应的位置,配置管理推送过去就可以。对于升级,你只需要做一个容器的替换就可以实现升级,只需要集中精力去处理数据库的问题就可以。</p>
<p>build image的过程,其实可以官方提供,大家直接使用就可以。</p>
<blockquote>
<p>但目前测试,网络环境并不了乐观,如果直接拉取官网的镜像,基本会失败。</p>
</blockquote>
<p><strong>总结:</strong></p>
<ul>
<li>平滑的升级 / 回滚 OpenStack</li>
<li>保证环境的一致性 。 解决由于安装时间不同 , 造成的包版本不一致的情况 。</li>
<li>支持多种安装源 : 源代码安装 ,CentOS binary 安装等 。 可以替代掉 devstack。</li>
</ul>
]]></content>
<summary type="html">
<h3 id="基本介绍"><a href="#基本介绍" class="headerlink" title="基本介绍"></a>基本介绍</h3><p>Kolla项目是2014年9月份,Steven Dake提交的,这位老兄以前是HeatPTL,还是Corosync作者,牛的一塌糊涂。对于OpenStack的项目是非常熟悉,并且以前是红帽工程师,目前跳槽到思科,代表思科推出Kolla项目。</p>
</summary>
<category term="学习" scheme="https://www.hanbert.cn/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Openstack" scheme="https://www.hanbert.cn/tags/Openstack/"/>
<category term="Kolla" scheme="https://www.hanbert.cn/tags/Kolla/"/>
<category term="容器化" scheme="https://www.hanbert.cn/tags/%E5%AE%B9%E5%99%A8%E5%8C%96/"/>
</entry>
<entry>
<title>Devstack部署Openstack开发环境</title>
<link href="https://www.hanbert.cn/2017/04/09/Devstack%E9%83%A8%E7%BD%B2Openstack%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
<id>https://www.hanbert.cn/2017/04/09/Devstack部署Openstack开发环境/</id>
<published>2017-04-09T12:01:19.000Z</published>
<updated>2017-10-02T17:47:28.682Z</updated>
<content type="html"><![CDATA[<p>Devstack 是面向 Openstack 开发者的快速自动化部署 Bash 脚本,提供了辅助开发和调试的源码环境,能够支持 All-In-One 和多节点部署模式,同时也支持 Plug-in 模式。Devstack 的使用可以说贯穿整个 Openstack 开发生涯,熟练的使用 Devstack 能有效提高开发效率。 </p>
<a id="more"></a>
<blockquote>
<p>正如官方所强调的:Devstack不适合生产环境!</p>
</blockquote>
<h3 id="支持的服务"><a href="#支持的服务" class="headerlink" title="支持的服务"></a>支持的服务</h3><p><strong>基础的操作系统</strong></p>
<p>OpenStack技术委员会把现在的CI策略定义为支持最新的Ubuntu发行版和最新的RHEL发行版(为了测试Python2.6)。</p>
<ul>
<li><strong>Ubuntu</strong>: current 长期支持版(LTS release)加上现在的开发版</li>
<li><strong>Fedora</strong>: 当前版本加上之前的版本</li>
<li><strong>RHEL</strong>: 当前的主要发行版本</li>
<li>其他OS平台可能继续支持,比如:<strong>Debian</strong>、<strong>OpenSUSE</strong>,但不是所有这些存在的平台都能得到支持</li>
<li>Ubuntu或是Fedora的补丁不会被支持,因为对其他的平台有副作用</li>
</ul>
<p><strong>数据库</strong></p>
<ul>
<li>MySQL</li>
<li>PostgreSQL</li>
</ul>
<p><strong>消息队列</strong></p>
<ul>
<li>Rabbit</li>
<li>Qpid</li>
</ul>
<p><strong>Web服务器</strong></p>
<ul>
<li>Apache</li>
</ul>
<p><strong>Openstack网络</strong></p>
<p>默认使用Nova Network,可以选定使用<code>Neutron</code></p>
<ul>
<li><strong>Nova Network</strong>: FlatDHCP</li>
<li><strong>Neutron</strong>: 使用<code>linuxbridge</code>或是 <code>OpenVSwitch</code>的基本配置,接近于初始的<code>FlatDHCP</code>方式。</li>
</ul>
<p><strong>Openstack服务</strong></p>
<p>DevStack中配置的默认服务有:</p>
<ul>
<li>认证(Keystone)</li>
<li>对象存储(Swift)</li>
<li>映像存储(Glance)</li>
<li>块存储(Cinder)</li>
<li>计算(Nova)</li>
<li>控制面板(Horizon)</li>
<li>编排(Heat)</li>
</ul>
<blockquote>
<p>其他没有直接包含在DevStack中的附加服务可以通过插件机制绑定在<code>stack.sh</code>里面<br>插件机制可以调用脚本来进行配置和启动相关服务</p>
</blockquote>
<p><strong>节点配置</strong></p>
<ul>
<li>单一节点</li>
<li>多节点,但不是重点支持对象,核心团队并不定期测试多节点的配置,即使测试也只包含最小配置</li>
</ul>
<h3 id="Devstack-的安装与使用"><a href="#Devstack-的安装与使用" class="headerlink" title="Devstack 的安装与使用"></a>Devstack 的安装与使用</h3><p>Devstack的安装过程比较简单,只需要从github库中git clone下来源码到本地,然后对本地做简单的配置即可。</p>
<p><strong>安装Linux</strong><br>本次使用的是Openstack官网推荐的<code>Ubuntu16.04</code>。<br>由于Devstack自动部署过程中很多地方都需要用到<code>git</code>的相关命令,所以我们先为操作系统安装<code>git</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># apt-get install git</div></pre></td></tr></table></figure></p>
<p><strong>添加<code>stack</code>用户</strong><br>Devstack必须运行在非<code>root</code>用户下,且该用户必须要<code>sudo</code>权限,本次为系统添加一个<code>stack</code>用户。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">#切换到root用户</div><div class="line">$ su</div><div class="line">#添加账户,并指定shell和home所在地</div><div class="line"># useradd -s /bin/bash/ -d /opt/stack -m stack</div></pre></td></tr></table></figure></p>
<p>为刚添加的<code>stack</code>账户添加<code>sudo</code>权限<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"># tee <<< "stack ALL=(ALL) NOPASSWD:ALL" /etc/sudoers</div><div class="line"># su - stack</div></pre></td></tr></table></figure></p>
<blockquote>
<p>在Ubuntu中<code>sudoers</code>即使<code>root</code>用户默认也没有权限修改的,所以使用<code>tee</code>命令来写入,可以避免权限问题<br>也可以直接找到<code>/etc/shudoers</code>这个文件,改变其读写权限,然后打开文件写入,当不推荐这样做 </p>
</blockquote>
<p><strong>下载Devstack</strong></p>
<p>可以直接从github上下载最新版的额Devstack源码<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ git clone https://git.openstack.org/openstack-dev/devstack</div><div class="line">$ cd devstack</div></pre></td></tr></table></figure></p>
<p>Download 下来的源码中就包含安装Openstack的脚本和相应的配置模板,理论上,现在就可以运行<code>stack.sh</code>脚本来安装Openstack。但往往为了方便我们开发使用,及保证安装的成功率,我们会在<code>local.conf</code>文件中进行一些配置,覆盖掉其默认的配置后,再进行安装。</p>
<p><strong>开始安装</strong></p>
<p>下载完Devstack,并做好配置后,就可以开始安装Openstack了,只需要运行<code>devstack/</code>目录下的<code>stack.sh</code>脚本既可以全自动进行安装,这期间会遇到一些问题,需要一点点手动解决。所以安装时间的长短因人而异。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ ./stack.sh</div></pre></td></tr></table></figure></p>
<p>由于默认Devstack是从github直接拉取源码进行安装,所以需要一个好的网络环境才可以,如果不具备,则可以考虑换一个靠谱点的<code>git</code>库,比如:<code>http://git.trystack.cn</code>,这个git库测试性能良好。如果一切顺利的话,大概20-30分钟可以完全部署完。如果遇到错误,需要手动解决ERROR后重新跑脚本,这样安装时间可能是具体情况无限制的延长。</p>
<h3 id="Devstack的配置过程"><a href="#Devstack的配置过程" class="headerlink" title="Devstack的配置过程"></a>Devstack的配置过程</h3><p>Devstack一致致力于通过最少的配置完成最多的功能。因为各个项目加入了新的特性,新的项目加入,还有不同的组合需要测试,选项的数目已经飞速地膨胀了。DevStack的传统做法是从<code>localrc</code>文件得到所有的本地化的配置和定制信息。传递给各个项目的配置变量的数目也在增加。原有的机制 (EXTRAS_OPTS之类)需要对每个文件进行编码,已经不太适应现在的环境。<br>在2013年10月引入了一个新的配置方式<code>local.conf</code>(参看<a href="https://review.openstack.org/#/c/46768/),希望能够简化配置过程,达到下列目的:" target="_blank" rel="external">https://review.openstack.org/#/c/46768/),希望能够简化配置过程,达到下列目的:</a></p>
<ul>
<li>在单一的文件中包含所有非默认的本地配置</li>
<li>与 localrc 的方式向后兼容,保证迁移过程的平滑</li>
<li>允许对任意配置文件中的设置进行更改</li>
</ul>
<blockquote>
<p>现在 Devstack 提供了两种配置安装的方式 local.conf(新版) 和 localrc(旧版),,两种方式我们都应该有所了解, 因为在不同的团队中会习惯的选择使用其中一种甚至两种方式。</p>
</blockquote>
<p><strong>local.conf</strong></p>
<p><code>local.conf</code>文件的样例路径为:<code>devstack/samples/local.conf</code></p>
<p>新的配置文件是<code>local.conf</code>,和旧的<code>localrc</code>文件在同一个目录。它是一个修正后的<code>INI</code>格式文件,引入了<code>meta-section</code>(<code>[[<phase>|<config-file-name>]]</code>)来承载额外的信息。改文件最终会被<code>stack.sh</code>脚本加载使用,所以其语法必须是符合<code>Bash</code>语法规则的,比如:等号“<code>=</code>”的两边不能存在空格。</p>
<p><code>Section</code>(也就是<code><phase></code>)有以下几种类型:”local”、”post-config”、”extra”、”post-extra”。它们规定了Devstack的安装流程和配置,在安装过程中会严格按照这个顺序进行读取和执行:</p>
<ol>
<li><strong>local</strong>:对应的Section为<code>[[local|localrc]]</code>,指定在<code>local.conf</code>被<code>stackrc</code>加载之前,先从<code>localrc</code>中提取配置项,配置实例如下:</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[[<span class="built_in">local</span>|localrc]]</div><div class="line">ADMIN_PASSWORD=nomoresecret</div><div class="line">DATABASE_PASSWORD=stackdb</div><div class="line">RABBIT_PASSWORD=stackqueue</div><div class="line">SERVICE_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div></pre></td></tr></table></figure>
<ol>
<li><strong>post-config</strong>:对应的Section为<code>[[post-config|/$Q_PLUGIN_CONF_FILE]]</code>,指定在项目服务自动配置完成后,且在服务正式启动之前,这其中的配置选项会被执行,配置实例如下:</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[[post-config|/<span class="variable">$NOVA_CONF</span>]]</div><div class="line"></div><div class="line">[DEFAULT]</div><div class="line">use_syslog = True</div><div class="line"></div><div class="line">[osapi_v3]</div><div class="line">enabled = False</div><div class="line"></div><div class="line"><span class="comment"># <span class="doctag">NOTE:</span> Q_PLUGIN_CONF_FILE 独特之处在于它的配置项如果在前面不加 `/`, 那么这个配置项就不会生效。所以为了使其生效添加 `/` 是必须的。</span></div></pre></td></tr></table></figure>
<ol>
<li><strong>extra</strong>:指定在各Openstack项目的主服务启动之后,并且在<code>extra.d</code>中的文件别执行之前,<code>extra</code>的配置项会被执行</li>
<li><strong>post-extra</strong>:指定在<code>extra.d</code>中的文件被执行之后,执行<code>post-extra</code>中的配置项。</li>
</ol>
<blockquote>
<p>从以上可以看出,这么多的Section只是指定了其中的配置项在安装过程中的那个阶段被加载,一般情况下,我们只需要关注<code>local</code>这个Section即可,其他的稍作了解一下即可。</p>
</blockquote>
<p><code>[[local|localrc]]</code>是一个非常特别的Section,我们可以将配置项全部都定义到其下,并且它还指定了是否会将Devstack根目录下的<code>localrc</code>文件的配置项提取到其下,同时也允许所有的自定义安装配置项都包含在<code>localrc</code>文件中。</p>
<blockquote>
<p>这样做只是为了将Devstack的配置方式从<code>localrc</code>平滑过渡到<code>local.conf</code>,也就是说,可以将所有的安装配置项都定义到<code>localrc</code>,而无需修改<code>local.conf</code>文件。</p>
</blockquote>
<p><strong>一个最小化安装Openstack的<code>local.conf</code>配置样例</strong>:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[[<span class="built_in">local</span>|localrc]]</div><div class="line">HOST_IP=192.168.0.2 </div><div class="line">ADMIN_PASSWORD=<YOUR_PASSWORD></div><div class="line">DATABASE_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">RABBIT_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">SERVICE_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line"><span class="comment">#FIXED_RANGE=172.31.1.0/24</span></div><div class="line"><span class="comment">#FLOATING_RANGE=192.168.20.0/25</span></div></pre></td></tr></table></figure>
<p>在上面的配置中,主要做了两件事情,第一、在<code>HOST_IP</code>字段指定本机的IP,这个是为了方面后面建立Endpoint,即所有服务的API用到的IP。理论上,Devstack可以自动检测本机IP,但是这个功能不能特别完善,有时候会出错,所有建议手动指定;第二、指定了各项需要服务的密码,<code><YOUR_PASSWORD></code>字段换成你自己想用的密码即可。<br><code>FIXED_RANGE</code>和<code>FLOATING_RANGE</code>两个字段可以用来指定内网和公网IP地址的范围,此处被注释掉了,使用其默认的网络配置。</p>
<h3 id="Devstack的部署流程及需要注意的问题"><a href="#Devstack的部署流程及需要注意的问题" class="headerlink" title="Devstack的部署流程及需要注意的问题"></a>Devstack的部署流程及需要注意的问题</h3><p>Devstack的自动化部署流程大概包含以下几个主要步骤:</p>
<ul>
<li>加载配置文件<code>local.conf</code>和<code>localrc</code>(如果用到了的话)</li>
<li>安装依赖包,此时是从系统的软件库中拉取的依赖包,包括安装<code>pip</code>的过程</li>
<li>安装消息队列和数据库</li>
<li>安装Openstack Clients</li>
<li>安装并配置Openstack的各项服务,此时为从github库中直接拉取源码</li>
<li>下载和上传镜像文件,从镜像的提供方官网下载的镜像</li>
<li>显示登录信息,出现这个信息说明部署成功了</li>
</ul>
<p><img src="http://img.blog.csdn.net/20170114134811369?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSm1pbGs=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="@自动化部署的流程"></p>
<p>其中下载依赖包,由于是从系统的软件库中直接边下载变安装的,所以建议提前对操作系统进行换源,以防以为网络问题导致安装失败。在<code>Centos7</code>和<code>Ubuntu16.04</code>两种操作系统上,经过测试阿里云源表现还是不错的:</p>
<ul>
<li><strong>Centos7系统更换阿里云源</strong>:</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># cd /etc/yum.repos.d</span></div><div class="line"><span class="comment"># cp CentOS-Base.repo CentOS-Base.repo.bak //备份原来的源</span></div><div class="line"><span class="comment"># vim CentOS-Base.repo //打开源的文件,删除原有的源,写入新的源</span></div></pre></td></tr></table></figure>
<p>清空原本<code>CentOS-Base.repo</code>的内容,写入如下的内容:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># CentOS-Base.repo</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># The mirror system uses the connecting IP address of the client and the</span></div><div class="line"><span class="comment"># update status of each mirror to pick mirrors that are updated to and</span></div><div class="line"><span class="comment"># geographically close to the client. You should use this for CentOS updates</span></div><div class="line"><span class="comment"># unless you are manually picking other mirrors.</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># If the mirrorlist= does not work for you, as a fall back you can try the </span></div><div class="line"><span class="comment"># remarked out baseurl= line instead.</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment">#</span></div><div class="line"></div><div class="line">[base]</div><div class="line">name=CentOS-<span class="variable">$releasever</span> - Base - mirrors.aliyun.com</div><div class="line">failovermethod=priority</div><div class="line">baseurl=http://mirrors.aliyun.com/centos/<span class="variable">$releasever</span>/os/<span class="variable">$basearch</span>/</div><div class="line"> http://mirrors.aliyuncs.com/centos/<span class="variable">$releasever</span>/os/<span class="variable">$basearch</span>/</div><div class="line"><span class="comment">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os</span></div><div class="line">gpgcheck=1</div><div class="line">gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7</div><div class="line"></div><div class="line"><span class="comment">#released updates </span></div><div class="line">[updates]</div><div class="line">name=CentOS-<span class="variable">$releasever</span> - Updates - mirrors.aliyun.com</div><div class="line">failovermethod=priority</div><div class="line">baseurl=http://mirrors.aliyun.com/centos/<span class="variable">$releasever</span>/updates/<span class="variable">$basearch</span>/</div><div class="line"> http://mirrors.aliyuncs.com/centos/<span class="variable">$releasever</span>/updates/<span class="variable">$basearch</span>/</div><div class="line"><span class="comment">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates</span></div><div class="line">gpgcheck=1</div><div class="line">gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7</div><div class="line">[updates]</div><div class="line">name=CentOS-<span class="variable">$releasever</span> - Updates - mirrors.aliyun.com</div><div class="line">failovermethod=priority</div><div class="line">baseurl=http://mirrors.aliyun.com/centos/<span class="variable">$releasever</span>/updates/<span class="variable">$basearch</span>/</div><div class="line"> http://mirrors.aliyuncs.com/centos/<span class="variable">$releasever</span>/updates/<span class="variable">$basearch</span>/</div><div class="line"><span class="comment">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates</span></div><div class="line">gpgcheck=1</div><div class="line">gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7</div><div class="line"></div><div class="line"><span class="comment">#additional packages that may be useful</span></div><div class="line">[extras]</div><div class="line">name=CentOS-<span class="variable">$releasever</span> - Extras - mirrors.aliyun.com</div><div class="line">failovermethod=priority</div><div class="line">baseurl=http://mirrors.aliyun.com/centos/<span class="variable">$releasever</span>/extras/<span class="variable">$basearch</span>/</div><div class="line"> http://mirrors.aliyuncs.com/centos/<span class="variable">$releasever</span>/extras/<span class="variable">$basearch</span>/</div><div class="line"><span class="comment">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras</span></div><div class="line">gpgcheck=1</div><div class="line">gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7</div><div class="line"></div><div class="line"><span class="comment">#additional packages that extend functionality of existing packages</span></div><div class="line">[centosplus]</div><div class="line">name=CentOS-<span class="variable">$releasever</span> - Plus - mirrors.aliyun.com</div><div class="line">failovermethod=priority</div><div class="line">baseurl=http://mirrors.aliyun.com/centos/<span class="variable">$releasever</span>/centosplus/<span class="variable">$basearch</span>/</div><div class="line"> http://mirrors.aliyuncs.com/centos/<span class="variable">$releasever</span>/centosplus/<span class="variable">$basearch</span>/</div><div class="line"><span class="comment">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus</span></div><div class="line">gpgcheck=1</div><div class="line">enabled=0</div><div class="line">gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7</div><div class="line"></div><div class="line"><span class="comment">#contrib - packages by Centos Users</span></div><div class="line">[contrib]</div><div class="line">name=CentOS-<span class="variable">$releasever</span> - Contrib - mirrors.aliyun.com</div><div class="line">failovermethod=priority</div><div class="line">baseurl=http://mirrors.aliyun.com/centos/<span class="variable">$releasever</span>/contrib/<span class="variable">$basearch</span>/</div><div class="line"> http://mirrors.aliyuncs.com/centos/<span class="variable">$releasever</span>/contrib/<span class="variable">$basearch</span>/</div><div class="line"><span class="comment">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib</span></div><div class="line">gpgcheck=1</div><div class="line">enabled=0</div><div class="line">gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7</div></pre></td></tr></table></figure>
<p>然后执行以下命令,确定阿里云源已经正常工作:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># yum update //升级本系统的软件</div></pre></td></tr></table></figure>
<ul>
<li><strong><code>Ubuntu16.04</code>更换阿里云源</strong>:</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># cd /etc/apt/</span></div><div class="line"><span class="comment"># cp sources.list sources.list.bak //备份原有的源</span></div><div class="line"><span class="comment"># vim sources.list //打开源文件,清空原有的源,写入新的源</span></div></pre></td></tr></table></figure>
<p>清空<code>sources.list</code>中的原有内容,写入如下的内容:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted</span></div><div class="line">deb-src http://archive.ubuntu.com/ubuntu xenial main restricted <span class="comment">#Added by software-properties</span></div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted</div><div class="line">deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe <span class="comment">#Added by software-properties</span></div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted</div><div class="line">deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe <span class="comment">#Added by software-properties</span></div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial universe</div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe</div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse</div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse</div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse</div><div class="line">deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse <span class="comment">#Added by software-properties</span></div><div class="line">deb http://archive.canonical.com/ubuntu xenial partner</div><div class="line">deb-src http://archive.canonical.com/ubuntu xenial partner</div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted</div><div class="line">deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe <span class="comment">#Added by software-properties</span></div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe</div><div class="line">deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse</div></pre></td></tr></table></figure>
<p>然后执行以下命令,确定阿里云源已经换源成功:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># apt-get update</span></div><div class="line"><span class="comment"># apt-get upgrade //升级本系统的软件</span></div></pre></td></tr></table></figure>
<blockquote>
<p>不同版本的操作系统,对应的源的地址不同,此处只写出了<code>centos7</code>和<code>ubuntu16.04</code>的操作系统对应的阿里云源,其他版本系统的请自行网上搜索。</p>
</blockquote>
<p><strong>安装pip过程中可能遇到的问题</strong></p>
<p>在安装<code>pip</code>的过程中,Devstack会从网上先下载一个<code>get-pip.py</code>的文件到<code>devstack/files/</code>文件夹下面,然后执行<code>python get-pip.py</code>运行这段程序来安装<code>pip</code>。所以当这个过程因为网络问题,导致<code>get-pip.py</code>不能够正常下载,导致安装失败的时候,我们可以手动下载<code>get-pip.py</code>文件,然后将其放入<code>devstack/files/</code>文件夹下面。</p>
<blockquote>
<p>除了上面的方法之外,我们也可以手动安装<code>pip</code><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">> $ apt-get install python-pip //安装pip</div><div class="line">> $ pip install --upgrade pip //升级到最新版本</div><div class="line">></div></pre></td></tr></table></figure></p>
</blockquote>
<p><strong>pip换源的问题</strong></p>
<p>由于Devstack部署过程中会用<code>pip</code>安装许多的软件包,而默认的<code>pip</code>的源的地址为<code>https://pypi.python.org/simple</code>这个地址在国内网络环境下访问不是很顺畅,时常出现下载包失败的情况,所以建议更换为国内源,此处换成了豆瓣源:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ sodu mkdir /root/.pip/ //新建一个.pip文件夹</div><div class="line">$ vim /root/.pip/pip.conf //在新建的文件夹下面新建pip.conf文件</div></pre></td></tr></table></figure>
<p>然后在<code>pip.conf</code>文件中写入以下内容:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[global]</div><div class="line">index-url = https://pypi.douban.com/simple</div></pre></td></tr></table></figure>
<p>此时即可换源成功。</p>
<p><strong>pip安装软件包的问题</strong></p>
<p>如果换源后,<code>pip</code>中的某些软件包,仍然会从官方源下载,并且导致下载失败,可以手动停掉当然运行<code>stack.sh</code>脚本,把出错的安装命令复制一遍,手动指定安装源来进行安装,一般能够成功。命令格式为:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ pip install <YOUR_PACKAGES> -i https://pypi.doubanio.com/simple</div></pre></td></tr></table></figure>
<p>这样该软件包就可以从我们指定的源地址进行下载安装。</p>
<blockquote>
<p>再部署过程中很多软件包<code>pip</code>自动安装失败,导致部署过程出错的问题,都可以通过手动指定软件源,手动安装,然后重新跑<code>stack.sh</code>来解决。</p>
</blockquote>
<p>另外,如果安装过程中出现如下错误:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">2016-04-10 08:40:55.596 | [ERROR] /home/devstack/<span class="built_in">functions</span>-common:1066 Failed to update apt repos, we’re dead now</div><div class="line">2016-04-10 08:40:56.600 | Error on <span class="built_in">exit</span></div><div class="line">2016-04-10 08:40:56.601 | ./stack.sh: line 488: generate-subunit: <span class="built_in">command</span> not found</div></pre></td></tr></table></figure>
<p>可以通过运行如下三条命令来解决:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">sudo apt-get install python-pip</div><div class="line">sudo pip install --upgrade pip</div><div class="line">sudo pip install -U os-testr -i https://pypi.douban.com/simple</div></pre></td></tr></table></figure>
<p><br><br><strong>长时间卡在运行<code>setup.py</code>程序</strong></p>
<p>如果运行过程中,出现长时间卡在这一步的情况,基本可以手动<code>Ctrl-C</code>停掉部署过程,然后向上翻输出的部署过程,找到如下内容:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sudo -H http_proxy= https_proxy= no_proxy= PIP_FIND_LINKS= SETUPTOOLS_SYS_PATH_TECHNIQUE=rewrite /usr/<span class="built_in">local</span>/bin/pip2.7 install -c /opt/stack/requirements/upper-constraints.txt -e /opt/stack/keystone</div></pre></td></tr></table></figure>
<p>复制这段文字,然后手动运行这段命令,运行过程中如果出现安装源的问题,就用上面的<code>-i https://pypi.douban.com/simple</code>来制定安装源,如果能正常下载安装,就让它继续安装就可以,另外,此过程中如果出现某一个软件包安装时间过程也可以按一下<code>Crtl-C</code>,会自动重新安装这个软件包。</p>
<p><strong>Python虚拟环境搭建与使用</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$ pip install virtualenv <span class="comment">#安装virtualenv工具</span></div><div class="line">$ virtualenv venvName <span class="comment"># 创建名为venvName的虚拟环境</span></div><div class="line">$ <span class="built_in">source</span> venvName/bin/activate <span class="comment"># 进入虚拟环境</span></div></pre></td></tr></table></figure>
<p>在部署过程中,Devstack会搭建好几个虚拟环境,这些虚拟环境都可以用上面的第三条命令来手动进入。</p>
<h3 id="Devstack-多节点部署"><a href="#Devstack-多节点部署" class="headerlink" title="Devstack 多节点部署"></a>Devstack 多节点部署</h3><p>Devstack大部分时候只是用来搭建一个<code>all in one</code>的开发测试环境,并不能够用于生产环境,但是作为一个部署工具,其本身也能够承担起多节点部署的任务。Devstack的多节点部署的本质就是:在不同的节点上,使用不同的<code>local.conf</code>配置文件来运行Devstack的部署脚本。但需要注意的是,Openstack的多节点部署不仅仅意味着不同的项目部署到不同的节点上,我们应该理解为,将Openstack不同的服务部署到不同的节点上,不同节点承担不同的功能。</p>
<p>一般来说,很少有人用Devstack来进行多节点的部署,这里可以只做了解即可。</p>
<p><code>Controller</code>节点的配置文件内容:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Misc</span></div><div class="line">ADMIN_PASSWORD=<YOUR_PASSWORD></div><div class="line">DATABASE_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">RABBIT_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">SERVICE_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">SERVICE_TOKEN=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line"></div><div class="line"><span class="comment"># Target Path</span></div><div class="line">DEST=/opt/stack.mitaka</div><div class="line"></div><div class="line"><span class="comment"># Enable Logging</span></div><div class="line">LOGFILE=<span class="variable">$DEST</span>/logs/stack.sh.log</div><div class="line">VERBOSE=True</div><div class="line">LOG_COLOR=True</div><div class="line">SCREEN_LOGDIR=<span class="variable">$DEST</span>/logs</div><div class="line"></div><div class="line"><span class="comment"># Current host ip</span></div><div class="line">HOST_IP=192.168.56.102</div><div class="line">FLAT_INTERFACE=eth1</div><div class="line"></div><div class="line"><span class="comment"># 这个地方选择 True, 开启多节点部署</span></div><div class="line">MULTI_HOST=True</div><div class="line"></div><div class="line"><span class="comment"># 将应该部署到这个节点上的都 enable,部署到其他节点的都 disable</span></div><div class="line"><span class="comment"># Enable/Disable Nova/Cinder ControllerNode service</span></div><div class="line">enable_service n-novnc n-cauth</div><div class="line">disable_service n-cpu n-net n-api-meta c-vol</div></pre></td></tr></table></figure>
<p><code>computer</code>节点的配置文件内容:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Misc</span></div><div class="line">ADMIN_PASSWORD=<YOUR_PASSWORD></div><div class="line">DATABASE_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">RABBIT_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">SERVICE_PASSWORD=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line">SERVICE_TOKEN=<span class="variable">$ADMIN_PASSWORD</span></div><div class="line"></div><div class="line"><span class="comment"># Target Path</span></div><div class="line">DEST=/opt/stack.mitaka</div><div class="line"></div><div class="line"><span class="comment"># Enable Logging</span></div><div class="line">LOGFILE=<span class="variable">$DEST</span>/logs/stack.sh.log</div><div class="line">VERBOSE=True</div><div class="line">LOG_COLOR=True</div><div class="line">SCREEN_LOGDIR=<span class="variable">$DEST</span>/logs</div><div class="line"></div><div class="line"><span class="comment"># Current host ip</span></div><div class="line">HOST_IP=192.168.56.103</div><div class="line">FLAT_INTERFACE=eth1</div><div class="line"></div><div class="line"><span class="comment"># Enable Nova/Cinder ComputeNode service</span></div><div class="line">enable_service n-novnc n-cauth</div><div class="line">ENABLED_SERVICES=n-cpu,n-net,n-api-meta,c-vol</div><div class="line"></div><div class="line"><span class="comment"># Needed by cinder-volume service</span></div><div class="line">DATABASE_TYPE=mysql</div><div class="line"></div><div class="line"><span class="comment"># ControllerNode ipaddress</span></div><div class="line">SERVICE_HOST=192.168.56.102</div><div class="line">MYSQL_HOST=<span class="variable">$SERVICE_HOST</span></div><div class="line">RABBIT_HOST=<span class="variable">$SERVICE_HOST</span></div><div class="line">GLANCE_HOSTPORT=<span class="variable">$SERVICE_HOST</span>:9292</div><div class="line">NOVA_VNC_ENABLED=True</div><div class="line">NOVNCPROXY_URL=<span class="string">"http://<span class="variable">$SERVICE_HOST</span>:6080/vnc_auto.html"</span></div><div class="line">VNCSERVER_LISTEN=<span class="variable">$HOST_IP</span></div><div class="line">VNCSERVER_PROXYCLIENT_ADDRESS=<span class="variable">$VNCSERVER_LISTEN</span></div><div class="line"></div><div class="line">```bash</div><div class="line"></div><div class="line"><span class="comment">### 附:本次部署过程中用到的`local.conf`文件</span></div><div class="line"></div><div class="line">本次部署过程中,我们开启了`Sahara`服务,`ceilometer`服务,`aodh`服务和`heat`服务,这几项服务Devstack部署过程中默认是不安装的,需要手动开启,另外还有一些其他的组件也可以在部署过程中开启。具体的方法,可以在Openstack官网相应组件的介绍的`xxx and devstack`页面下找到。</div><div class="line"></div><div class="line">`local.conf`文件内容:</div><div class="line"></div><div class="line">```bash</div><div class="line">[[<span class="built_in">local</span>|localrc]]</div><div class="line"><span class="comment">############################################################</span></div><div class="line"><span class="comment"># Customize the following HOST_IP based on your installation</span></div><div class="line"><span class="comment">############################################################</span></div><div class="line">HOST_IP=10.10.87.5</div><div class="line"><span class="comment">#NEUTRON_CREATE_INITIAL_NETWORKS=False</span></div><div class="line">GIT_BASE=http://git.trystack.cn</div><div class="line">NOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.git</div><div class="line">SPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.git</div><div class="line">SERVICE_PASSWORD=123</div><div class="line">ADMIN_PASSWORD=123</div><div class="line">SERVICE_TOKEN=123</div><div class="line">IP_VERSION=4</div><div class="line">DATABASE_PASSWORD=123</div><div class="line">RABBIT_PASSWORD=123</div><div class="line"></div><div class="line"><span class="comment">############################################################</span></div><div class="line"><span class="comment"># Customize the following section based on your installation</span></div><div class="line"><span class="comment">############################################################</span></div><div class="line"></div><div class="line"><span class="comment"># Pip</span></div><div class="line"><span class="comment">#PIP_USE_MIRRORS=False</span></div><div class="line"><span class="comment">#USE_GET_PIP=1</span></div><div class="line"></div><div class="line"><span class="comment">#OFFLINE=False</span></div><div class="line"><span class="comment">#RECLONE=True</span></div><div class="line"><span class="comment">#ENABLE_IDENTITY_V2=False</span></div><div class="line"></div><div class="line"><span class="comment"># Logging</span></div><div class="line">LOGFILE=<span class="variable">$DEST</span>/logs/stack.sh.log</div><div class="line">SCREEN_LOGDIR=<span class="variable">$DEST</span>/logs/screen</div><div class="line">VERBOSE=True</div><div class="line">ENABLE_DEBUG_LOG_LEVEL=True</div><div class="line">ENABLE_VERBOSE_LOG_LEVEL=True</div><div class="line"></div><div class="line"><span class="comment"># Neutron ML2 with OpenVSwitch</span></div><div class="line"></div><div class="line"><span class="comment">#Q_PLUGIN=ml2</span></div><div class="line"><span class="comment">#Q_AGENT=openvswitch</span></div><div class="line"></div><div class="line"><span class="comment">#Q_DVR_MODE=dvr_snat</span></div><div class="line"></div><div class="line"><span class="comment">#enable_plugin gbp http://git.trystack.cn/openstack/group-based-policy master</span></div><div class="line"><span class="comment">#enable_service neutron</span></div><div class="line"><span class="comment">#enable_service q-svc</span></div><div class="line"><span class="comment">#enable_service q-agt</span></div><div class="line"><span class="comment">#enable_service q-meta</span></div><div class="line"><span class="comment">#enable_service q-dhcp</span></div><div class="line"><span class="comment">#enable_service q-l3</span></div><div class="line"><span class="comment">#disable_service n-net</span></div><div class="line"><span class="comment">#disable_service c-api cinder c-bak c-vol c-sch</span></div><div class="line"><span class="comment">#disable_service tempest</span></div><div class="line"><span class="comment">#disable_service heat h-api h-eng</span></div><div class="line"></div><div class="line"><span class="comment"># Swift</span></div><div class="line"><span class="comment"># -----</span></div><div class="line"></div><div class="line"><span class="comment"># Swift is now used as the back-end for the S3-like object store. Setting the</span></div><div class="line"><span class="comment"># hash value is required and you will be prompted for it if Swift is enabled</span></div><div class="line"><span class="comment"># so just set it to something already:</span></div><div class="line">SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5</div><div class="line"></div><div class="line"><span class="comment"># For development purposes the default of 3 replicas is usually not required.</span></div><div class="line"><span class="comment"># Set this to 1 to save some resources:</span></div><div class="line">SWIFT_REPLICAS=1</div><div class="line"></div><div class="line"><span class="comment"># The data for Swift is stored by default in (``$DEST/data/swift``),</span></div><div class="line"><span class="comment"># or (``$DATA_DIR/swift``) if ``DATA_DIR`` has been set, and can be</span></div><div class="line"><span class="comment"># moved by setting ``SWIFT_DATA_DIR``. The directory will be created</span></div><div class="line"><span class="comment"># if it does not exist.</span></div><div class="line">SWIFT_DATA_DIR=<span class="variable">$DEST</span>/data</div><div class="line"></div><div class="line"><span class="comment"># Enable sahara</span></div><div class="line">enable_plugin sahara http://git.trystack.cn/openstack/sahara</div><div class="line"></div><div class="line"><span class="comment"># Enable sahara-dashboard</span></div><div class="line">enable_plugin sahara-dashboard http://git.trystack.cn/openstack/sahara-dashboard</div><div class="line"></div><div class="line"><span class="comment">#Enable heat services</span></div><div class="line">enable_service h-eng h-api h-api-cfn h-api-cw</div><div class="line"></div><div class="line"><span class="comment">#Enable heat plugin</span></div><div class="line">enable_plugin heat http://git.trystack.cn/openstack/heat</div><div class="line"></div><div class="line">IMAGE_URL_SITE=<span class="string">"http://download.fedoraproject.org"</span></div><div class="line">IMAGE_URL_PATH=<span class="string">"/pub/fedora/linux/releases/25/CloudImages/x86_64/images/"</span></div><div class="line">IMAGE_URL_FILE=<span class="string">"Fedora-Cloud-Base-25-1.3.x86_64.qcow2"</span></div><div class="line">IMAGE_URLS+=<span class="string">","</span><span class="variable">$IMAGE_URL_SITE</span><span class="variable">$IMAGE_URL_PATH</span><span class="variable">$IMAGE_URL_FILE</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">#Enable ceilometer and aodh service</span></div><div class="line">CEILOMETER_BACKEND=mongodb</div><div class="line">enable_plugin ceilometer http://git.trystack.cn/openstack/ceilometer</div><div class="line">enable_plugin aodh http://git.trystack.cn/openstack/aodh</div><div class="line"></div><div class="line"><span class="comment">#Enable OSprofiler service</span></div><div class="line">CEILOMETER_NOTIFICATION_TOPICS=notifications,profiler</div></pre></td></tr></table></figure>
<h3 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><ul>
<li><a href="https://docs.openstack.org/developer/devstack/" target="_blank" rel="external">Devstack官网</a></li>
<li><a href="https://docs.openstack.org/developer/devstack/configuration.html" target="_blank" rel="external">Devstack配置文件详解</a></li>
<li><a href="http://lib.csdn.net/article/openstack/58949" target="_blank" rel="external">Openstack 实现技术分解 (1) 开发环境 — Devstack 部署案例详解</a></li>
<li><a href="http://blog.csdn.net/xjtuse_mal/article/details/7669371" target="_blank" rel="external"> Openstack 开发人员安装脚本解读</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_7643a1bf0102vhga.html" target="_blank" rel="external">DevStack剖析 (二)DevStack配置过程简述</a></li>
<li><a href="http://www.chenshake.com/openstack-deployment-tool-summary/" target="_blank" rel="external">Openstack部署工具总结——陈沙克日志</a></li>
<li><a href="http://www.chenshake.com/devstack-installation-and-testing/" target="_blank" rel="external">devstack安装和测试——陈沙克日志</a></li>
<li>国内的Openstack的git库: <a href="http://git.trystack.cn/cgit" target="_blank" rel="external">http://git.trystack.cn/cgit</a></li>
</ul>
<blockquote>
<ul>
<li>以上只是个人使用Devstack的一个学习过程的总结,其中难免有疏漏或者不当的地方,敬请指出!</li>
<li>文中部分内容来源于网络,在此对于原作者表示感谢!</li>
</ul>
</blockquote>
]]></content>
<summary type="html">
<p>Devstack 是面向 Openstack 开发者的快速自动化部署 Bash 脚本,提供了辅助开发和调试的源码环境,能够支持 All-In-One 和多节点部署模式,同时也支持 Plug-in 模式。Devstack 的使用可以说贯穿整个 Openstack 开发生涯,熟练的使用 Devstack 能有效提高开发效率。 </p>
</summary>
<category term="学习" scheme="https://www.hanbert.cn/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Devstack" scheme="https://www.hanbert.cn/tags/Devstack/"/>
<category term="Openstack" scheme="https://www.hanbert.cn/tags/Openstack/"/>
<category term="开发环境" scheme="https://www.hanbert.cn/tags/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
</entry>
<entry>
<title>数据库和数据仓库的区别</title>
<link href="https://www.hanbert.cn/2016/12/10/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93%E7%9A%84%E5%8C%BA%E5%88%AB/"/>
<id>https://www.hanbert.cn/2016/12/10/数据库和数据仓库的区别/</id>
<published>2016-12-10T01:08:40.000Z</published>
<updated>2017-04-10T01:47:41.334Z</updated>
<content type="html"><![CDATA[<p>首先,定义三个概念:数据库软件、数据库、数据仓库。</p>
<a id="more"></a>
<h3 id="一、数据库软件"><a href="#一、数据库软件" class="headerlink" title="一、数据库软件"></a>一、数据库软件</h3><p>数据库软件:是一种软件,可以看得见,可以操作。用来实现数据库逻辑功能。属于物理层。</p>
<h3 id="二、数据库"><a href="#二、数据库" class="headerlink" title="二、数据库"></a>二、数据库</h3><p>数据库:是一种逻辑概念,用来存放数据的仓库,主要是为了处理在线数据,通过数据库软件来实现。<br>数据库由很多表组成,表是二维的,一张表里可以有很多字段。字段一字排开,对应的数据就一行一行写入表中。数据库的美,在于能够用二维表现多维关系。<br>目前市面上流行的数据库都是二维数据库。如:Oracle、DB2、MySQL、Sybase、MS SQL Server等。</p>
<h4 id="三、数据仓库"><a href="#三、数据仓库" class="headerlink" title="三、数据仓库"></a>三、数据仓库</h4><p>数据仓库:主要是为了处理历史数据。从逻辑上理解,数据库和数据仓库没有区别,都是通过数据库软件实现的存放数据的地方,只不过从数据量来说,数据仓库要比数据库更庞大得多。数据仓库主要用于数据挖掘和数据分析。</p>
<h4 id="四、数据库与数据仓库的区别"><a href="#四、数据库与数据仓库的区别" class="headerlink" title="四、数据库与数据仓库的区别"></a>四、数据库与数据仓库的区别</h4><p>在IT的架构体系中,数据库是必须存在的。必须要有地方存放数据。比如现在的网购,淘宝,京东等等。物品的存货数量,货品的价格,用户的账户余额之类的。这些数据都是存放在后台数据库中。</p>
<p>或者最简单理解,我们现在微博,QQ等账户的用户名和密码。在后台数据库必然有一张user表,字段起码有两个,即用户名和密码,然后我们的数据就一行一行的存在表上面。当我们登录的时候,我们填写了用户名和密码,这些数据就会被传回到后台去,去跟表上面的数据匹配,匹配成功了,你就能登录了。匹配不成功就会报错说密码错误或者没有此用户名等。这个就是数据库,数据库在生产环境就是用来干活的。凡是跟业务应用挂钩的,我们都使用数据库。</p>
<p>而数据仓库则是BI下的其中一种技术。由于数据库是跟业务应用挂钩的,所以一个数据库不可能装下一家公司的所有数据。数据库的表设计往往是针对某一个应用进行设计的。比如刚才那个登录的功能,这张user表上就只有这两个字段,没有别的字段了。</p>
<p>但是这张表符合应用,没有问题。但是这张表不符合分析。比如我想知道在哪个时间段,用户登录的量最多?哪个用户一年购物最多?诸如此类的指标。那就要重新设计数据库的表结构了。对于数据分析和数据挖掘,我们引入数据仓库概念。数据仓库的表结构是依照分析需求,分析维度,分析指标进行设计的。<br>数据仓库的数据来源于那些后台持续不停运作的数据库表。数据的搬运就牵涉到另一个技术叫ETL。这个过程就是数据从一个数据库到了数据仓库。</p>
<p><strong>举个例子:</strong></p>
<p>一家公司有5个分公司,月末要进行财务统计。那每家分公司都有自己的数据库可对自己分公司进行数据统计,可是,这5家分公司各自数据库的表结构设计都不同。可以理解为数据库中的表的数量不同,表中的字段也不同。如果要统计整个公司,那势必要制定统一标准。那就用到数据仓库,数据仓库作为一个新的汇总数据库,定义表的数量和字段内容。那各家分公司就要根据总公司的标准将自己数据库中的数据向总公司的字段安排靠拢。当然这个过程就交给ETL中的T来完成,transform转换。E是extract,L是load。抽取,导入。那这样,数据就被运送到数据仓库中了。统计学告诉我们,样本要足够多,得出的结论才能更准确,更具普遍性。这也就是要将各地的数据库数据汇总到一个数据仓库之中的原因。</p>
<h4 id="五、总结"><a href="#五、总结" class="headerlink" title="五、总结"></a>五、总结</h4><p>数据仓库所用的数据库软件,听的比较多的是Teradata。用下来感觉Teradata也是很强悍的。数据仓库对于数据软件的要求是非常高的,对硬件要求也高,所以能够用得起数据仓库的公司都是有钱的主。Teradata是软件与硬件绑定的。也就是说TD公司会给你送来一个大机柜,里面是一台计算机服务器和存储设备。服务器中已经安装好数据库软件了。数据挖掘,数据统计映射到数据库软件这里的操作,就是排序和分组。对于海量数据库来说,排序是很可怕的事情。数据仓库每天将承受住大量的外来数据往库里插入,往数据库里插数据,也是很慢的。所以数据仓库的技术在于调优,架构不解决根本性问题。而普通生产数据,可以通过架构来调整,相对来说更注重HA,一般做数据库集群。</p>
]]></content>
<summary type="html">
<p>首先,定义三个概念:数据库软件、数据库、数据仓库。</p>
</summary>
<category term="学习" scheme="https://www.hanbert.cn/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="数据库" scheme="https://www.hanbert.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
<category term="数据仓库" scheme="https://www.hanbert.cn/tags/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/"/>
<category term="概念" scheme="https://www.hanbert.cn/tags/%E6%A6%82%E5%BF%B5/"/>
</entry>
<entry>
<title>HBase 高可用(HA)集群部署</title>
<link href="https://www.hanbert.cn/2016/10/11/HBase-%E9%AB%98%E5%8F%AF%E7%94%A8%EF%BC%88HA%EF%BC%89%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2/"/>
<id>https://www.hanbert.cn/2016/10/11/HBase-高可用(HA)集群部署/</id>
<published>2016-10-11T01:12:33.000Z</published>
<updated>2017-04-10T01:45:28.341Z</updated>
<content type="html"><![CDATA[<p>本文主要介绍,在高可用(HA)Hadoop集群基础上搭建高可用(HA)的HBase集群。</p>
<a id="more"></a>
<h3 id="一、HBase-是什么"><a href="#一、HBase-是什么" class="headerlink" title="一、HBase 是什么"></a>一、HBase 是什么</h3><p>HBase是一个分布式的、面向列的开源数据库,就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。它是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。</p>
<p><strong>HBase有如下使用场景:</strong></p>
<ul>
<li>大数据量 (100s TB级数据) 且有快速随机访问的需求。</li>
<li>例如淘宝的交易历史记录。数据量巨大无容置疑,面向普通用户的请求必然要即时响应。</li>
<li>容量的优雅扩展。</li>
<li>大数据的驱使,动态扩展系统容量的必须的。例如:webPage DB。</li>
<li>业务场景简单,不需要关系数据库中很多特性(例如交叉列、交叉表,事务,连接等等)。</li>
<li>优化方面:合理设计rowkey。因为hbase的查询用rowkey是最高效的,也几乎的唯一生产环境可行的方式。所以把你的查询请求转换为查询rowkey的请求吧。</li>
</ul>
<h3 id="二、HBase-该可用集群架构"><a href="#二、HBase-该可用集群架构" class="headerlink" title="二、HBase 该可用集群架构"></a>二、HBase 该可用集群架构</h3><p>由于我们是在已有的Hadoop可用集群基础上来搭建的,所以我们将<code>HMaster</code>分别部署在hadoop集群的<code>master1</code>和<code>master2</code>节点上,这样就能保证HBase的高可用性,放置单节点问题。将<code>RegionServer</code>部署在三个<code>slaver</code>节点上,分别是:<code>slaver1</code>、<code>slaver2</code>、<code>slaver3</code>。并且使用<code>zookeeper</code>做故障自动切换管理。</p>
<p><img src="http://img0.tuicool.com/FNJNvmm.png!web" alt="architecture"></p>
<h3 id="二、HBase-部署"><a href="#二、HBase-部署" class="headerlink" title="二、HBase 部署"></a>二、HBase 部署</h3><p>首先从官网下载:hbase-1.2.3-bin.tar.gz,下载链接为:<a href="http://apache.osuosl.org/hbase/stable/" target="_blank" rel="external">Click Me</a> 。然后上传到<code>master1</code>这个节点上。</p>
<h4 id="§-基础准备"><a href="#§-基础准备" class="headerlink" title="§ 基础准备"></a>§ 基础准备</h4><p>1、解压并重命名为<code>hbase</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"># tar -axvf hbase-1.2.3-bin.tar.gz -C /opt</div><div class="line">// 重命名</div><div class="line"># mv hbase-1.2.3 hbase</div></pre></td></tr></table></figure></p>
<p>2、配置hbase的环境变量<code>/etc/profile</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">// 修改配置文件</div><div class="line"># sudo vi /etc/profile</div><div class="line"></div><div class="line">// 在最后下添加</div><div class="line">export HBASE_HOME=/opt/hbase</div><div class="line">export PATH=$PATH:$HBASE_HOME/bin</div><div class="line"></div><div class="line">// 刷新配置文件</div><div class="line"># source /etc/profile</div></pre></td></tr></table></figure></p>
<h4 id="§-修改hadoop配置文件,共3个"><a href="#§-修改hadoop配置文件,共3个" class="headerlink" title="§ 修改hadoop配置文件,共3个"></a>§ 修改hadoop配置文件,共3个</h4><p>1、HBase的所有配置文件都放在<code>/hbase/conf/</code>目录下,修改<code>hbase-env.sh</code>,将文件中的export JAVA_HOME=${JAVA_HOME}写成我们自己jdk的绝对路径:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"># The java implementation to use. Java 1.7+ required.</div><div class="line">export JAVA_HOME=/opt/jdk8</div><div class="line"></div><div class="line"></div><div class="line"># Tell HBase whether it should manage it's own instance of Zookeeper or not.</div><div class="line">export HBASE_MANAGES_ZK=true</div></pre></td></tr></table></figure></p>
<p>2、修改<code>hbase-site.xml</code>文件,在<configuration></configuration>中间加入如下内容:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div></pre></td><td class="code"><pre><div class="line"><configuration></div><div class="line"> <property></div><div class="line"> <!--这里注意了,这里的ns1用的是hadoop集群中hdfs的命名空间(namespace)!--></div><div class="line"> <name>hbase.rootdir</name></div><div class="line"> <value>hdfs://ns1/hbase</value></div><div class="line"> </property></div><div class="line"> <property></div><div class="line"> <name>hbase.master</name></div><div class="line"> <!--这里注意了,只需端口即可,不必再写主机名称了!--></div><div class="line"> <value>60000</value></div><div class="line"> </property></div><div class="line"> <property></div><div class="line"> <name>hbase.cluster.distributed</name></div><div class="line"> <value>true</value></div><div class="line"> </property></div><div class="line"> <property></div><div class="line"> <!--可以不写端口号,只写主机名称,因为后面又配置端口号:2181--></div><div class="line"> <name>hbase.zookeeper.quorum</name></div><div class="line"> <value>slaver1,slaver2,slaver3</value></div><div class="line"> <description>The directory shared by RegionServers.</description></div><div class="line"> </property></div><div class="line"> <property></div><div class="line"> <name>hbase.zookeeper.property.dataDir</name></div><div class="line"> <value>/opt/zookeeper/data</value></div><div class="line"> <description>Property from ZooKeeper config zoo.cfg. The directory where the snapshot is stored.</description></div><div class="line"> </property></div><div class="line"> <property></div><div class="line"> <name>hbase.zookeeper.property.clientPort</name></div><div class="line"> <value>2181</value></div><div class="line"> </property></div><div class="line"> <!--默认HMaster HTTP访问端口--></div><div class="line"> <property></div><div class="line"> <name>hbase.master.info.port</name></div><div class="line"> <value>16010</value></div><div class="line"> </property></div><div class="line"> <!--默认HRegionServer HTTP访问端口--></div><div class="line"> <property></div><div class="line"> <name>hbase.regionserver.info.port</name></div><div class="line"> <value>16030</value></div><div class="line"> </property></div><div class="line"></configuration></div></pre></td></tr></table></figure>
<p>3、修改<code>regionservers</code>文件,加入所有需要加入HBase集群中的从节点:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">slaver1</div><div class="line">slaver2</div><div class="line">slaver3</div><div class="line">~ </div><div class="line">~</div></pre></td></tr></table></figure></p>
<h4 id="§-将配置好的文件分发到其余各个节点"><a href="#§-将配置好的文件分发到其余各个节点" class="headerlink" title="§ 将配置好的文件分发到其余各个节点"></a>§ 将配置好的文件分发到其余各个节点</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"># cd /opt</div><div class="line"># scp -r ./hbase master2:/opt</div><div class="line"># scp -r ./hbase slaver1:/opt</div><div class="line"># scp -r ./hbase slaver2:/opt</div><div class="line"># scp -r ./hbase slaver3:/opt</div></pre></td></tr></table></figure>
<h4 id="§-启动HBase集群"><a href="#§-启动HBase集群" class="headerlink" title="§ 启动HBase集群"></a>§ 启动HBase集群</h4><p>在启动HBase之前,必须先启动<code>zookeeper</code>集群和<code>hadoop</code>集群。<br>1、在<code>master1</code>上面,运行以下命令,如果没有配置好hbase的环境变量,可以到<code>hbase/bin</code>目录下执行 ./start-hbase.sh:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># start-hbase.sh</div></pre></td></tr></table></figure></p>
<p>2、在<code>master2</code>上,单独启动一个<code>HMaster</code>进程:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># hbase-daemon.sh start master</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>中间的<code>start</code>参数换成<code>stop</code>就成了停止指定进程的命令。</li>
</ul>
</blockquote>
<p>3、HBase集群停止命令,在<code>master1</code>上运行:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># stop-hbase.sh</div></pre></td></tr></table></figure></p>
<p>4、验证已经正常启动:<br>在各个节点运行<code>jps</code>命令可以看到一下进程,其中<code>HMaster</code>和<code>HRegionServer</code>为HBase的相关进程:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div></pre></td><td class="code"><pre><div class="line">// master1上运行的进程,前面的数字对应的进程的pid号</div><div class="line">3376 HMaster</div><div class="line">977 ResourceManager</div><div class="line">32756 DFSZKFailoverController</div><div class="line">3657 Jps</div><div class="line">522 NameNode</div><div class="line"></div><div class="line">// master2上运行的进程,前面的数字对应的进程的pid号</div><div class="line">30995 Jps</div><div class="line">28164 NameNode</div><div class="line">28502 ResourceManager</div><div class="line">30344 HMaster</div><div class="line">28059 DFSZKFailoverController</div><div class="line"></div><div class="line">// slaver1上运行的进程,前面的数字对应的进程的pid号</div><div class="line">13520 DataNode</div><div class="line">13367 JournalNode</div><div class="line">14488 HRegionServer</div><div class="line">13690 NodeManager</div><div class="line">14762 Jps</div><div class="line">4523 QuorumPeerMain</div><div class="line"></div><div class="line">// slaver2上运行的进程,前面的数字对应的进程的pid号</div><div class="line">21744 DataNode</div><div class="line">21591 JournalNode</div><div class="line">13450 QuorumPeerMain</div><div class="line">21915 NodeManager</div><div class="line">22972 Jps</div><div class="line">22686 HRegionServer</div><div class="line"></div><div class="line">// slaver3上运行的进程,前面的数字对应的进程的pid号</div><div class="line">22898 DataNode</div><div class="line">22744 JournalNode</div><div class="line">23848 HRegionServer</div><div class="line">24105 Jps</div><div class="line">17210 QuorumPeerMain</div><div class="line">23069 NodeManager</div></pre></td></tr></table></figure></p>
<p>5、通过hadoop的web页面,查看是否异常,以及高可用是否正常运行:</p>
<p>在浏览器中输入:<a href="http://master1:16010,其中如果本地hosts中没有建立相应的主机名与IP的映射关系,将master1换成相应的IP,显示如下:" target="_blank" rel="external">http://master1:16010,其中如果本地hosts中没有建立相应的主机名与IP的映射关系,将master1换成相应的IP,显示如下:</a></p>
<p><img src="http://img.blog.csdn.net/20161017234127072" alt="hbaseHA"></p>
<p>在浏览器中输入:<a href="http://master2:16010,其中如果本地hosts中没有建立相应的主机名与IP的映射关系,将master2换成相应的IP,显示如下:" target="_blank" rel="external">http://master2:16010,其中如果本地hosts中没有建立相应的主机名与IP的映射关系,将master2换成相应的IP,显示如下:</a></p>
<p><img src="http://img.blog.csdn.net/20161017234225172" alt="hbaseHA"></p>
<p><strong>由以上两张图可以看出,目前<code>master1</code>处于<code>active</code>状态,<code>master2</code>处于<code>standby</code>状态,说明HBase的HA已成功建立。</strong></p>
<h3 id="三、总结"><a href="#三、总结" class="headerlink" title="三、总结"></a>三、总结</h3><p>总的来说,HBase高可用集群的搭建还是相当的简单的。但有时候需要注意一下这个问题:如果HBase启动过程中显示不能够正常搜索HDFS的<code>namespace</code>或者不能解析HDFS路径,可以将<code>/opt/hadoop/etc/hadoop</code>下的<code>core-site.xml</code> 和<code>hdfs-site.xml</code>拷到<code>/opt/hbase/conf/</code>下,一般可以解决问题。</p>
]]></content>
<summary type="html">
<p>本文主要介绍,在高可用(HA)Hadoop集群基础上搭建高可用(HA)的HBase集群。</p>
</summary>
<category term="学习" scheme="https://www.hanbert.cn/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="HBase" scheme="https://www.hanbert.cn/tags/HBase/"/>
<category term="Hadoop" scheme="https://www.hanbert.cn/tags/Hadoop/"/>
<category term="高可用" scheme="https://www.hanbert.cn/tags/%E9%AB%98%E5%8F%AF%E7%94%A8/"/>
</entry>
<entry>
<title>Hadoop 2.7.3 高可用(HA)集群部署</title>
<link href="https://www.hanbert.cn/2016/10/10/Hadoop-2-7-3-%E9%AB%98%E5%8F%AF%E7%94%A8%EF%BC%88HA%EF%BC%89%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2/"/>
<id>https://www.hanbert.cn/2016/10/10/Hadoop-2-7-3-高可用(HA)集群部署/</id>
<published>2016-10-10T01:12:29.000Z</published>
<updated>2017-04-10T01:45:05.942Z</updated>
<content type="html"><![CDATA[<p>本文主要介绍如何搭建HDFS(NameNode)和ResourceManager高可用的Hadoop集群。</p>
<a id="more"></a>
<p><strong>HDFS的高可用(HA)的实现方式:</strong></p>
<p> 一种是将NN维护的元数据保存一份到NFS上,当NN故障,可以通过另一台NNe读取NFS目录中的元数据备份进行恢复工作,需要手动进行操作,并不是真正意义上的HA方案。</p>
<p> 另一种是准备一台备用NN节点,通过定期下载NN的元数据和日志文件来备份,当NN故障时,可以通过这台进行恢复,由于主备节点元数据和日志并不是实时同步,所以会丢失一些数据。</p>
<p> 前两种方案都不是很理想,社区提供一种更好的方案,基于QJM(Qurom Journal Manager)的共享日志方案。QJM的基本原理是NN(Active)把日志写本地和2N+1(奇数)台JournalNode上,当数据操作返回成功时才写入日志,这个日志叫做editlog,而元数据存在fsimage文件中,NN(Standby)定期从JournalNode上读取editlog到本地。在这手动切换的基础上又开发了基于Zookeeper的ZKFC(ZookeeperFailover Controller)自动切换机制,Active和Standby节点各有ZKFC进程监控NN监控状况,定期发送心跳,当Active节点故障时Standby会自动切换为ActiveNode,本次就用的此方案。如下图所示:</p>
<p><img src="http://s3.51cto.com/wyfs02/M02/6E/60/wKioL1V6meKwAMxFAAFOKORH5AM212.jpg" alt="HDFS-HA"></p>
<p><strong>ResourceManager(RM) HA实现方式:</strong></p>
<p> RM将状态信息存储在Zookeeper中,当Active故障,Standby切换为Active后,从ZK读取相应的作业信息,重新构建作业的内存信息,然后开始接受NodeManager心跳,并接受客户端提交作业的请求等。</p>
<h3 id="一、部署前的准备工作"><a href="#一、部署前的准备工作" class="headerlink" title="一、部署前的准备工作"></a>一、部署前的准备工作</h3><ul>
<li>OpenStack 平台,构建虚拟机,也可用VMWare代替</li>
<li>Centos7 x64 操作系统</li>
<li>Hadoop 2.7.3 64位安装包(bin版)</li>
<li>Zookeeper 3.4.9 安装包(bin版)</li>
</ul>
<blockquote>
<p><strong>Apache 镜像下载地址:</strong><a href="http://www.apache.org/dist/" target="_blank" rel="external">http://www.apache.org/dist/</a><br><strong>Hadoop官方文档:</strong><a href="http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/ClusterSetup.html" target="_blank" rel="external">Hadoop Document</a></p>
</blockquote>
<h3 id="二、集群规划"><a href="#二、集群规划" class="headerlink" title="二、集群规划"></a>二、集群规划</h3><table>
<thead>
<tr>
<th style="text-align:left">主机名</th>
<th style="text-align:left">IP</th>
<th style="text-align:left">安装的软件</th>
<th style="text-align:left">运行的进程</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">master1</td>
<td style="text-align:left">172.16.1.33</td>
<td style="text-align:left">hadoop</td>
<td style="text-align:left">NameNode(active)、DFSZKFailoverController、ResourceManager(active)</td>
</tr>
<tr>
<td style="text-align:left">master2</td>
<td style="text-align:left">172.16.1.35</td>
<td style="text-align:left">hadoop</td>
<td style="text-align:left">NameNode(Standby)、DFSZKFailoverController、ResourceManager(Standby)</td>
</tr>
<tr>
<td style="text-align:left">slaver1</td>
<td style="text-align:left">172.16.1.22</td>
<td style="text-align:left">hadoop、zookeeper</td>
<td style="text-align:left">DataNode、NodeManager、QuorumPeerMain、JournalNode</td>
</tr>
<tr>
<td style="text-align:left">slaver2</td>
<td style="text-align:left">172.16.1.23</td>
<td style="text-align:left">hadoop、zookeeper</td>
<td style="text-align:left">DataNode、NodeManager、QuorumPeerMain、JournalNode</td>
</tr>
<tr>
<td style="text-align:left">slaver3</td>
<td style="text-align:left">172.16.1.24</td>
<td style="text-align:left">hadoop、zookeeper</td>
<td style="text-align:left">DataNode、NodeManager、QuorumPeerMain、JournalNode</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>Note:</strong></p>
<ul>
<li>如果节点资源足够多,也可以吧ResourceManager单独安装在两个节点上,这样更符合HA的特性</li>
<li>除了必须有两个NameNode之外,DataNode的节点可以尽可能的多,配置方式一样</li>
</ul>
</blockquote>
<h3 id="三、基础环境配置"><a href="#三、基础环境配置" class="headerlink" title="三、基础环境配置"></a>三、基础环境配置</h3><h4 id="§-更改主机名,并建立主机名与IP的映射关系(每个节点都要做)"><a href="#§-更改主机名,并建立主机名与IP的映射关系(每个节点都要做)" class="headerlink" title="§ 更改主机名,并建立主机名与IP的映射关系(每个节点都要做)"></a>§ 更改主机名,并建立主机名与IP的映射关系(每个节点都要做)</h4><p>1、临时更改主机名,机器重启后失效,以<code>master1</code>为例,其余每个节点同样设置:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"># hostname master1</div><div class="line"># hostname</div><div class="line">master1</div></pre></td></tr></table></figure>
<p>2、永久修改主机名<br>修改centos网络配置文件<code>/etc/sysconfig/network</code>,在末尾添加<code>HOSTNAME=master1</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"># vim /etc/sysconfig/network</div><div class="line">NETWORKING=yes</div><div class="line">NOZEROCONF=yes</div><div class="line">HOSTNAME=master1</div><div class="line">~ </div><div class="line">~</div></pre></td></tr></table></figure></p>
<p>3、修改<code>/etc/hosts</code>文件,最终状态,节点中的每台主机都要修改好相应的主机名,并在<code>hosts</code>文件中写入相应的IP 和主机名的映射关系,状态如下所示:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"># vim /etc/hosts</div><div class="line">127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4</div><div class="line">::1 localhost localhost.localdomain localhost6 localhost6.localdomain6</div><div class="line">172.16.1.33 master1</div><div class="line">172.16.1.35 master2</div><div class="line">172.16.1.22 slaver1</div><div class="line">172.16.1.23 slaver2</div><div class="line">172.16.1.24 slaver3</div><div class="line">~ </div><div class="line">~</div></pre></td></tr></table></figure></p>
<p>这样是永久修改,重启后生效,也可以结合第一种方法,让该用户名立即生效。</p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>在<code>/etc/</code>下有一个<code>hostname</code>文件,如果是Ubuntu系统可以直接在这个文件下面写入想要设置的主机名来达到永久修改主机名。</li>
<li>经过验证,openstack生成的虚拟机中,<code>hostname</code>会写有一个类似于<code>test.novalocal</code>的以<code>*.novalocal</code>结尾的主机名,如果按照<strong>方法2</strong>修改主机名,每次重启后,会自动把主机名设成这个名字,而不能如愿更改为我们想要的主机名,即使在<code>hostname</code>文件中,删掉原有主机名,写上我们想要设置的主机名,重启后以后会还原为删掉之前的样子。</li>
<li>所以,在本次配置中,我们使用<strong>方法1</strong>来临时修改主机名,尽量不重启机器,如果需要重启机器,重启后重新修改主机名,以防Hadoop不能正常启动。</li>
</ul>
</blockquote>
<p>4、如果机器的时间差相差太大容易导致启动失败,所以提前进行时间同步:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"># yum install ntp</div><div class="line"># ntpdate ntp.fudam.edu.cn</div></pre></td></tr></table></figure></p>
<h4 id="§-关闭防火墙(每个节点都要配置)"><a href="#§-关闭防火墙(每个节点都要配置)" class="headerlink" title="§ 关闭防火墙(每个节点都要配置)"></a>§ 关闭防火墙(每个节点都要配置)</h4><p>如果是生产环境中可以通过配置iptables规则来开放端口,此处我们作为实验且私网环境直接关闭放火墙来达到目的:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">// 关闭防火墙</div><div class="line"># sudo systemctl stop firewalld.service </div><div class="line">// 关闭开机启动</div><div class="line"># sudo systemctl disable firewalld.service</div></pre></td></tr></table></figure></p>
<h4 id="§-创建专门的用户(每个节点都要配置)"><a href="#§-创建专门的用户(每个节点都要配置)" class="headerlink" title="§ 创建专门的用户(每个节点都要配置)"></a>§ 创建专门的用户(每个节点都要配置)</h4><p>在安装完Centos7后,如果在真实的生产环境中,最好建立一个新的用户和组,专门用来安装Hadoop。<br>1、在root下,创建组和用户,为每一台虚拟机创建一个Hadoop用户<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">// 先创建组cloud</div><div class="line"># groupadd cloud</div><div class="line">// 创建用户并加入组cloud</div><div class="line">useradd -g cloud hadoop</div><div class="line">// 修改用户hadoop的密码</div><div class="line"># passwd hadoop</div></pre></td></tr></table></figure></p>
<p>2、将hadoop用户加到soduers列表,获取root权限<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">// 查看/etc/sudoers的权限</div><div class="line"># ls -l /etc/sudoers</div><div class="line">// 修改权限为 777</div><div class="line"># chmod 777 /etc/sudoers</div><div class="line">// 将hadoop添加root权限</div><div class="line"># vim /etc/sudoers</div><div class="line">## The COMMANDS section may have other options added to it.</div><div class="line">##</div><div class="line">## Allow root to run any commands anywhere </div><div class="line">root ALL=(ALL) ALL</div><div class="line">hadoop ALL=(ALL) ALL</div><div class="line"></div><div class="line">// 还原权限</div><div class="line"># chmod 440 /etc/sudoers</div></pre></td></tr></table></figure></p>
<p>其他节点的机器同样操作。</p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>本次部署,我们直接用的root用户,而没有新建hadoop用户和cloud组</li>
<li>相比于一台一台的修改配置文件,可以先在一台上面修改,然后用<code>scp</code>命令分发到其余各个节点的相应位置</li>
</ul>
</blockquote>
<h4 id="§-配置ssh免密登录(每个节点都要配置)"><a href="#§-配置ssh免密登录(每个节点都要配置)" class="headerlink" title="§ 配置ssh免密登录(每个节点都要配置)"></a>§ 配置ssh免密登录(每个节点都要配置)</h4><p>hadoop在使用过程中需要分发好多文件,配置好免密登录可以免去我们要不断地输入密码的麻烦。也有助于我们部署过程中把自己修改的配置文件分发到各个节点。</p>
<p>1、生成公钥和私钥,过程中会有一些提示选项,直接按回车,采用默认值便好</p>
<pre><code># ssh-keygen -t rsa
</code></pre><p>2、执行完上面的命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥),将公钥拷贝到要免登陆的机器上:</p>
<pre><code># ssh-copy-id 172.16.1.33
# ssh-copy-id 172.16.1.35
# ssh-copy-id 172.16.1.22
# ssh-copy-id 172.16.1.23
# ssh-copy-id 172.16.1.24
</code></pre><p>3、这时会在相应的主机的<code>~/.ssh/</code>下产生一个名为<code>authorized_keys</code>的文件,这时通过 <code>ssh 172.16.1.35</code>(修改为相应的主机对应的IP) 时可以直接免密登陆进入主机。<br>4、其他的每一个节点同样操作。</p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>也可以选择先在每一个节点上生成相应的私钥和公钥,然后把公钥通过用<code>scp</code>命令发送到一台机器上,比如<code>master1</code>,然后统一一块加入到这台机器<code>~/.ssh/authorized_keys</code>文件里面</li>
<li>然后把这个文件用<code>scp</code>分发到每一台机器的<code>~/.ssh/</code>文件夹中</li>
<li>这样就实现了集群中每一个节点的相互免密登录,而且,省去了每个节点都要手动配置的麻烦</li>
</ul>
</blockquote>
<h3 id="四、安装JDK(每个节点都要配置)"><a href="#四、安装JDK(每个节点都要配置)" class="headerlink" title="四、安装JDK(每个节点都要配置)"></a>四、安装JDK(每个节点都要配置)</h3><p>本次是用的是 jdk-8u101-linux-x64.tar.gz ,可以从Oracle官网下载,然后传送到每一台机器上,并解压,解压的路径可以自由选择,本次选择<code>/opt/</code>。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"># tar -zxvf jdk-8u101-linux-x64.tar.gz -C /opt</div><div class="line">// 修改文件夹名字</div><div class="line"># # mv /opt/jdk1.8.0_101 /opt/jdk8</div></pre></td></tr></table></figure></p>
<p>配置环境变量:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">// 修改配置文件</div><div class="line"># sudo vim /etc/profile</div><div class="line"> </div><div class="line">// 在最后下添加</div><div class="line">export JAVA_HOME=/opt/jdk8</div><div class="line">export PATH=$JAVA_HOME/bin:$PATH</div><div class="line">export CLASSPATH=.:$JAVA_HOME/lib</div><div class="line"> </div><div class="line">// 刷新配置文件</div><div class="line"># source /etc/profile</div></pre></td></tr></table></figure>
<p>其他每台机器都做同样的配置,或者将这个配好的jdk和profile文件用<code>scp</code>命令分发到每一台机器上。</p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>jdk的安装目录尽量不要选在普通用户的<code>/home/USER_NAME</code>家目录下,因为在后面<code>hadoop</code>配置中需要用到这个jdk的目录的绝对路径,如果写到<code>/home/USER_NAME</code>这个里面,其中的<code>/USER_NAME</code>会根据分发到各节点的用户名不同而不同,所以要在<code>hadoop</code>中重新配置这个<code>JAVA_HOME</code>的绝对路径,否则会导致启动失败。</li>
</ul>
</blockquote>
<h3 id="五、安装zookeeper(所有的slaver节点都要安装)"><a href="#五、安装zookeeper(所有的slaver节点都要安装)" class="headerlink" title="五、安装zookeeper(所有的slaver节点都要安装)"></a>五、安装zookeeper(所有的slaver节点都要安装)</h3><p>在slaver1、slaver2、slaver3上安装zookeeper。<br>1、从Apache官网下载zookeeper-3.4.9.tar.gz,并上传到以上三台节点的任意一台上面,然后解压到<code>/opt</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"># tar -zxvf zookeeper-3.4.8.tar.gz -C /opt</div><div class="line">// 重命名文件夹</div><div class="line"># mv zookeeper-3.4.8 zookeeper</div></pre></td></tr></table></figure></p>
<p>2、修改zookeeper的默认配置文件<code>./zookeeper/conf/zoo.cfg</code>:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"># mv zoo_sample.cfg zoo.cfg</div><div class="line"># vim zoo.cfg</div></pre></td></tr></table></figure></p>
<p>3、在打开的文件中修改或添加一下内容:</p>
<p> 修改dataDir指向我们数据文件夹,默认没有这个文件夹,需要后面的步骤创建:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">dataDir=/opt/zookeeper/data</div><div class="line">dataLogDir=/opt/zookeeper/logs</div></pre></td></tr></table></figure></p>
<p>并在最后添加:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">server.1=slaver1:2888:3888</div><div class="line">server.2=slaver2:2888:3888</div><div class="line">server.3=slaver3:2888:3888</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong>NOTE:</strong></p>
<p>此文件中的部分参数说明:</p>
<ul>
<li>tickTime:ZK服务器之间或客户端与服务器之间间隔多长时间发送一个心跳,单位毫秒</li>
<li>initLimit:ZK服务器集群中连接Leader的Follower服务器初始化连接时最长忍受多长心跳时间间隔(5*20000=10s)</li>
<li>syncLimit:标识Leader与Follower同步消息,如果超过时间(5*2000=10s),未完成同步,将剔除这个节点,所有连接此> > - Follower服务器的客户端将连接到另一个Foolower服务器上</li>
<li>dataDir:ZK保存数据的目录,默认情况下,ZK也会将日志文件保存在此目录</li>
<li>dataLogDir:指定日志文件目录</li>
<li>clientPort:客户端连接ZK服务器端口</li>
<li>server.1:第一个1代表第几号ZK服务器,slaver1是这个服务器的主机名或IP,2888是这个ZK服务器与集群中Leader服务器交换信息的端口,3888是Leader服务器出现故障时,用这个端口通信重新选举,在选出一个新的Leader</li>
</ul>
</blockquote>
<p>4、创建相应的目录和<code>myid</code>文件,其中,这个<code>myid</code>文件必须创建,否则启动会报错。分别在ZK集群节点创建myid号,myid一定对应好zoo.cfg中配置的server后面1、2、3这个ZK号,即本次部署过程中,<code>myid</code>文件的内容在slaver1上为1、在slaver2上为2、在slaver3上为3:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"># mkdir /opt/zookeeper/data</div><div class="line"># mkdir /opt/zookeeper/logs</div><div class="line"># vim /opt/zookeeper/data/myid </div><div class="line">1</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>上面的这个<code>/opt/zookeeper/data</code>等文件夹也可以换到别的目录创建,不一定非得在代码所在目录下,只需要在上面那个<code>zoo.cfg</code>指定即可。比如<code>/home/zookeeper/data</code>。同理<code>logs</code>文件夹也是。</li>
</ul>
</blockquote>
<p>5、分别启动所有的ZK节点(在所有的slaver上操作)<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/opt/zookeeper/bin/zkServer.sh start</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>ZK的每次启动都得单独一台一台的启动,不能够通过hadoop来统一管理启动!</li>
</ul>
</blockquote>
<p>6、检查启动是否成功,在三台slaver上运行下面的命令,就能找到唯一的一个<code>leader</code>和剩余的全是<code>follower</code>:</p>
<pre><code># /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
</code></pre><p>运行<code>jps</code>来查看相应的java进程,能够看到:</p>
<pre><code># jps
4523 QuorumPeerMain
11503 Jps
</code></pre><p>以上说明zookeeper已经成功安装并启动。</p>
<p>7、zookeeper停止命令:</p>
<pre><code>/opt/zookeeper/bin/zkServer.sh stop
</code></pre><p>需要在每一个需要停止zookeeper的节点上运行。</p>
<blockquote>
<p><strong>NOTE:</strong></p>
<ul>
<li>如果我们就找到<code>leader</code>那台机器,然后运行上面的命令停掉ZK,或者<code>jps</code>查到<code>QuorumPeerMain</code>的<code>pid</code>号,然后用<code>kill</code>命令</li>
</ul>
</blockquote>