‘壹’ ApkTool可以成功反编译APK,但是回编译总是失败
打开要编译文件夹目录下的 apktool.yml,修改apkFileName参数为 非中文,问题可以解决
‘贰’ 瓒呰秺XML鍜孞SON锛歒AML锛孞ava寮鍙戜汉锻樼殑鏂伴夋嫨
銆銆 涓筼ava寮鍙戣呭筜AML鏂囦欢镙煎纺锅氢竴涓楂樼骇浠嬬粛 镓惧嚭瀹冧笌XML鍜孞SON镄勪笉钖屼箣澶 骞舵楠屽畠镄勪紭瓒婃у拰缂洪櫡
銆銆镓链夊姩镐佽瑷锛埚俣uby Groovy python绛夛级鍙婂叾鐩稿叧镄勬嗘灦锛埚俣uby on rails锛夌栌瀹朵簤楦 灏界¢槄璇绘湰鏂囩殑澶ч儴鍒呙ava寮鍙戣呮疮澶╃殑澶у氭暟宸ヤ綔閮芥槸澶勭悊绾绮圭殑java 涓旀湭𨱒ュ氩勾閮藉皢濡傛 浣呜繖骞朵笉镒忓懗镌浠栦滑涓嶈兘瀛︿範鏂扮殑鐭ヨ瘑 鍦ㄤ粬浠镄勫叺鍣ㄥ簱涓娣诲姞鏂扮殑鍏靛櫒 链鏂囦粙缁峐AML锛圷AML涓嶆槸镙囱拌瑷镄勭亩鍐欙级鏂囦欢镙煎纺锛堜娇鐢≧uby on rails妗嗘灦杩涜岃茶В 锲犱负瀹冩墍链夌殑閰岖疆鏂囦欢閮芥槸浣跨敤镄刌AML锛変互鍙婂畠涓岭ML鍜孞SON镄勫尯鍒 链钖庤ㄨ轰简YAML镄勪紭锷垮拰缂虹偣
銆銆 绌烘牸缂╄繘鍜孞SON阃夐”
銆銆YAML鏂囦欢镙煎纺涓昏侀泦涓浜庣┖镙肩缉杩涚殑姒傚康 瀹幂敤浜庢寚鍑烘暟鎹镄勫眰娆$粨鏋 钬 钥屼笉鏄浣跨敤XML宓屽楁爣璁版垨JSON镄勫ぇ𨰾鍙凤纸{}锛夊拰鏂规嫭鍙凤纸[]锛 瀹为檯涓 瀹冩槸JSON镄勪竴涓瓒呴泦 锲犳 鍦ㄤ娇鐢ㄧ殑镞跺 浣犲彲鑳介渶瑕侀噰鐢↗SON椋庢牸镄勮娉曟潵璺冲嚭绌烘牸娴 瀹幂殑鍒涘嬩汉灏嗗叾褰㈠逛负 涓烘墍链夌紪绋嬭瑷鎻愪緵浜烘у寲镄勬暟鎹搴忓垪鍖栨爣鍑 浠ユ垜镄勭粡楠屾潵鐪 鍏堕吨镣规槸浜烘у寲 涓嬮溃鏄涓涓浣跨敤绌烘牸缂╄繘镄刌AML镙蜂緥 鍒涘缓YAML鏂囦欢镞朵笉瀹滀娇鐢ㄥ浐瀹氩藉害瀛椾綋 锲犱负绌烘牸鏄寰埚叧阌镄 锛埚弬钥冧晶杈规爮 YAML鍜屾爣绛
銆銆JFrame: defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame width: height: ponents: JTextArea: name: textArea text: | This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that JButton: name: button text: Button
銆銆 渚ц竟镙 YAML鍜屾爣绛 锘轰簬绌烘牸缂╄繘镄勪换涓鏂囦欢镙煎纺链甯歌佺殑闂棰树箣涓鏄濡备綍瑙i喷镙囩 鍦ㄨ繖涓猋AML渚嫔瓙涓 绛旀堢浉褰撶亩鍗 瀹冧笉鏀鎸佹爣绛 浣跨敤镙囩惧瓧绗︾缉杩涗唬镟跨┖镙煎皢浼氩艰嚧澶勭悊寮傚父
銆銆闅忎綘锽沧 浣犲彲浠ュ湪浠讳綍鑺傜偣浣跨敤JSON椋庢牸璇娉曟垨娣峰悎璇娉 渚嫔 涓婇溃镄勪緥瀛愬彲鏀逛负
銆銆JFrame: defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame width: height: ponents: JTextArea: name: textArea text: | This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that JButton: {name: button text: Button } #JSON椋庢牸璇娉
銆銆鍦ㄥ簳灞傝妭镣癸纸鍗冲畠浠娌℃湁瀛愯妭镣 姝e备綘鐚沧祴镄勯偅镙 浜曞彿阌鍦╕AML涓鏄鐢ㄦ潵娉ㄩ喷镄勶级鍒囨崲浣跨敤JSON椋庢牸璇娉曟樉寰楃壒鍒链夌敤
銆銆 YAML缁撴瀯缁勪欢
銆銆鍓嶉溃宸茬粡鐪嬩简涓涓绠鍗旷殑YAML渚嫔瓙 涓嬮溃璁╂垜浠涓璧锋潵浜呜В涓涓媃AML镄勭粨鏋 hash list 鍜宐lock literal
銆銆 hash锛堟暎鍒楋级
銆銆阃氲繃缂╄繘瀛愭靛拰鍦ㄥ叧阌瀛椾笌鍊间箣闂翠娇鐢ㄥ啋鍙凤纸:锛夋潵鍒嗗壊瀹炵幇hash镄勫垱寤 濡
銆銆JFrame: defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame width: height:
銆銆杩樻湁涓绉嶆柟娉曞氨鏄浣跨敤涓嶫SON鍏煎圭殑澶ф嫭鍙疯娉曪纸{}锛夎娉 姣忎竴瀵瑰叧阌瀛/鍊间娇鐢ㄩ楀彿锛 锛夊垎鍓 濡
銆銆JFrame: {defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame
銆銆width: height: }
銆銆 list锛堟竻鍗曪级
銆銆阃氲繃鍦ㄦ疮涓猯ist鍏幂礌鍓嶆斁涓涓鍑忓彿锛 锛夋潵鍒涘缓list 涓庣┖镙肩缉杩涗竴璧锋瀯鎴愪简YAML镄勫熀鐭
銆銆ponents: JTextArea Jbutton
銆銆杩樻湁涓绉嶆柟娉曞氨鏄浣跨敤JSON鍏煎圭殑鏂规嫭鍙凤纸[]锛夎娉 濡
銆銆ponents: [JTextArea JButton]
銆銆 block literal锛堟枃瀛楀潡锛
銆銆杩欐槸YAML镄勪寒镣 鐗瑰埆鏄涓岭ML鐩告瘆 瀹幂殑CDATA鏄惧缑鐩稿綋绠闄 block literal鍙浠ュ皢澶у潡鏂囨湰缁呜嚧鍦版彃鍏ユ枃浠朵腑 浣犲彲浠ヤ娇鐢ㄧ珫绾匡纸|锛夋寚浠ゅ湪浣犵殑鏂囨湰涓淇濈暀鏂拌 濡
銆銆text: | This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that
銆銆YAML缂栬疟鍣ㄥ皢浼氢粠绗涓琛岀殑绗涓涓鏂囨湰瀛楃﹀紑濮嬬紪璇戯纸骞朵涪鎺夋墍链夌殑缂╄繘绌烘牸锛 浣嗘槸浼氩湪浣犵殑鏂囨湰涓淇濈暀鏂拌
銆銆鍙﹀ 浣犺缮鍙浠ヤ娇鐢ㄥぇ浜庣﹀彿锛>锛夊憡璇塝AML缂栬疟鍣ㄧ粰镓链夋柊琛屽姞涓婃浔绾 骞跺皢杈揿叆镄勬枃链浣滀负涓涓闀胯屽勭悊
銆銆text: > This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that
銆銆闄や简杩欎袱涓鎸囦护涔嫔 浣犺缮鍙浠ヤ娇鐢ㄧ珫绾垮拰锷犲彿锛坾+锛 瀹幂粰浣崭簬鍓嶉溃镄勭┖镙煎姞涓婃浔绾 淇濈暀鏂拌屽拰链灏剧殑绌烘牸 杩桦彲浠ヤ娇鐢ㄥぇ浜庡彿鍜屽噺鍙凤纸> 锛 瀹幂粰镓链夌殑绌烘牸锷犱笂𨱒$汗
銆銆 YAML VS XML鍜孞SON
銆銆姝e备綘浠庡墠闱渚嫔瓙涓娓呮氩湴鐪嫔埌闾f牱 YAML娌℃湁XML闾d箞鍟板棪浜 澶ч儴鍒哬AML鏂囦欢鍐呭瑰氨鏄鐪熷疄镄勬暟鎹 娌℃湁浜嗘棤绌峰敖镄勬墦寮鍜屽叧闂镙囱板垪琛 鍦╔ML涓 杩欎簺镙囱板线寰姣斿畠浠鎻忚堪镄勬暟鎹杩桦ぇ YAML镟撮傚悎浣犻渶瑕佹坠宸ョ淮鎶ょ殑鏁版嵁鏂囦欢绫诲瀷
銆銆YAML娌℃湁鎻愪緵鏂规堟垨DTD姒傚康 锲犳ゆ棤娉曢獙璇佹枃浠舵牸寮忔槸钖︾﹀悎浣犵殑棰勬湡 XML镄勫暟鍡︿篃链夊畠镄勪环鍊 浣嗘荤殑璇存潵鏄锲犱负XML镄勬垚镡熶娇瀹冨叿链夊ぇ閲忛濆栫殑宸ュ叿𨱒ラ獙璇佸畠镄勬牸寮 钥孻AML杩樻病链
銆銆JSON涔熼傚悎涓庝换浣曟暟鎹 瀹冧富瑕侀溃钖戞彁楂樻ц兘鍜屾枃浠跺昂瀵哥殑澶у皬 锲犱负瀹冨嚑涔庝笉浣跨敤绌烘牸鍜屽叧闂镙囩 铹惰 JSON鏂囦欢镄勫唴瀹瑰炲姞浜嗗嶆潅镐 瀹幂殑鍏抽棴镙囱瘑灏辫薄涓嫔湴镫变竴镙 杩椤氨鏄疛avaFx浠g爜锛埚畠锘轰簬JSON锛変腑鍙瑙佺殑链䦅涜嫤镄勪简 鍦ㄦ暟鎹鏂囦欢涓 浣跨敤UI缁撴瀯浣跨粨鏋沧洿澶嶆潅 鍏跺嶆潅绋嫔害鍑犱箮浣挎枃浠跺彉寰楁棤娉旷悊瑙
銆銆镆ョ湅镄凧avaFx绀轰緥浠g爜锛堢偣鍑 Edit this page 阈炬帴锛 璇风壒鍒鐣椤绩瀹冩槸濡备綍缁撴潫镄
銆銆
銆銆} } } } ] } } center: bookPanel }
銆銆鎺哄拰浜唟}缁撴瀯鍜孾]娓呭崟 浣垮缑镓嫔伐缁存姢澶у瀷镄凧SON椋庢牸镄勬枃浠跺彉寰楃浉褰揿汹闅 YAML浣跨敤瀹幂殑绌烘牸缂╄繘鏂规硶宸у椤湴瑙e喅浜呜繖涓闂棰 褰撶劧 镞犺轰綍镞 浣犻兘鍙浠ュ垏鎹㈠埌JSON椋庢牸镄勮娉曪纸濡傚湪搴曞眰鑺傜偣锛
銆銆瑙f瀽YAML鏂囦欢链甯哥敤镄凧ava搴撴槸JvYAML锛堬级 JRuby锛埚湪Java VM涓婅繍琛屽姩镐佽瑷镄凴uby鐗堟湰锛夊湪瀹幂殑Ruby on Rails妗嗘灦涓镄勮繘鍑哄彛浣跨敤JvYAML JvYAML鎻愪緵浜嗘枃浠朵竴鑸澶勭悊镄勫姛鑳斤纸鍦ㄥ墠闱㈤偅涓渚嫔瓙涓 瀹冭繑锲炰简涓涓镙囧嗳Java瀛楃︿覆 Long Map鍜孡ist瀵硅薄镄勫祵濂椾綋绯荤粨鏋勶级 浣跨敤闱欐乨ump()鏂规硶淇濆瓨涓烘枃浠 铹跺悗浣跨敤闱欐乴oad()鏂规硶杞藉叆 渚嫔
銆銆
銆銆YAML mp(Object data Writer output); Object data = YAML load(Reader io);
銆銆鍙傝冧晶杈规爮 锘轰簬YAML镄勫紑婧愰”鐩浜呜В鍏充簬锘轰簬YAML镄勫紑婧愰”鐩淇℃伅 浠ュ强濡备綍鍦↗ava涓瑁呭叆涓涓璇存槑镄刄I
銆銆 渚ц竟镙 锘轰簬YAML镄勫紑婧愰”鐩 璇峰师璋呮垜鍦ㄨ繖閲屽帤鑴哥毊鍦颁粙缁嶆垜浠镊宸辩殑寮婧愰”鐩 褰撴垜鐪熺殑涓岖煡阆挞櫎浜呙Ruby澶栧叾浠栫殑锘轰簬YAML镄勫紑婧愰”鐩 JRuby镄凴uby on Rails妗嗘灦瀹炵幇涓ラ吨渚濊禆YAML 钥屼笉鏄疿ML鎴朖SON 鐪嬬湅鎴戠殑Java Builder搴揿惂锛堬级 瀹冨埄鐢╕AML鏂囦欢鎻愪緵浜嗕竴绉嶆柟娉曞畾涔夊睆骞曟带鍒 甯冨眬 浜嬩欢绾胯矾鍜屾暟鎹缁戝畾 浠ュ疄鐜板皢璇存槑UI瑁呭叆Java
銆銆瀹为檯涓 YAML鏂囦欢鐪熺殑闱炲父绠鍗 鐢氲呖浣犲彲浠ヤ娇鐢ㄤ换浣旷殑鏂囨湰缂栬緫鍣ㄩ兘鍙浠ョ淮鎶ゅ畠 浣嗘湁浜涗笓闂ㄧ殑鏂囨湰缂栬緫鍣ㄦ彁渚涗简璇娉曞姞浜锷熻兘 杩椤圭淮鎶ゅ伐浣滃緢链夊府锷 瀵笶clipse钥岃█ 链塃clipse YAML editor锛堬级 瀵筃etBeans钥岃█ 浣犲彲浠ヤ娇鐢ㄦ潵镊猂uby鍖咃纸锛夌殑YAML缂栬緫鍣 铹惰 鍦∟etBeans 涓镄刌AML缂栬緫鍣ㄥ苟娌℃湁浠涔堢敤澶 瀹冨彧鏀鎸乊AML寰埚皬镄勪竴涓瀛愰泦锛堜緥濡 瀹冧笉鏀鎸乥lock literal锛 甯屾湜鍦∟etBeans 涓镄刌AML缂栬緫鍣ㄨВ鍐充简杩欎釜闂棰
銆銆鎴戞病链夋満浼氭祴璇旾ntelliJ IDEA 浣嗘垜鎺ㄦ祴瀹幂殑Ruby on Rails鎻掍欢锛+IDEA+Ruby+Plugin锛夐梼甯︿简YAML缂栬緫鍣
銆銆 娣诲姞YAML宸ュ叿
lishixin/Article/program/Java/JSP/201311/19416
‘叁’ 【实践】2.Prometheus命令和配置详解
Prometheus配置方式有两种:
(1)命令行,用来配置不可变命令参数,主要是Prometheus运行参数,比如数据存储位置
(2)配置文件,用来配置Prometheus应用参数,比如数据采集,报警对接
不重启进程配置生效方式也有两种:
(1)对进程发送信号SIGHUP
(2)HTTP POST请求,需要开启--web.enable-lifecycle选项curl -X POST http://192.168.66.112:9091/-/reload
配置文件格式是yaml格式,说明:
.yml或者.yaml 都是 yaml格式的文件,
yaml格式的好处: 和json交互比较容易
python/go/java/php 有yaml格式库,方便语言之间解析,并且这种格式存储的信息量很大。
命令行可用配置可通过prometheus -h来查看。
配置文件使用yml格式,配置文件中一级配置项如下,说明参考#备注内容。
配置文件中通用字段值格式
<boolean>: 布尔类型值为true和false
<scheme>: 协议方式包含http和https
原始配置文件内容:
全局默认的数据拉取间隔
全局默认的单次数据拉取超时,当报context deadline exceeded错误时需要在特定的job下配置该字段。
全局默认的规则(主要是报警规则)拉取间隔
该服务端在与其他系统对接所携带的标签
该字段配置与Alertmanager进行对接的配置
样例:
上面的配置中的 alert_relabel_configs 是指警报重新标记在发送到Alertmanager之前应用于警报。 它具有与目标重新标记相同的配置格式和操作,外部标签标记后应用警报重新标记,主要是针对集群配置。
这个设置的用途是确保具有不同外部label的HA对Prometheus服务端发送相同的警报信息。
Alertmanager 可以通过 static_configs 参数静态配置,也可以使用其中一种支持的服务发现机制动态发现,我们上面的配置是静态的单实例。
此外, relabel_configs 允许从发现的实体中选择 Alertmanager,并对使用的API路径提供高级修改,该路径通过 __alerts_path__ 标签公开。
完成以上配置后,重启Prometheus服务,用以加载生效,也可以使用热加载功能,使其配置生效。然后通过浏览器,访问 http://192.168.1.220:19090/alerts 就可以看 inactive pending firing 三个状态,没有警报信息是因为我们还没有配置警报规则 rules 。
这里定义和prometheus集成的alertmanager插件,用于监控报警。后续会单独进行alertmanger插件的配置、配置说明、报警媒介以及route路由规则记录。
此项配置和 scrape_configs 字段中 relabel_configs 配置一样,用于对需要报警的数据进行过滤后发向 Alertmanager
说明
relabel-configs的配置允许你选择你想抓取的目标和这些目标的标签是什么。所以说如果你想要抓取这种类型的服务器而不是那种,可以使用relabel_configs
相比之下,metric_relabel_configs是发生在抓取之后,但在数据被插入存储系统之前使用。因此如果有些你想过滤的指标,或者来自抓取本身的指标(比如来自/metrics页面)你就可以使用metric_relabel_configs来处理。
该项目主要用来配置不同的 alertmanagers 服务,以及Prometheus服务和他们的链接参数。 alertmanagers 服务可以静态配置也可以使用服务发现配置。Prometheus以pushing 的方式向alertmanager传递数据。
alertmanager 服务配置和target配置一样,可用字段如下
这个主要是用来设置告警规则,基于设定什么指标进行报警(类似触发器trigger)。这里设定好规则以后,prometheus会根据全局global设定的evaluation_interval参数进行扫描加载,规则改动后会自动加载。其报警媒介和route路由由alertmanager插件实现。
样例:
"first_rules.yml"样例:
Prometheus 支持两种类型的 Rules ,可以对其进行配置,然后定期进行运算:recording rules 记录规则 与 alerting rules 警报规则,规则文件的计算频率与警报规则计算频率一致,都是通过全局配置中的 evaluation_interval 定义。
不论是recording rules还是alerting rules都要在组里面。
要在Prometheus中使用Rules规则,就必须创建一个包含必要规则语句的文件,并让Prometheus通过Prometheus配置中的rule_files字段加载该文件,前面我们已经讲过了。 其实语法都一样,除了 recording rules 中的收集的指标名称 record: <string> 字段配置方式略有不同,其他都是一样的。
配置范例:
recording rules 是提前设置好一个比较花费大量时间运算或经常运算的表达式,其结果保存成一组新的时间序列数据。当需要查询的时候直接会返回已经计算好的结果,这样会比直接查询快,同时也减轻了PromQl的计算压力,同时对可视化查询的时候也很有用,可视化展示每次只需要刷新重复查询相同的表达式即可。
在配置的时候,除却 record: <string> 需要注意,其他的基本上是一样的,一个 groups 下可以包含多条规则 rules ,Recording 和 Rules 保存在 group 内,Group 中的规则以规则的配置时间间隔顺序运算,也就是全局中的 evaluation_interval 设置。
配置范例:
上面的规则其实就是根据 record 规则中的定义,Prometheus 会在后台完成 expr 中定义的 PromQL 表达式周期性运算,以 job 为维度使用 sum 聚合运算符 计算 函数rate 对http_requests_total 指标区间 10m 内的增长率,并且将计算结果保存到新的时间序列 job:http_requests_total:rate10m 中, 同时还可以通过 labels 为样本数据添加额外的自定义标签,但是要注意的是这个 lables 一定存在当前表达式 Metrics 中。
模板是在警报中使用时间序列标签和值展示的一种方法,可以用于警报规则中的注释(annotation)与标签(lable)。模板其实使用的go语言的标准模板语法,并公开一些包含时间序列标签和值的变量。这样查询的时候,更具有可读性,也可以执行其他PromQL查询 来向警报添加额外内容,ALertmanager Web UI中会根据标签值显示器警报信息。
{{ $lable.<lablename>}} 可以获取当前警报实例中的指定标签值
{{ $value }} 变量可以获取当前PromQL表达式的计算样本值。
调整好rules以后,我们可以使用 curl -XPOST http://localhost:9090/-/reload 或者 对Prometheus服务重启,让警报规则生效。
这个时候,我们可以把阈值调整为 50 来进行故障模拟操作,这时在去访问UI的时候,当持续1分钟满足警报条件,实际警报状态已转换为 Firing,可以在 Annotations中看到模板信息 summary 与 description 已经成功显示。
规则检查
拉取数据配置,在配置字段内可以配置拉取数据的对象(Targets),job以及实例
定义job名称,是一个拉取单元。每个job_name都会自动引入默认配置如
这些也可以在单独的job中自定义
服务端拉取过来的数据也会存在标签,配置文件中也会有标签,这样就可能发生冲突。
true就是以抓取数据中的标签为准
false就会重新命名抓取数据中的标签为“exported”形式,然后添加配置文件中的标签
切换抓取数据所用的协议
定义可选的url参数
每次抓取数据请求的认证信息
password和password_file互斥只可以选择其一
bearer_token和bearer_token_file互斥只可以选择其一
抓取ssl请求时证书配置
通过代理去主去数据
Prometheus支持多种服务现工具,详细配置这里不再展开
更多参考官网: https://prometheus.io/docs/prometheus/latest/configuratio n/configuration/
服务发现来获取抓取目标为动态配置,这个配置项目为静态配置,静态配置为典型的targets配置,在改配置字段可以直接添加标签
采集器所采集的数据都会带有label,当使用服务发现时,比如consul所携带的label如下:
这些lable是数据筛选与聚合计算的基础。
抓取数据很繁杂,尤其是通过服务发现添加的target。所以过滤就显得尤为重要,我们知道抓取数据就是抓取target的一些列metrics,Prometheus过滤是通过对标签操作操现的,在字段relabel_configs和metric_relabel_configs里面配置,两者的配置都需要relabel_config字段。该字段需要配置项如下
target配置示例
target中metric示例
target中metric示例
使用示例
由以上可知当使用服务发现consul会带入标签__meta_consul_dc,现在为了表示方便需要将该标签变为dc
需要做如下配置,这里面action使用的replacement
过滤采集target
为了防止Prometheus服务过载,使用该字段限制经过relabel之后的数据采集数量,超过该数字拉取的数据就会被忽略
Prometheus可以进行远程读/写数据。字段remote_read和remote_write
(1)Prometheus 配置详解
https://www.dazhuanlan.com/2019/12/12/5df11ada207ce/
(2)Prometheus配置文件prometheus.yml 四个模块详解
http://www.21yunwei.com/archives/7321
(3)官方文档说明
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
(4)Prometheus监控神器-Rules篇
https://zhuanlan.hu.com/p/179295676
(5)Prometheus监控神器-Alertmanager篇(1)
https://zhuanlan.hu.com/p/179292686
(6)Prometheus监控神器-Alertmanager篇(2)
https://zhuanlan.hu.com/p/179294441
‘肆’ 5大最新云原生镜像构建工具全解析,3个来自Google,你了解几个
在云原生时代,镜像构建和持续集成、安全紧密相连,为开发环境和生产环境的无缝协作提供了关键支撑。云原生技术的核心,即容器化和Kubernetes编排,旨在简化部署流程,确保环境一致性、稳定性和安全性。开发者如今追求的是无需Dockerfile的无缝构建,以满足环境共享、质量控制和企业对制品安全的高要求。
1. Google的KO工具
专为Golang开发者打造的KO,整合了Kubernetes的强大功能,只需一个命令即可完成镜像构建和部署。它支持K8s yaml,包括live server在内的开发体验优化,得益于基础镜像distroless的有力支持,使得环境一致性易于实现。
2. 简化与便利
KO支持go mole,通过镜像地址和二进制文件名构建,无需docker daemon,这让Java开发者也有了一站式的解决方案,如Jib,虽易用但未全面集成K8s。然而,这些工具在安全性和便利性间寻找平衡,如S2I(Red Hat的简化方案),尽管支持多种语言,但其复杂性要求用户具备一定的学习成本。
3. Kaniko与Makisu
谷歌的Kaniko是Dockerfile构建工具中的翘楚,无需docker daemon,支持多registry,利用本地缓存提升效率。而Uber的Makisu则强调优化,可直接加载到daemon,但存储在国外,对某些构建上下文支持有限。每个工具都有其优势和局限,选择取决于团队的技术栈和特定场景。
4. 选择与策略
团队在选择云原生镜像构建工具时,通常会倾向于容器化最佳实践,借助开源社区资源,同时关注定制需求和最终交付的高质量。比如,Kaniko适用于广泛场景,而Makisu在处理大型镜像优化方面表现卓越。
总结来说,Docker和Kubernetes的部署虽然相对直观,但选择哪种工具需考虑语言支持、团队需求以及安全性和效率之间的权衡。对于特定场景,如非Dockerfile构建或者对语言支持有特殊要求,S2I可能是一个选项,但可能需要额外的团队维护。而Kaniko和Makisu则提供了不同的选择,以适应不同的项目需求和团队策略。