-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
1078 lines (815 loc) · 60.8 KB
/
atom.xml
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" xml:lang="zh-CN">
<title type="text">scott-wong/王宇</title>
<subtitle type="html">scott-wong/岛民宇哥的个人网站,最近专注企业架构和云原生技术体系。</subtitle>
<updated>2020-11-26T18:12:13+08:00</updated>
<id>https://wangyu.space/</id>
<link rel="alternate" type="text/html" href="https://wangyu.space/" />
<link rel="self" type="application/atom+xml" href="https://wangyu.space/atom.xml" />
<author>
<name>scott-wong/王宇</name>
<uri>https://wangyu.space/</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights>
<generator uri="https://gohugo.io/" version="0.68.3">Hugo</generator>
<entry>
<title type="text">K3s快速部署到centos7</title>
<link rel="alternate" type="text/html" href="https://wangyu.space/posts/k3s/" />
<id>https://wangyu.space/posts/k3s/</id>
<updated>2020-11-26T18:12:09+08:00</updated>
<published>2020-06-23T15:28:30+08:00</published>
<author>
<name>scott-wong/王宇</name>
<uri>https://scott-wong.ga</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights><summary type="html"><![CDATA[官方快速部署 安装依赖 yum install -y container-selinux selinux-policy-base rpm -i https://rpm.rancher.io/k3s-selinux-0.1.1-rc1.el7.noarch.rpm 运行安装脚本 curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh - 卸载 /usr/local/bin/k3s-uninstall.sh]]></summary>
<content type="html"><![CDATA[<h1 id="官方快速部署">官方快速部署</h1>
<ol>
<li>安装依赖</li>
</ol>
<pre><code>yum install -y container-selinux selinux-policy-base
rpm -i https://rpm.rancher.io/k3s-selinux-0.1.1-rc1.el7.noarch.rpm
</code></pre><ol start="2">
<li>运行安装脚本</li>
</ol>
<pre><code>curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
</code></pre><p>卸载</p>
<pre><code>/usr/local/bin/k3s-uninstall.sh
</code></pre>]]></content>
<category scheme="https://wangyu.space/categories/k8s/" term="k8s" label="k8s" />
</entry>
<entry>
<title type="text">统一日志平台:EFK单节点部署</title>
<link rel="alternate" type="text/html" href="https://wangyu.space/posts/efk-one-node/" />
<id>https://wangyu.space/posts/efk-one-node/</id>
<updated>2020-11-26T18:12:09+08:00</updated>
<published>2020-05-22T09:56:21+08:00</published>
<author>
<name>scott-wong/王宇</name>
<uri>https://scott-wong.ga</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights>
<summary type="html"><![CDATA[EFK单节点部署 本层版本选择7.7. 1. 安装es 1.1 下载es https://www.elastic.co/cn/downloads/elasticsearch 推荐rpm 1.2 上传安装包安装es rpm -ivh elasticsearch-7.7.0-x86_64.rpm sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service 以下可选 vim /etc/sysctl.conf……]]></summary>
<content type="html"><![CDATA[<h2 id="efk单节点部署">EFK单节点部署</h2>
<p>本层版本选择7.7.</p>
<h2 id="1-安装es">1. 安装es</h2>
<h3 id="11-下载es">1.1 下载es</h3>
<p><a href="https://www.elastic.co/cn/downloads/elasticsearch">https://www.elastic.co/cn/downloads/elasticsearch</a>
推荐rpm</p>
<h3 id="12-上传安装包安装es">1.2 上传安装包安装es</h3>
<pre><code>rpm -ivh elasticsearch-7.7.0-x86_64.rpm
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
</code></pre><p>以下可选<br>
<code>vim /etc/sysctl.conf</code><br>
添加或修改
<code>vm.max_map_count=262144</code>
<code>sudo sysctl -p</code></p>
<p>防止 es 启动时出现如下错误: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]</p>
<pre><code>vim /etc/security/limits.conf
* soft memlock 100000
* hard memlock 100000
* soft nproc 100000
* hard nproc 100000
</code></pre><p>以上</p>
<h3 id="13-配置es">1.3 配置es</h3>
<pre><code>#按需配置jvm.options, 默认-Xms1g -Xmx1g
#推荐:如果足够的内存,也尽量不要 超过 32 GB。即每个节点内存分配不超过 32 GB。 因为它浪费了内存,降低了 CPU 的性能,还要让 GC 应对大内存。如果你想保证其安全可靠,设置堆内存为 31 GB 是一个安全的选择。
vim /etc/elasticsearch/jvm.options
vim /etc/elasticsearch/elasticsearch.yml
#修改如下基础配置
network.host: 10.119.31.209
discovery.seed_hosts: ["10.119.31.209"]
</code></pre><h3 id="配置-tls-和身份验证推荐">配置 TLS 和身份验证(推荐)</h3>
<p>rpm安装es默认home路径:/usr/share/elasticsearch</p>
<pre><code>#在 Elasticsearch 主节点上配置 TLS
/usr/share/elasticsearch/bin/elasticsearch-certutil cert -out /etc/elasticsearch/elastic-certificates.p12 -pass ""
chmod 640 /etc/elasticsearch/elastic-certificates.p12
vim /etc/elasticsearch/elasticsearch.yml
#添加安全配置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
#启动es
systemctl start elasticsearch
#自动设置elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user的密码,记得保存,也可以把auto改成interactive手动设置密码
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
</code></pre><p>浏览器打开http://10.119.31.209:9200/</p>
<h2 id="2-安装kibana">2. 安装kibana</h2>
<pre><code>rpm -ivh kibana-7.7.0-x86_64.rpm
vim
#修改如下配置
server.host: "10.119.31.209"
elasticsearch.hosts: ["http://10.119.31.209:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "password"
i18n.locale: "zh-CN"
#启动kibana
systemctl start kibana.service
</code></pre><h2 id="3-安装filebeat">3. 安装filebeat</h2>
<p>filebeat默认支持几十种采集模块,如nginx, kafka, mysql等,可按需配置或完全自定义配置路径。</p>
<h3 id="31-nginx日志收集">3.1 nginx日志收集</h3>
<pre><code>#nginx节点安装filebeat
rpm -ivh filebeat-7.7.0-x86_64.rpm
vim
output.elasticsearch:
hosts: ["<es_url>"]
username: "elastic"
password: "<password>"
setup.kibana:
host: "<kibana_url>"
</code></pre><pre><code>#启用nginx模块
sudo filebeat modules enable nginx
#修改采集路径
vim /etc/filebeat/modules.d/nginx.yml
- module: nginx
# Access logs
access:
enabled: true
var.paths: ["/app/openresty/nginx/logs/access*.log"]
</code></pre><pre><code>#setup 命令加载 Kibana 仪表板。如果仪表板已设置,请省略此命令。
sudo filebeat setup
#启动filebeat
sudo systemctl start filebeat
</code></pre><h3 id="32-配置索引生命周期管理">3.2 配置索引生命周期管理</h3>
<p>http://xxx/app/kibana#/management/elasticsearch/index_lifecycle_management/policies/edit/filebeat</p>
<p>按需配置保留的日志索引大小。</p>
<h3 id="33-原日志文件清理">3.3 原日志文件清理</h3>
<p>如接入EFK日志平台后,不想保留原始日志文件,最方便的方案如下:</p>
<ol>
<li>不分割日志,如nginx按天分割;</li>
<li>编写个脚本把日志文件内容清空,设定每天或每周执行一次。</li>
</ol>
<pre><code>#!/bin/bash
# nginx-logs-flush.sh
logdir=/app/openresty/nginx/logs
echo "" > $logdir/error.log
echo "" > $logdir/access.log
</code></pre><p>定时任务,如下为每周日凌晨两点执行</p>
<pre><code>crontab -l
0 2 * * 0 /app/openresty/nginx/logs/nginx-logs-flush.sh
</code></pre><hr>
<p>参考官方文档:<br>
<a href="https://www.elastic.co/cn/blog/getting-started-with-elasticsearch-security">https://www.elastic.co/cn/blog/getting-started-with-elasticsearch-security</a><br>
<a href="https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html">https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html</a></p>
]]></content>
<category scheme="https://wangyu.space/categories/%E9%83%A8%E7%BD%B2/" term="部署" label="部署" />
<category scheme="https://wangyu.space/tags/elasticsearch/" term="elasticsearch" label="elasticsearch" />
<category scheme="https://wangyu.space/tags/filebeat/" term="filebeat" label="filebeat" />
<category scheme="https://wangyu.space/tags/kibana/" term="kibana" label="kibana" />
<category scheme="https://wangyu.space/tags/%E6%97%A5%E5%BF%97/" term="日志" label="日志" />
</entry>
<entry>
<title type="text">企业架构系列:从CNCF云原生全景图里做技术选型</title>
<link rel="alternate" type="text/html" href="https://wangyu.space/posts/cncf-landscope/" />
<id>https://wangyu.space/posts/cncf-landscope/</id>
<updated>2020-11-26T18:12:09+08:00</updated>
<published>2020-04-14T17:54:08+08:00</published>
<author>
<name>scott-wong/王宇</name>
<uri>https://scott-wong.ga</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights>
<summary type="html"><![CDATA[概述 从全局视角了解云原生生态可以直接看CNCF全景图,截止2020年4月27日已有1,382个图标。包含应用定义与开发层……]]></summary>
<content type="html"><![CDATA[<h1 id="概述">概述</h1>
<p>从全局视角了解云原生生态可以直接看<a href="https://landscape.cncf.io/">CNCF全景图</a>,截止2020年4月27日已有1,382个图标。包含应用定义与开发层(App Definition and Development)、编排与治理层(Orchestration Management)、运行时(Runtime)、供应保障层(Provisioning)、平台(Platform)、观察与分析(Observability and Analysis)、无服务(Serverless)、云服务商(Special)和CNCF成员(Members)八个层次。<br>
<img src="/images/cncf-landscope.png" alt="CNCF全景图"><br>
从CNCF全景图里做技术选型是个比较靠谱的方法,具体还是根据客户需要或行业特点来选。
本文重点介绍图中涉及的开源项目。</p>
<h1 id="目录">目录</h1>
<p><a href="#1%E5%BA%94%E7%94%A8%E5%AE%9A%E4%B9%89%E4%B8%8E%E5%BC%80%E5%8F%91%E5%B1%82">1.应用定义与开发层</a><br>
<a href="#2%E7%BC%96%E6%8E%92%E4%B8%8E%E6%B2%BB%E7%90%86%E5%B1%82">2.编排与治理层</a><br>
<a href="#3%E8%BF%90%E8%A1%8C%E6%97%B6">3.运行时</a><br>
<a href="#4%E4%BE%9B%E5%BA%94%E4%BF%9D%E9%9A%9C%E5%B1%82">4.供应保障层</a><br>
<a href="#5%E5%B9%B3%E5%8F%B0">5.平台</a><br>
<a href="#6%E8%A7%82%E5%AF%9F%E4%B8%8E%E5%88%86%E6%9E%90">6.观察与分析</a><br>
<a href="#7serverless">7.Serverless</a><br>
<a href="#8%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%95%86special">8.云服务商(Special)</a><br>
<a href="#9cncf%E6%88%90%E5%91%98">9.CNCF成员</a></p>
<hr>
<h1 id="1应用定义与开发层">1.应用定义与开发层</h1>
<p>本层包括数据库、流与消息、应用定义和镜像构建、持续集成/部署四部分。</p>
<h2 id="11-数据库">1.1 数据库</h2>
<p>CNCF包含了业界主流的所有数据库,比如关系型Oracle、MySQL、PostgreSQL、MS SQL Server,支持MySQL分片的中间件Vitess、国产HTAP的TiDB,云原生CockroachDB,分析型Hadoop,文档MongoDB,内存数据库Redis、Ignite(国内用的不多,有坑),图Neo4j等47个。<br>
<img src="/images/cncf-landscope-database.png" alt="CNCF全景图-数据库"></p>
<p>选型建议:</p>
<ul>
<li>客户接受公有云的直接用云厂商的数据库产品,如阿里的NewSQL PolarDB(支持最大容量100TB,最多可横向扩展16个节点,每个节点最高88 vCPU),OceanBase(单集群最大数据量超过 3PB,最大单表行数达万亿级);</li>
<li>很多行业需要独立部署的,商业数据库Oracle等仍然占有一席之地,而且Oracle也进化成自治数据库,仍然可圈可点;</li>
<li>客户要独立部署但接受新事物的,大胆使用支持行存+列存的HTAP混合的TiDB,高度兼容MySQL,3.0集群支持 150+ 存储节点,300+TB存储容量;</li>
<li>内存数据库Redis足够稳定,官方集群部署方案能适应大多场景;</li>
<li>小型应用场景可以直接Helm安装MySQL用。</li>
</ul>
<h2 id="12-流与消息">1.2 流与消息</h2>
<p><img src="/images/cncf-landscope-message.png" alt="CNCF全景图-流与消息"><br>
流计算引擎目前基本是Spark和Flink二分天下,批处理Spark更强大些,流处理Flink前期优势明显,目前Spark也在紧跟,双方也是互相借鉴。Spark生态支持更好些,按需二选一就可以了。</p>
<p>消息中间件目前国内Kafka、RocketMQ、RabbitMQ用的比较多,各有适用场景。
Kafka在大数据流处理、日志等场景用的多,RocketMQ在国内通用消息队列场景有很多落地,RabbitMQ在企业级市场也广泛采用。</p>
<p>分布式消息标准目前有国内牵头的OpenMessaging在推进。</p>
<p>CNCF有两个孵化项目CloudEvents和NATS。</p>
<ul>
<li>CloudEvents是描述事件数据的开源规范,旨在简化事件声明以及跨服务、平台等的消息投递。</li>
<li>NATS是高性能消息中间件,官网性能对比图是Kafka两倍,目前用的不多,可持续关注。</li>
</ul>
<p>这里还包括了几个数据集成/ETL工具开源的NiFi和商业的Talend等,我们用的是图里面没有的Pentaho Data Integration (Kettle)。</p>
<p>最后提一下MQTT的消息中间件EMQ X,国内公司开源的,在物联网有广泛应用。</p>
<h2 id="13-应用定义和镜像构建">1.3 应用定义和镜像构建</h2>
<p><img src="/images/cncf-landscope-app-definition.png" alt="CNCF全景图-应用定义和镜像构建"></p>
<p>CNCF孵化中的Helm几乎成为云原生应用定义的事实标准,推荐企业在内部维护一套基于Helm的应用商店,同时国内可以用阿里云apphub应用仓库。期待阿里主导的OAM应用定义规范的后续发展。</p>
<p>OpenAPI规范在这层,是API的统一标准,目前版本3.0,建议采用。</p>
<p>Podman,新的容器管理工具,可替代Docker,目前国内用的不多。</p>
<p>镜像构建:</p>
<ul>
<li>kaniko,支持在Kubernetes中构建容器镜像。</li>
<li>Packer,用于从单一配置来源为多平台创建相同的机器映像。
建议可以用Kubesphere集成的Jenkins构建镜像。</li>
</ul>
<p>Telepresence是比较有用的工具,用于本地开发连接k8s集群。</p>
<p>比较奇怪的是华为开源的ServiceComb微服务框架放在了这层。</p>
<h2 id="14-持续集成部署">1.4 持续集成/部署</h2>
<p><img src="/images/cncf-landscope-cicd.png" alt="CNCF全景图-CI/CD"></p>
<ul>
<li>Jenkins + Gitlab,CI/CD工具图里面常用的,开源项目用Travis CI。</li>
<li>Spinnaker,国外用的比较多的跨云持续部署工具,参考https://blog.csdn.net/yejingtao703/article/details/102328579。</li>
<li>Tekton,knative推荐的k8s原生流水线工具。</li>
</ul>
<p>建议同1.3.</p>
<h1 id="2编排与治理层">2.编排与治理层</h1>
<p>编排与治理层(Orchestration Management)由计划与编排(Scheduling & Orchestration)、协调与服务发现(Coordination & Service Discovery)、远程过程调用(Remote Procedure Call)、服务代理(Service Proxy)、API网关、服务网格(Service Mesh)等六部分组成。</p>
<h2 id="21-计划与编排">2.1 计划与编排</h2>
<p>作为CNCF毕业项目的Kubernetes已经成为容器编排事实标准,Amazon ECS仍然有一定市场,其他Mesos、Docker Swarm等则正渐行渐远。</p>
<h2 id="22-协调与服务发现">2.2 协调与服务发现</h2>
<p>毕业项目CoreDNS是k8s默认DNS服务器,支持插件扩展。</p>
<p>全景图里服务发现有etcd、Zookeeper、Nacos、Netflix Eureka(已停止开源版本开发)。</p>
<ul>
<li>etcd在k8s中用于保存集群所有的网络配置和对象的状态信息,作为KV数据库也应用于众多产品,如网关Apisix。</li>
<li>Zookeeper,早期dubbo+zk是经典的服务架构,目前国内应用仍然广泛,同时作为Kafka的依赖组件。</li>
<li>Nacos,阿里开源的服务发现、配置管理和服务管理平台,建议广泛采用。</li>
</ul>
<p>建议小型微服务项目直接用k8s的Service实现服务发现,中型则可尝试Nacos,或者直接用服务网格。</p>
<h2 id="23-rpc">2.3 RPC</h2>
<p>RPC框架目前有孵化的gRPC、Thrift、Dubbo、SOFARPC、Tars、Avro,一半国人推出的。国内用的最多的是Dubbo,中小型项目直接RESTful API调用,也是一种RPC方式。</p>
<h2 id="24-服务代理">2.4 服务代理</h2>
<p>毕业项目Envoy作为数据平面与Istio作为服务网格黄金组合正朝着网格标准走去,蚂蚁金服造了个基于Go的轮子MOSN。</p>
<p>其他主要是负载均衡工具,包括F5、HAProxy、Nginx及其衍生产品(Openresty、Tengine)等。</p>
<p>Traefik是云原生边缘路由,未深入研究不做评价。</p>
<p>负载均衡选型建议:<br>
多数场景Nginx能够胜任,支持四层和七层代理,与Keepalived组成多主模式。如果想实现动态配置,可以直接用基于Openresty的API网关。</p>
<h2 id="25-api网关">2.5 API网关</h2>
<p>API网关开源里面主要有Openresty和Go两大阵营。</p>
<ul>
<li>Kong,基于Openresty,发展有几年了,生态丰富,持久化支持C。</li>
<li>Apisix,基于Openresty,国人主导的,对标Kong,还在Apache孵化中,持久化用的是etcd。</li>
<li>Ambassador, 基于Envoy proxy构建的,k8s原生的开源微服务网关。</li>
<li>Tyk,基于Go,了解的不多,国内有基于Go的GOKU,虽然开源,单多数插件收费。</li>
<li>Mule Community Edition,国内很多ESB平台是基于MuleESB建设的。</li>
<li>WSO2 API Microgateway,了解的不多。</li>
</ul>
<p>选型建议:<br>
Apisix目前在高速迭代,虽然还有些问题,但已经生产可用了。
另外需要独立提到的流控防护组件Sentinel,产品成熟度高,建议与API网关二选一。</p>
<p><img src="/images/api-gateway.jpg" alt="API网关选型">
图片来源:Apisix作者之一,图中Tyk拼错了</p>
<h2 id="26-服务网格">2.6 服务网格</h2>
<p>这里主要是控制平面的产品,虽然Linkerd是CNCF孵化的项目,不过目前还是Istio更具优势,尤其1.5版本发布后,很大程度解决了性能问题。</p>
<p>这里的Netflix Zuul感觉应该移到API网关层,Consul更适合放在协调与服务发现层与Nacos并列。</p>
<h1 id="3运行时">3.运行时</h1>
<p>运行时(Runtime)包括、存储、容器运行时和网络三部分。</p>
<h2 id="31-云原生存储">3.1 云原生存储</h2>
<p><img src="/images/cncf-landscope-storage.png" alt="云原生存储"></p>
<p>上图可看到众多的存储方案/产品,常见的Ceph、GlusterFS、MinIO。</p>
<ul>
<li>Container Storage Interface (CSI),旨在为容器编排引擎和存储系统间建立一套标准的存储调用接口,通过该接口为容器编排引擎提供存储服务。各个云厂商都有提供CSI接口。</li>
<li>Ceph,兼有块存储、文件存储功能的高扩展对象存储,支持作为k8s持久化存储;</li>
<li>GlusterFS,兼有对象存储功能的高扩展文件存储,支持作为k8s持久化存储;</li>
<li>Rook,一个自管理的分布式存储编排系统,可以为k8s提供便利的存储解决方案。Rook本身并不提供存储,而是在kubernetes和存储系统之间提供适配层,简化存储系统的部署与维护工作,目前支持的存储中Stable状态有Ceph、EdgeFS。</li>
<li>MinIO,支持对象存储,兼容S3 API,可以用于分布式图片存储。</li>
<li>Alluxio,以内存为中心的虚拟的分布式存储系统,作为数据访问层成为持久存储层(如Amazon S3,Microsoft Azure Object Store,Apache HDFS或OpenStack Swift)和计算框架层(如Apache Spark,Presto或Hadoop MapReduce)之间的桥梁。</li>
</ul>
<p>选型建议:
开发测试环境可以用传统的NFS,生产环境建议搭建高可用分布式存储集群,具体根据业务特点和人员专长选择。</p>
<h2 id="32-容器运行时">3.2 容器运行时</h2>
<p>容器运行时除了Docker默认的containerd,还有Kata、gVisor(Google)、Firecracker(AWS)、Nabla、Pouch(Ali)等。</p>
<ul>
<li>容器运行时接口(Container Runtime Interface, CRI),定义容器和镜像的服务的接口。</li>
<li>containerd,CNCF毕业项目,Docker公司捐赠的。</li>
<li>CRI-O,能够让k8s使用任意兼容OCI的运行时作为运行pod的容器运行时,默认用runC,还支持其他OCI兼容,例如Kata容器。</li>
<li>安全/沙箱容器<br>
基于MicroVM:Kata、Firecracker<br>
基于进程虚拟化:gVisor</li>
</ul>
<p>各容器引擎各有优势,云原生落地初期建议直接用containerd。</p>
<h2 id="33-云原生网络">3.3 云原生网络</h2>
<p><img src="/images/cncf-landscope-network.png" alt="云原生网络"><br>
常见网络方案Flannel、Calico、Weave和Canal(技术上是多个插件的组合)。</p>
<ul>
<li>Container Network Interface (CNI),用于连接容器管理系统和网络插件。</li>
</ul>
<p>选哪个CNI插件?<br>
<img src="/images/which-cni.webp" alt="选哪个CNI插件?"></p>
<ul>
<li>Overlay插件,常见的有 Flannel-vxlan, Calico-ipip, Weave;</li>
<li>Underlay或者路由插件,clico-bgp, flannel-hostgw, sriov;</li>
<li>在公有云选择厂商提供的插件。</li>
</ul>
<h1 id="4供应保障层">4.供应保障层</h1>
<p>供应保障层(Provisioning)包括自动化与配置、容器仓库、安全与合规、密钥管理四部分。</p>
<h2 id="41-自动化与配置">4.1 自动化与配置</h2>
<p><img src="/images/cncf-landscope-automation.png" alt="自动化与配置"><br>
自动化:</p>
<ul>
<li>Ansible,自动化运维工具,使用广泛。</li>
<li>Chef,一款自动化服务器配置管理工具。</li>
<li>Terraform,"Write, Plan, and create Infrastructure as Code".</li>
<li>Pulumi,架构即是代码,使用代码自动配置和管理您的AWS,Azure,Google Cloud Platform和/或Kubernetes资源。</li>
</ul>
<p>配置:</p>
<ul>
<li>Apollo,携程开源的强大的配置平台。</li>
</ul>
<p>KubeEdge,k8s原生的边缘计算框架。</p>
<p>本层研究较少,不多做介绍。</p>
<h2 id="42-容器仓库">4.2 容器仓库</h2>
<p>容器镜像仓库国内可以用阿里容器镜像服务或者用CNCF孵化的Harbor自建。<br>
Dragonfly是阿里开源的P2P镜像分发系统,国内用户较多,类似Uber开源的Kraken。</p>
<h2 id="43-安全与合规">4.3 安全与合规</h2>
<p><img src="/images/cncf-landscope-security.png" alt="安全与合规">
镜像扫描:</p>
<ul>
<li>Anchore,利用 CVE 数据库来对已知威胁进行扫描,还提供很多附加标准可以进行配置,来作为扫描策略的一部分:Dockerfile 检查、凭据泄露、语言相关内容(npm、maven 等)、软件许可等。</li>
<li>Clair,专注于威胁检测和 CVE 匹配的功能,用户量大,Harbor已集成。</li>
<li>Dagda,图中没有,集成了 ClamAV,不仅可以扫描镜像,还能用作防毒软件。</li>
<li>Snyk,漏洞检测工具,会直接链接到代码仓库,解析项目结构,并分析引入的代码及其直接和间接依赖。</li>
</ul>
<p>运行时安全:</p>
<ul>
<li>Falco,孵化项目,一个云原生的运行时安全工具,检测应用、容器、主机以及 Kubernetes 的反常行为。</li>
</ul>
<p>网络安全:</p>
<ul>
<li>Tigera,非开源,为Kubernetes平台提供零信任网络安全性和持续合规性解决方案。</li>
</ul>
<p>安全审计:</p>
<ul>
<li>Grafeas,一个元数据和审计日志收集工具,可以用来跟踪组织中的安全合规实践。</li>
<li>kube-bench,检查是否根据CIS Kubernetes基准测试中定义的安全最佳实践部署了Kubernetes。</li>
<li>kube-hunter,从外部攻击者的视角在k8s集群中查找安全弱点(例如远程代码执行或者信息泄露)。</li>
<li>Open Policy Agent (OPA),孵化项目,一个开源的通用策略引擎,可以把 OPA 作为 Kubernetes 准入控制器后端进行部署,这样OPA代理可以接管安全决策,根据自定义安全约束,对请求进行校验、拒绝甚至是就地修改。</li>
<li>Notary,一个允许任何人信任任意数据集合的项目,基于TUF项目,Harbor、Portieris等很多项目有集成。</li>
</ul>
<p>基础项目:</p>
<ul>
<li>TUF(The Update Framework),一个针对软件分发和更新问题的安全通用设计。</li>
</ul>
<p>选型建议:<br>
目前国内私有云部署的k8s集群在安全方面关注不多,建议有较高安全需求的项目投入研究相关安全产品或选择商业端到端安全方案。</p>
<h2 id="44-密钥管理">4.4 密钥管理</h2>
<ul>
<li>Keycloak,用于应用程序和服务的身份和访问管理,来自Radhat。</li>
<li>Athenz, 用于提供和配置(集中式授权)用例以及服务/运行时(分散式授权)用例的基于角色的授权(RBAC)系统。</li>
<li>ORY Hydra,使用Go编写的OAuth2服务端框架和OpenID认证的OpenID Connect提供者。</li>
<li>Vault,机密管理、加密即服务和特权访问管理的工具,可用Helm在k8s集群中部署Vault的Chart,使用Consul作为存储后端。</li>
<li>Square Keywhiz,密钥分发与管理工具。</li>
<li>Teleport,开源堡垒机。</li>
</ul>
<p>本层研究较少不做选型建议。</p>
<h1 id="5平台">5.平台</h1>
<p>平台(Platform)包括认证发行平台(Distribution)、认证托管平台(Hosted)、认证安装工具、PaaS平台/容器服务四部分。</p>
<h2 id="51-认证发行平台">5.1 认证发行平台</h2>
<p><img src="/images/cncf-landscope-platform.png" alt="认证发行平台">
OpenShift最知名,国内平台企业占比也不少,重点推荐两个国产开源平台Kubesphere和Rancher。</p>
<ul>
<li>Rancher,目前用户比较多,支持多云k8s集群管理,可基于Rancher快速搭建自己的K8s集群。</li>
<li>Kubesphere,我最喜欢的容器平台,界面和封装对开发友好,集成DevOps、微服务治理、灰度发布、多租户管理、工作负载和集群管理、监控告警、日志查询与收集、服务与网络、应用商店、镜像构建与镜像仓库管理和存储管理等多种业务场景。</li>
</ul>
<h2 id="52-认证托管平台">5.2 认证托管平台</h2>
<p><img src="/images/cncf-landscope-hosted.png" alt="认证托管平台"></p>
<p>公有云的天下,不做介绍了。</p>
<h2 id="53-认证安装工具">5.3 认证安装工具</h2>
<ul>
<li>Kubeadm,最常用的安装工具</li>
<li>Rancher Kubernetes Engine (RKE),支持在裸机和虚拟化服务器上安装k8s.</li>
<li>Kubesphere Installer,不在图里,但是我觉得可以加上。</li>
</ul>
<h2 id="54-paas平台容器服务">5.4 PaaS平台/容器服务</h2>
<p>PaaS平台Heroku、Flynn国内用的不多</p>
<ul>
<li>Jhipster,微服务的脚手架,快速创建Spring Boot + Angular/React项目,全栈开发人员可以关注下。</li>
</ul>
<p>选型建议:<br>
本层的开源项目个人认为都不如Kubesphere实用。</p>
<p>彩蛋来了</p>
<ul>
<li>No Code,编写安全可
靠的应用程序的最佳方法:什么也不要写:什么也别部署。。。</li>
</ul>
<h1 id="6观察与分析">6.观察与分析</h1>
<p>观察与分析(Observability and Analysis)层包括监控、日志、追踪、混沌工程四部分。</p>
<h2 id="61-监控">6.1 监控</h2>
<p><img src="/images/cncf-landscope-monitoring.png" alt="监控"></p>
<ul>
<li>经典组合:Prometheus(监控系统与时序数据库) + Grafana(监控、指标分析和仪表板工具),已经是很多容器平台监控标配。</li>
<li>Falcon,小米开源的监控系统,国内用户不少。</li>
<li>Netdata,实时Linux性能监控工具,全图Github Star数第四。</li>
</ul>
<p>选型建议:
用业界成熟的Prometheus + Grafana组合肯定错不了;
Zabbix在传统运维监控领域仍然宝刀未老,奇怪的是Github上Star还未破千;
Beats,Elastic出品的轻量数据采集器在文件日志等场景比较有优势。</p>
<h2 id="62-日志">6.2 日志</h2>
<ul>
<li>Fluentd,统一日志层,支持对日志进行收集、处理、转发操作。比Logstash更省资源。</li>
<li>Elasticsearch,文档数据库,存储日志数据。</li>
<li>Grafana Loki,日志聚合工具,类似Prometheus,但针对日志场景。</li>
</ul>
<p>选型建议:
云原生环境下可以用Beats收集罗盘日志,使用EBK(Elasticsearch+Beats+Kibane)或者EFK组合搭建统一日志平台。</p>
<h2 id="63-追踪tracing">6.3 追踪(Tracing)</h2>
<p>主流追踪系统有Jaeger,Pinpoint,Zipkin,CAT,Skywalking等,其中Zipkin和CAT对代码有一定的侵入性。</p>
<ul>
<li>Jaeger,CNCF毕业项目,来自Uber。</li>
<li>OpenTelemetry, 整合OpenTracing和OpenCensus,终态是实现Metrics、Tracing、Logging的融合,作为CNCF可观察性的终极解决方案。</li>
<li>OpenTracing,孵化中项目,追踪标准规范。</li>
<li>Pinpoint,依赖HBase。</li>
<li>Skywalking,国人开源的应用程序性能监视工具。</li>
</ul>
<p>选型建议:
Skywalking,社区活跃,支持多种语言,案例较多。</p>
<h2 id="64-混沌工程">6.4 混沌工程</h2>
<p>混沌工程了解的很少,这里只介绍下阿里开源的Chaosblade。</p>
<ul>
<li>Chaosblade,混沌实验注入工具,可用来衡量微服务的容错能力、验证容器编排配置是否合理、测试 PaaS 层是否健壮、验证监控告警的时效性、定位与解决问题的应急能力。</li>
</ul>
<h1 id="7serverless">7.Serverless</h1>
<p><img src="/images/cncf-landscope-serverless.png" alt="Serverless"><br>
Serverless独立一个全景图,可见CNCF对Serverless的重视程度。
本图包括工具、安全、框架、托管平台、可安装平台等五层。</p>
<h2 id="71-serverless工具">7.1 Serverless工具</h2>
<p>Serverless图里面的工具开源的不多,重点介绍下下面几个:</p>
<ul>
<li>Hasura GraphQL Engine,基于Postgres实现细粒度访问控制的快速、实时GraphQL API,也会基于数据库事件触发webhooks。</li>
<li>Node Lambda,用于在本地运行Node.js应用并将其部署到Amazon Lambda的命令行工具。</li>
</ul>
<h2 id="72-serverless安全">7.2 Serverless安全</h2>
<p>Protego和Threat Stack都是提供Serverless安全方案的商业公司。</p>
<h2 id="73-serverless框架">7.3 Serverless框架</h2>
<p>Serverless框架</p>
<ul>
<li>Dapr,一种可移植的、事件驱动的、无服务器运行时,用于构建跨云和边缘的分布式应用程序,支持多种语言,可重点关注。</li>
<li>Spring Cloud Function,提供一个通用的模型,用于在各种平台上部署基于Function的软件。</li>
<li>Serverless Framework,基于Nodejs的命令行工具,使用AWS Lambda,Azure Functions,Google CloudFunctions等云产品构建无服务器架构的Web,移动和IoT应用。</li>
<li>Flogo,一个基于Go的超轻量级开源生态系统,用于构建事件驱动的应用。</li>
<li>Apex,使构建、部署和管理AWS Lambda功能更容易。</li>
<li>AWS Serverless Application Model (SAM),构建Serverless的框架,只能用于AWS。</li>
<li>Chalice,Python Serverless框架,只能用于AWS。</li>
<li>ClaudisJS,部署Node.js项目到AWS Lambda。</li>
</ul>
<h2 id="74-serverless托管平台">7.4 Serverless托管平台</h2>
<p>云厂商的Serverless托管平台,不做介绍了。</p>
<h2 id="75-serverless可安装平台">7.5 Serverless可安装平台</h2>
<p>先重点介绍下Knative,基于Kubernetes的Serverless解决方案,旨在标准化Serverless,简化其学习成本。Knative包含三个主要子项目:</p>
<ul>
<li>Serving 提供缩容至零、请求驱动的计算功能。它本质上是无服务器平台的执行和扩展组件。</li>
<li>Build 提供显式"运行至完成"功能,这对创建 CI/CD 工作流程很有用。Serving 使用它将源存储库转换为包含应用程序的容器镜像。(官方已经停止维护,建议切换到Tekton Pipelines)</li>
<li>Eventing 提供抽象的交付和订阅机制,允许构建松散耦合和事件驱动的无服务器应用程序。</li>
</ul>
<p>其他Serverless可安装平台,现在是百花齐放,只介绍几个代表性的平台:</p>
<ul>
<li>OpenFaaS,使开发人员可以轻松地将事件驱动的函数和微服务部署到Kubernetes,而无需重复编码。可以将您的代码或现有二进制文件打包到Docker镜像。</li>
<li>OpenWhisk,一个健壮的、可扩展的FaaS平台,支持数千并发触发器和调用。</li>
<li>Camel K,一个轻量级集成框架,可以直接在k8s与Knative上运行Camel。<br>
Camel是一个基于Enterprise Integration Pattern(企业整合模式,简称EIP)的开源框架。EIP定义了一些不同应用系统之间的消息传输模型,包括常见的Point-to-Point,Pub/Sub模型。</li>
</ul>
<h1 id="8云服务商special">8.云服务商(Special)</h1>
<p>云服务商包括141家认证服务商和40家认证培训伙伴。</p>
<h1 id="9cncf成员">9.CNCF成员</h1>
<p>CNCF成员(Members)由白金、金、银三级成员和最终用户支持者、非营利组织、学术机构组成。<br>
比较有意思的是不公开的机构支持者用动物图标表示。</p>
<p>参考资料:<br>
<a href="https://landscape.cncf.io/">CNCF全景图</a><br>
<a href="https://www.jianshu.com/p/1e82c317aeb3">关于 Kubernetes的33个 安全工具</a></p>
]]></content>
<category scheme="https://wangyu.space/categories/%E6%9E%B6%E6%9E%84/" term="架构" label="架构" />
<category scheme="https://wangyu.space/categories/%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84/" term="技术架构" label="技术架构" />
<category scheme="https://wangyu.space/tags/%E4%BA%91%E5%8E%9F%E7%94%9F/" term="云原生" label="云原生" />
<category scheme="https://wangyu.space/tags/cncf/" term="CNCF" label="CNCF" />
</entry>
<entry>
<title type="text">交付项目实施方法论</title>
<link rel="alternate" type="text/html" href="https://wangyu.space/posts/pm-methodology/" />
<id>https://wangyu.space/posts/pm-methodology/</id>
<updated>2020-11-26T18:12:09+08:00</updated>
<published>2020-04-02T17:05:58+08:00</published>
<author>
<name>scott-wong/王宇</name>
<uri>https://scott-wong.ga</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights>
<summary type="html"><![CDATA[最近看CGAF体会是各个体系架构都是互相借鉴融合发展的,这些年做了很多项目,根据经验也通过融合+裁剪总结出一套项目实施方……]]></summary>
<content type="html"><![CDATA[<p>最近看CGAF体会是各个体系架构都是互相借鉴融合发展的,这些年做了很多项目,根据经验也通过融合+裁剪总结出一套项目实施方法论,适用性如何还请各位看官品评。</p>
<p>敏捷项目管理+BPMN+C4模型(七种图)+UML(用例图、状态图、时序图、类图、活动图、E-R图)。</p>
<h3 id="uml使用场景基于java开发手册修改">UML使用场景(基于《Java开发手册》修改):</h3>
<ul>
<li>用例图<br>
【强制】在需求分析阶段,如果与系统交互的 User 超过一类并且相关的 User Case 超过 5 个,使用用例图来表达更加清晰的结构化需求。</li>
<li>状态图<br>
【强制】如果某个业务对象的状态超过 3 个,使用状态图来表达并且明确状态变化的各个触
发条件。</li>
<li>时序图(可用C4动态图替代)<br>
【强制】如果系统中某个功能的调用链路上的涉及对象超过 3 个,使用UML时序图/C4动态图来表达并且明确各调用环节的输入与输出。</li>
<li>类图<br>
【强制】如果系统中模型类超过 5 个,并且存在复杂的依赖关系,使用UML类图来表达并且明确类之间的关系。</li>
<li>活动图(可用BPMN流程图替代)<br>
【强制】如果系统中超过 2 个对象之间存在协作关系,并且需要表示复杂的处理流程,使用UML活动图/BPMN流程图来表示。</li>
</ul>
<h3 id="入门">入门</h3>
<p>快速熟悉<a href="https://c4model.com/">C4模型</a></p>
]]></content>
<category scheme="https://wangyu.space/categories/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/" term="项目管理" label="项目管理" />
<category scheme="https://wangyu.space/tags/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/" term="项目管理" label="项目管理" />
</entry>
<entry>
<title type="text">企业架构系列:开发规范</title>
<link rel="alternate" type="text/html" href="https://wangyu.space/posts/dev_guideline/" />
<id>https://wangyu.space/posts/dev_guideline/</id>
<updated>2020-11-26T18:12:09+08:00</updated>
<published>2020-04-01T09:38:36+08:00</published>
<author>
<name>scott-wong/王宇</name>
<uri>https://scott-wong.ga</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights>
<summary type="html"><![CDATA[企业架构系列:开发规范 版本号 【强制】版本号遵循 SemVer 2 标准 语义化版本 2.0.0 版本格式:主版本号.次版本号.修订号,版本号递增规则如……]]></summary>
<content type="html"><![CDATA[<h1 id="企业架构系列开发规范">企业架构系列:开发规范</h1>
<h2 id="版本号">版本号</h2>
<p>【强制】版本号遵循 <a href="https://semver.org/">SemVer 2 标准</a></p>
<p><strong>语义化版本 2.0.0</strong><br>
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:</p>
<ul>
<li>主版本号:当你做了不兼容的 API 修改,</li>
<li>次版本号:当你做了向下兼容的功能性新增,</li>
<li>修订号:当你做了向下兼容的问题修正。</li>
</ul>
<p>先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。</p>
<h2 id="文档格式">文档格式</h2>
<p>【推荐】Markdown格式<br>
tips:
md转word</p>
<ul>
<li>使用VSCode的Markdown预览,直接复制到Word里,保持格式。</li>
<li><a href="http://www.writage.com">writage插件</a></li>
</ul>
<h2 id="架构设计规范">架构设计规范</h2>
<h3 id="togaf">TOGAF</h3>
<h2 id="后端开发规范">后端开发规范</h2>
<h3 id="java">Java</h3>
<p>【强制】<a href="https://developer.aliyun.com/special/tech-java">《Java开发手册》</a>,当前最新版1.5.0<br>
【强制】IDEA插件<a href="https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines">Alibaba Java Coding Guidelines</a></p>
<h2 id="前端开发规范">前端开发规范</h2>
<h3 id="vue">Vue</h3>
<p><a href="https://www.jianshu.com/p/8b095857f73e">Vue前端开发规范</a></p>
<h2 id="数据传输规范">数据传输规范</h2>
<h3 id="日期时间字段">日期时间字段</h3>
<p>使用ISO 8601-1:2019规范中的扩展格式,如日期时间组合的格式为</p>
<pre><code>2020-04-01T09:38:36+08:00
</code></pre>]]></content>
<category scheme="https://wangyu.space/categories/%E6%9E%B6%E6%9E%84/" term="架构" label="架构" />
<category scheme="https://wangyu.space/categories/%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84/" term="技术架构" label="技术架构" />
<category scheme="https://wangyu.space/tags/%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/" term="开发规范" label="开发规范" />
</entry>
<entry>
<title type="text">企业架构系列:业务架构</title>
<link rel="alternate" type="text/html" href="https://wangyu.space/posts/ea-ba/" />
<id>https://wangyu.space/posts/ea-ba/</id>
<updated>2020-11-26T18:12:09+08:00</updated>
<published>2020-03-27T10:05:10+08:00</published>
<author>
<name>scott-wong/王宇</name>
<uri>https://scott-wong.ga</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights><summary type="html"><![CDATA[CGAF包括业务架构、数据架构、应用架构、技术及基础设施架构、安全架构。 working...]]></summary>
<content type="html"><![CDATA[<p>CGAF包括业务架构、数据架构、应用架构、技术及基础设施架构、安全架构。
working...</p>
]]></content>
<category scheme="https://wangyu.space/categories/%E6%9E%B6%E6%9E%84/" term="架构" label="架构" />
<category scheme="https://wangyu.space/categories/%E4%B8%9A%E5%8A%A1%E6%9E%B6%E6%9E%84/" term="业务架构" label="业务架构" />
</entry>
<entry>
<title type="text">企业架构系列:云原生基础设施选型</title>
<link rel="alternate" type="text/html" href="https://wangyu.space/posts/cloud-native-selection/" />
<id>https://wangyu.space/posts/cloud-native-selection/</id>
<updated>2020-11-26T18:12:09+08:00</updated>
<published>2020-03-25T09:56:21+08:00</published>
<author>
<name>scott-wong/王宇</name>
<uri>https://scott-wong.ga</uri>
<email>[email protected]</email>
</author>
<rights>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</rights>
<summary type="html"><![CDATA[企业架构系列:云原生基础设施选型 为了降低企业IT综合成本,企业全面上云已是大势所趋,但是上云路径多种多样,尽管公有云优势……]]></summary>
<content type="html"><![CDATA[<h1 id="企业架构系列云原生基础设施选型">企业架构系列:云原生基础设施选型</h1>
<p>为了降低企业IT综合成本,企业全面上云已是大势所趋,但是上云路径多种多样,尽管公有云优势明显,但因监管需要、数据安全等因素,大公司很多仍倾向自建私有云或混合云,不希望被单一公有云捆绑。<br>
近年来云原生架构日趋成熟,常用的k8s+docker+devops工具即可搭建,但是在私有云上自建维护一套这样的云原生基础设施绝非易事,通常需要成立独立的团队维护。<br>
本文基于作者多年跨行业项目实践经验和数月来的研究提出云原生基础设施的选型建议,主要面向有私有云部署需求的公司,小公司建议直接上公有云。<br>
毕竟每家公司的组织结构和业务技术需求千差万别,文中的选型也没法做到面面俱到,如有疏漏和错误,敬请指正。</p>
<hr>
<h2 id="什么是云原生">什么是云原生</h2>
<p>CNCF云原生定义:<br>
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。<br>
<img src="/images/cloudnative.png" alt="云原生定义"></p>
<h2 id="云原生生态图">云原生生态图</h2>
<p>从全局视角了解云原生生态可以直接看<a href="https://landscape.cncf.io/">CNCF全景图</a>,截止2020年4月27日已有1,382个图标。包含应用定义与开发层(App Definition and Development)、编排与治理层(Orchestration Management)、运行时层(Runtime)、供应保障层(Provisioning)、云服务商(Special)、平台(Platform)、观察与分析(Observability and Analysis)、无服务(Serverless)和CNCF成员(Members)八个层次。<br>
<img src="/images/cncf-landscope.png" alt="CNCF全景图">
作者并没有全面研究每个层级,下面仅列出日常用到的产品或工具,下篇文章计划按全景图的层级划分重新梳理选型。</p>
<h2 id="1-选型清单">1. 选型清单</h2>
<ul>
<li>企业架构设计:TOGAF + <a href="https://c4model.com/">C4模型</a></li>
<li>敏捷项目管理工具&知识共享:<a href="https://www.tapd.cn/">TAPD</a></li>
<li>容器管理平台:<a href="https://kubesphere.com.cn/">Kubesphere</a></li>
<li>镜像仓库&镜像安全:Harbor + Clair</li>
<li>代码管理工具&代码评审:Gitlab</li>
<li>CI/CD工具:Kubesphere集成的Jenkins流水线</li>
<li>代码质量扫描工具:Kubesphere集成的SonarQube</li>
<li>应用定义工具:Kubesphere集成的Helm</li>
<li>APM&调用链追踪:SkyWalking</li>
</ul>
<h2 id="2-具体选型逻辑">2. 具体选型逻辑</h2>
<h3 id="21-企业架构设计togaf--c4模型httpsc4modelcom">2.1 企业架构设计:TOGAF + <a href="https://c4model.com/">C4模型</a></h3>
<p><strong>TOGAF</strong><br>
关于企业架构(EA)设计业界主要有美国联邦政府体系架构框架FEA(F)、美国国防部体系架构框架(DoDAF)和开放组织体系架构框架(TOGAF),目前各个框架在发展过程中都在互相借鉴。针对企业市场TOGAF更加适合而且适合按需裁剪。另外电子政务从业者建议看下《电子政务顶层设计理论、方法与实践》这本书,该书作者结合TOGAF等框架和中国电子政务特色提出了CGAF框架。
TOGAF的核心是架构开发方法ADM,计划独立成文描述TOGAF在敏捷项目交付的实践。<br>
<img src="/images/togaf-adm.png" alt="ADM开发方法"><br>
<strong>C4模型</strong><br>
工作中经常会与业务和技术人员沟通架构设计,发现每个人画出来的架构图都不同,尤其在敏捷开发盛行的当下,架构文档在大幅缩减,很多人已经弃用UML。最近发现C4模型能很好的描述软件架构,而且容易上手易于理解。
C4模型是Simon Brown创建,目前欧美用的比较多,国内相关使用案例找到的不多。但是作者认为可以在项目团队中广泛使用。<br>
C4 代表上下文(Context)、容器(Container)、组件(Component)和代码(Code)——一系列分层的图表,可以用这些图表来描述不同缩放级别的软件架构,每种图表都适用于不同的受众。可以将其视为代码的地图。
C4包含四种核心图和三种附加图:</p>
<ul>
<li>系统上下文图(System Context diagram)</li>
<li>容器图(Container diagram)</li>
<li>组件图(Component diagram)</li>
<li>代码图(Code diagram), 使用UML类图、实体关系图等,通常不需要画,IDE生成即可</li>
<li>系统全景图(System Landscape diagram)</li>
<li>动态图(Dynamic diagram), 类似UML通讯图,可让初级开发人员在写代码前画出来评估,避免后期才发现错误</li>
<li>部署图(Deployment diagram), 可用于开发与运维沟通
详细内容可访问C4模型官网,介绍的很清楚,具体画图可用我基于RicardoNiepel/C4-PlantUML优化的<a href="https://github.com/scott-wong/C4-PlantUML">C4-PlantUML</a>或者使用draw.io+<a href="https://tobiashochguertel.github.io/c4-draw.io/c4.js">C4插件</a>.<br>
<img src="/images/c4-overview.png" alt="C4模型概览"></li>
</ul>
<h3 id="22-敏捷项目管理工具tapdhttpswwwtapdcn">2.2 敏捷项目管理工具:<a href="https://www.tapd.cn/">TAPD</a></h3>
<p>备选:有独立部署需求选<a href="https://www.zentao.net/">禅道</a><br>
TAPD的优势</p>
<ul>
<li>提供轻量协作、敏捷研发完整支持</li>
<li>跨端支持,集成企业微信</li>
<li>文档和Wiki可用于知识共享
企业版有DevOps功能,这个禅道开源版有提供,可按需选择。</li>
</ul>
<h3 id="23-容器管理平台kubespherehttpskubespherecomcn">2.3 容器管理平台<a href="https://kubesphere.com.cn/">Kubesphere</a></h3>
<p>备选:Rancher<br>
Kubesphere和Rancher都是开源产品,Rancher相对成熟些,案例比较多,不过Kubesphere相比Rancher提供了针对开发人员更友好的界面操作并深度集成Jenkins、SonarQube等CI/CD工具,同时提供统一日志、统一监控告警等功能。
当前版本2.1.1已生产可用,据说光大银行在测试Kubesphere。
Kubesphere优势</p>
<ul>
<li>通过Helm快速部署mysql、redis等应用</li>
<li>集成应用商店openpitrix,可上传自有应用</li>
<li>统一日志、统一监控告警</li>
</ul>
<h3 id="24-代码管理工具代码评审gitlab">2.4 代码管理工具&代码评审:Gitlab</h3>
<p>备选:Gitee, Github<br>
代码管理没多少选择,自建Gitlab开源版提供的功能够用了。
代码审查还有Gerrit可选,不过Gitlab也能通过merge request进行代码评审,而且更符合开发人员习惯。</p>
<h3 id="25-cicd工具kubesphere集成的jenkinssonarqube流水线">2.5 CI/CD工具:Kubesphere集成的Jenkins+SonarQube流水线</h3>
<p>在代码目录配置Jenkinsfile,通过Kubesphere实现自动拉取代码并构建maven, nodejs等项目工程,代码质量扫描,自动构建成Docker镜像并发布到指定k8s集群中。
典型Java项目的Jenkinsfile如下:</p>
<pre><code>pipeline {
agent {
node {
label 'maven'
}
}
parameters {
string(name:'TAG_NAME',defaultValue: '',description:'')
}
environment {
// app label
PROJECT = 'ry'
NAMESPACE = 'cargo-dev'
// 服务唯一标识
APP_NAME = 'ruoyi-api'
// 项目git地址,用于push with tag
GIT_URL = 'gitee.com/scott-wong/RuoYi-Vue.git'
// 以下是devops公共配置
// 镜像密钥,官方dockerhub-cr,阿里云aliyun-cr
DOCKER_SECRETS = 'aliyun-cr'
GIT_CREDENTIAL_ID = 'gitee-id'
KUBECONFIG_CREDENTIAL_ID = 'cargo-kubeconfig'
// 阿里云镜像用aliyun-id
DOCKER_CREDENTIAL_ID = 'aliyun-id'
// 阿里云registry.cn-hangzhou.aliyuncs.com
REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
// 阿里云scottwong
DOCKERHUB_NAMESPACE = 'scottwong'
// 代码检测
SONAR_CREDENTIAL_ID= 'sonar-token'
}
stages {
stage ('checkout scm') {
steps {
checkout(scm)
}
}
stage ('unit test') {
steps {
container ('maven') {
sh 'cd ruoyi && mvn clean test'
}
}
}
stage('sonarqube analysis') {
steps {
container ('maven') {
withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
withSonarQubeEnv('sonar') {
sh "cd ruoyi && mvn sonar:sonar -Dsonar.java.binaries=target/classes -Dsonar.branch=$BRANCH_NAME -Dsonar.login=$SONAR_TOKEN"
}
}
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}
}
stage ('build & push') {
steps {
container ('maven') {
sh 'cd ruoyi && mvn -Dmaven.test.skip=true clean package'
sh 'cd ruoyi && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
}
}
}
}
stage('push latest'){
when{
branch 'master'
}
steps{
container ('maven') {
sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
}
}
}
stage('deploy to dev') {
when{
branch 'master'
}
steps {
input(id: 'deploy-to-dev', message: 'deploy to dev?')