云原生集成開(kāi)發(fā)環(huán)境——TitanIDE
通過(guò)網(wǎng)頁(yè)在任何地方更安全、更高效地編碼2022-05-05
1177
作者:樂(lè)魚(yú)創(chuàng)新 老蔣
盡管Kubernetes越來(lái)越受歡迎,但它仍然有一個(gè)陡峭的學(xué)習(xí)曲線。
本文將介紹Kubernetes對(duì)象配置的YAML文件。YAML提供了一種以聲明方式配置Kubernetes應(yīng)用程序的方法,這些聲明文件允許您有效地?cái)U(kuò)展和管理應(yīng)用程序。如果不了解Kubernetes對(duì)象的基本配置,就很容易陷入運(yùn)行應(yīng)用程序而不真正了解它們?nèi)绾喂ぷ鞯南葳濉?
需要注意的是,YAML和JSON可以在Kubernetes的配置中互換使用。然而,盡管在某些情況下YAML被認(rèn)為更難編寫(xiě),但它要緊湊得多??紤]到大型應(yīng)用程序需要管理的所有YAML文件時(shí),這種緊湊的特性是一個(gè)很大的優(yōu)勢(shì)。
總的來(lái)說(shuō),YAML傾向于對(duì)用戶(hù)更加友好和易于使用,緊湊的特性允許您對(duì)相關(guān)的Kubernetes對(duì)象進(jìn)行分組,從而減少所需的文件數(shù)量。這是因?yàn)閅AML的設(shè)計(jì)目標(biāo)是提高可讀性并提供更完整的信息模型。它可以簡(jiǎn)單地看作是JSON的一種演變。
Kubernetes的YAML
為了開(kāi)始使用Kubernetes的YAML,我們將回顧YAML的基本結(jié)構(gòu)類(lèi)型,你可以在下表中看到:
當(dāng)為Kubernetes編寫(xiě)YAML文件時(shí),必須有四個(gè)字段。APIVersion, Kind, Metadata, Specifications。
APIVersion
這個(gè)字段引用API,它被用來(lái)創(chuàng)建定義的Kubernetes對(duì)象。Kubernetes提供了各種api,使您能夠創(chuàng)建不同的Kubernetes對(duì)象。例如,apiVersion: v1包含許多核心對(duì)象。
apiVersion: v1通常被認(rèn)為是Kubernetes的第一個(gè)穩(wěn)定版本。另一個(gè)流行的APIVersion是apps/v1,它采用了來(lái)自v1的對(duì)象,并提供了關(guān)鍵的功能,如部署和replicaset。
因此,在我們的YAML文件中,定義APIVersion可以是:
apiVersion: v1
Kind
kind允許您指定要定義的Kubernetes對(duì)象類(lèi)型。您將在此字段中指定的對(duì)象將鏈接到您之前指定的apiVersion,因?yàn)樗莂piVersion字段,使您能夠訪問(wèn)不同類(lèi)型的對(duì)象及其特定定義??梢远x的對(duì)象類(lèi)型包括pods、服務(wù)和daemonset。
因此,要定義一個(gè)pod對(duì)象,在指定apiVersion之后,我們將指定kind字段,如下所示:
apiVersion: v1
kind: pod
Metadata
在指定要定義的對(duì)象類(lèi)型之后,元數(shù)據(jù)字段為該特定對(duì)象提供惟一屬性。這可能包括name、uuid和namespace字段。為這些字段指定的值為我們提供了對(duì)象的上下文,它們可以被其他對(duì)象引用。這個(gè)字段允許我們指定對(duì)象的標(biāo)識(shí)符屬性。
例如,如果我們正在構(gòu)建一個(gè)spring應(yīng)用程序,我們的pod可以有如下所示的name值:
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
Specifications
spec字段允許我們定義對(duì)所構(gòu)建的對(duì)象的期望。它由所有特定于定義對(duì)象操作的鍵值對(duì)組成。就像對(duì)象本身一樣,對(duì)象的規(guī)范依賴(lài)于之前指定的apiVersions。因此,不同的apiversion可能包含相同的對(duì)象,但是可以定義的對(duì)象的規(guī)范可能會(huì)不同。
如果我們繼續(xù)構(gòu)建spring應(yīng)用程序的pod對(duì)象的示例,我們的spec字段可能類(lèi)似于如下所示:
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
containers:
– image: armo/springapp:example
spec:
name: spring-app
ports:
– containerPort: 80
protocol: TCP
在上面的最后一個(gè)示例文件中,我們使用API v1創(chuàng)建了一個(gè)Pod對(duì)象,我們將其命名為spring-pod。根據(jù)規(guī)范,我們將使用80端口,使用的鏡像是armo/springapp:example。
下圖比較了JSON和YAML中的配置。正如您所看到的,YAML更加簡(jiǎn)潔和易讀。
圖1:比較JSON和YAML
管理YAML文件的策略
現(xiàn)在我們已經(jīng)構(gòu)建了Kubernetes YAML文件,讓我們看看進(jìn)一步加速構(gòu)建Kubernetes應(yīng)用程序的一些策略。
YAML 版本控制
如上所述,使用YAML字段允許您以聲明的方式管理Kubernetes應(yīng)用程序。這些YAML文件可以存儲(chǔ)在一個(gè)公共目錄中,可以使用kubectl apply -f 應(yīng)用所有這些文件。
這相當(dāng)簡(jiǎn)單。然而,隨著應(yīng)用程序的發(fā)展和Kubernetes對(duì)象定義的更改,您將不得不考慮當(dāng)前部署的版本和更改。這是因?yàn)椋绻麤](méi)有版本控制,您可能無(wú)法回滾到以前的鏡像,而以前的鏡像可能比新的當(dāng)前部署的鏡像更穩(wěn)定。
有幾種方法可以實(shí)現(xiàn)YAML的版本控制,它們的復(fù)雜性和管理的便利性各不相同。這可能需要在YAML中使用簡(jiǎn)單的標(biāo)記和手動(dòng)kubectl命令,或者需要使用諸如Helm這樣的特殊工具。詳細(xì)介紹這些方法超出了本文的范圍,但值得一提的是,版本控制是一項(xiàng)重要的實(shí)踐。
管理Secrets
在應(yīng)用程序的整個(gè)生命周期中,您可能需要利用機(jī)密數(shù)據(jù)來(lái)支持其功能。這可能包括密碼、用戶(hù)信息,甚至信用卡詳細(xì)信息。
在定義Kubernetes對(duì)象時(shí),可以將這些數(shù)據(jù)作為變量直接放到Y(jié)AML文件中。然而,這可能導(dǎo)致重大的安全漏洞,并增加了這些數(shù)據(jù)落入壞人手中的可能性。因此,建議將Kubernetes提供的Secrets對(duì)象與Secrets管理工具一起使用。
當(dāng)利用Secret對(duì)象時(shí),pod必須引用Secret。這就是我們使用元數(shù)據(jù)字段的地方。pod將使用Secret name字段,其中Secret對(duì)象的名稱(chēng)將是有效的DNS子域名。
定義的Secrets對(duì)象的示例如下所示:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
一定要注明“Secrets”類(lèi)型。在上面的例子中,我們將Secrets類(lèi)型指定為Opaque。這是Secret對(duì)象的默認(rèn)類(lèi)型。另一種Secret類(lèi)型是kubernetes.io/service-account-token,用于存儲(chǔ)服務(wù)帳戶(hù)的標(biāo)識(shí)符令牌。
更多關(guān)于如何管理Kubernetes中的Secrets的詳細(xì)信息可以在ARMO的資源對(duì)象中找到。
YAML 模板
YAML模板旨在通過(guò)在Kubernetes應(yīng)用程序中重用YAML文件來(lái)減少我們必須編寫(xiě)和管理的YAML文件的數(shù)量。例如,讓我們考慮下面的pod定義:
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
– image: armo/springapp:example
name: spring-app
env:
– name: sz-1
value: postgres://db_url:5432
這個(gè)Pod將在sz-1區(qū)。然而,如果我們想要為我們的上??蛻?hù)部署到sh-1,我們將不得不編寫(xiě)一個(gè)新的YAML文件,因?yàn)槲覀兪褂玫氖怯簿幋a的值。
這個(gè)問(wèn)題的解決方案是使用YAML模板,它允許我們使用不同的值重用YAML文件。有幾種實(shí)現(xiàn)YAML模板的方法,但最基本的方法是在利用占位符的地方搜索和替換YAML文件中的值。
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
– image: armo/springapp:example
name: spring-app
env:
– name: ENV
value: %DEPLOYMENT_ENV%
通過(guò)利用bash中的sed,我們可以在處理YAML文件之前搜索和替換這些值。但是,這是最基本、最不方便的方法,因?yàn)槟仨毷謩?dòng)執(zhí)行占位符的硬編碼。
更方便的方法是利用像Helm這樣的工具來(lái)構(gòu)建和管理模板。
結(jié)論
由于YAML的結(jié)構(gòu)方式和它的設(shè)計(jì)目標(biāo),它是Kubernetes配置的最佳解決方案。增加的可讀性和簡(jiǎn)潔的結(jié)構(gòu)允許您伸縮您的Kubernetes配置,而不會(huì)迷失在一堆配置文件中。
此外,通過(guò)理解如何以聲明方式構(gòu)建Kubernetes應(yīng)用程序,我們還可以理解Kubernetes應(yīng)用程序如何運(yùn)行以及為什么運(yùn)行的機(jī)制??紤]像YAML模板這樣的高級(jí)功能可以幫助簡(jiǎn)化定義和構(gòu)建Kubernetes應(yīng)用程序的過(guò)程。
--------------------
CloudOS,一站式云原生開(kāi)發(fā)平臺(tái)