這是假期讀的第二本書(shū)插掂,以下是對(duì)本書(shū)的閱讀的內(nèi)容的一些總結(jié):
就 Cloud native 這個(gè)詞來(lái)說(shuō)贝咙,已經(jīng)被市場(chǎng)人員到處在用了,就跟 Microservice 一樣,很難清晰地去定義到底什么是 Cloud native疏咐。在本書(shū)中,作者提到的 Cloud native 其實(shí)包含了兩個(gè)部分的內(nèi)容偿荷,一個(gè)是 Cloud native 的基礎(chǔ)設(shè)施(Cloud native infrastructure)檐春,另一個(gè)是 Cloud native 的應(yīng)用(Cloud native application)。作者對(duì)于 Cloud native infrastructure 的定義是:
Cloud native infrastructure is infrastructure that is hidden behind useful abstractions, controlled by APIs, managed by software, and has the purpose of running applications. Running infrastructure with these traits gives rise to a new pattern for managing that infrastructure in a scalable, efficient way.
所謂的 Cloud native 的基礎(chǔ)設(shè)施就是當(dāng)我們的基礎(chǔ)設(shè)施(大量的 VM/Docker肥惭,復(fù)雜的網(wǎng)絡(luò)盯仪,各種各樣的儲(chǔ)存等等)變的非常復(fù)雜和龐大的時(shí)候,通過(guò)人力是無(wú)法高效地進(jìn)行運(yùn)維的务豺,在這樣的大規(guī)模下磨总,我們應(yīng)該盡量地去避免人工介入,而是需要有一套軟件來(lái)幫助我們更好地去管理我們的基礎(chǔ)設(shè)施笼沥,可以讓運(yùn)行在這套基礎(chǔ)設(shè)施上 Cloud native 的應(yīng)用可以非常方便地被運(yùn)維蚪燕,部署,監(jiān)控等等奔浅。那么怎么去設(shè)計(jì)管理 Cloud native 的基礎(chǔ)設(shè)施的系統(tǒng)呢馆纳,作者提到了幾個(gè)點(diǎn),其中包括系統(tǒng)的自舉汹桦,API 的設(shè)計(jì)等等鲁驶,但是我覺(jué)得其中最重要的一點(diǎn)是 Reconciler Pattern,關(guān)于這個(gè) Pattern舞骆,書(shū)中提到了四個(gè)原則:
- Use a data structure for all inputs and outputs.
- Ensure that the data structure is immutable.
- Keep the resource map simple.
- Make the actual state match the expected state.
其中最后一點(diǎn)和 Reconciler Pattern 的關(guān)系最大钥弯,這個(gè)也是 Kubernetes 中的方式,我們往 Kubernetes 中去提交一個(gè) Spec督禽,比如要求一個(gè)應(yīng)用的實(shí)例的數(shù)量應(yīng)該是 4脆霎,那么 Kubernetes 就會(huì)盡可能地去保證這個(gè)應(yīng)用的實(shí)例的數(shù)量是 4,如果一個(gè)實(shí)例 Crash 了狈惫,它就馬上新起一個(gè)實(shí)例睛蛛。這就是所謂的 Reconciler Pattern,盡量讓實(shí)際的狀態(tài)可以和期望的狀態(tài)匹配上。
Reconciler Pattern 在設(shè)計(jì)上非常大的一個(gè)優(yōu)勢(shì)就是它是聲明式的忆肾,而不是反應(yīng)式的荸频。用戶(hù)要做的是按照系統(tǒng)提供出的 API,直接告訴系統(tǒng)你想要什么客冈,比如說(shuō)旭从,我想要一個(gè)應(yīng)用的實(shí)例的數(shù)量保持在 4 個(gè),系統(tǒng)就去考慮各種情況郊酒,讓你的應(yīng)用的數(shù)量保持在 4 個(gè)遇绞。而反應(yīng)式的話(huà),則是監(jiān)聽(tīng)系統(tǒng)的事件燎窘,比如你的應(yīng)用的某個(gè)實(shí)例 Crash 了摹闽,然后你監(jiān)聽(tīng)到了這個(gè)事件之后,就調(diào)用系統(tǒng)的 API 去新創(chuàng)建一個(gè)實(shí)例褐健。顯然付鹿,對(duì)于用戶(hù)來(lái)說(shuō),聲明式的方式要簡(jiǎn)單地很多蚜迅,不容易出錯(cuò)舵匾。而反應(yīng)式則要求每一個(gè)應(yīng)用都去監(jiān)聽(tīng)系統(tǒng)的事件,不但侵入到了應(yīng)用谁不,也很容易出錯(cuò)坐梯。
在上面的 Reconciler Pattern 的四個(gè)原則中,第二點(diǎn)讓數(shù)據(jù)結(jié)構(gòu)是不可變的這一點(diǎn)也是非常重要的刹帕,但是我不是很明白這個(gè)點(diǎn)和 Reconciler Pattern 具體的關(guān)系在哪里吵血?這個(gè)原則是說(shuō)如果我們要修改一個(gè)數(shù)據(jù)結(jié)構(gòu),我們實(shí)際上不是修改它偷溺,而是新建一個(gè)新的蹋辅,然后把原來(lái)的標(biāo)記成過(guò)期,這樣的好處是挫掏,我們可以保留數(shù)據(jù)結(jié)構(gòu)中間的各種版本侦另,當(dāng)需要看下當(dāng)前的 Infra 有哪些區(qū)別的,就可以把這些版本直接拿出來(lái)對(duì)比尉共,非常方便地就可以回答線(xiàn)上環(huán)境到底發(fā)生了什么樣的變更褒傅。
有了 Cloud native 的基礎(chǔ)設(shè)施,我們還要有 Cloud native 的應(yīng)用運(yùn)行在上面袄友,那么作為基礎(chǔ)設(shè)施樊卓,我們還應(yīng)該給應(yīng)用到底提供什么樣的能力呢,書(shū)中提到了八點(diǎn):
- Runtime and isolation(這里的 isolation 是指資源的 isolation杠河,比如 CPU,Memory,Storage 等等)
- Resource allocation and scheduling
- Environment isolation(這里的 isolation 指的是環(huán)境的 isolation券敌,比如 dev唾戚,test,staging待诅,product)
- Service discovery
- State management(Readiness, Liveness)
- Monitoring and logging
- Metrics aggregation
- Debugging and tracing
我們可以看到叹坦,上面的八個(gè)點(diǎn)中其實(shí)下面非常多的都是原來(lái)傳統(tǒng)的中間件在干的一些事情,而在 Cloud native 的基礎(chǔ)設(shè)施中卑雁,這些中間件正在往下沉募书,直接成為基礎(chǔ)設(shè)施的一部分,為應(yīng)用提供能力测蹲。而且在 CNCF 中莹捡,上面的八個(gè)點(diǎn)基本上都有一個(gè)對(duì)應(yīng)的產(chǎn)品對(duì)應(yīng):
- Runtime and isolation: containers, rkt
- Resource allocation and scheduling: kubernetes
- Environment isolation: kubernetes
- Service discovery: kubernetes
- State management: kubernetes
- Monitoring and logging: Prometheus, Fluentd
- Metrics aggregation: Prometheus
- Debugging and tracing: OpenTracing, Jaeger
除了上面的八個(gè)點(diǎn)之外,我個(gè)人認(rèn)為應(yīng)該還加上一個(gè)點(diǎn)扣甲,就是 Network Resilient篮赢,這可以極大程度地解決應(yīng)用之間的網(wǎng)絡(luò)通信的問(wèn)題,這個(gè)正是 Service Mesh 所提供的能力琉挖,在 CNCF 里面對(duì)應(yīng)的產(chǎn)品是 Envoy(奇怪 istio 怎么還沒(méi)有進(jìn)入 CNCF)启泣。
總結(jié)來(lái)說(shuō),本書(shū)的作者基本上把設(shè)計(jì)一個(gè) Cloud native infrastructure 所需要做的事情都講了一遍示辈,包括上面沒(méi)有提到的測(cè)試等等寥茫,大部分的內(nèi)容其實(shí)就是 Kubernetes 目前已經(jīng)做到的一些事情,如果你對(duì) Kubernetes 的設(shè)計(jì)已經(jīng)非常清楚了矾麻,那么這本書(shū)對(duì)你的價(jià)值可能不大纱耻,如果對(duì) Kubernetes 的設(shè)計(jì)并不熟悉,那么相信你可以從這本書(shū)里面學(xué)到不少東西射富。