国产精品免费久久久久电影院_亚洲日韩蜜桃av无码一二三区_AV在线无码免费特黄毛片_亚洲欧美日韩电影在线专区_福利小视频午夜福利一区二区中文字幕_在线免费观看黄黄色视频_欧美菊爆视频在线观看免费_婷婷六月丁香五月_久久伊人精品中文字幕有码_强奸国产无码激情

如何為Kubernetes編寫(xiě)YAML文件

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)

免費(fèi)體驗(yàn)地址>

技術(shù)交流
我們建立了多個(gè)云原生技術(shù)交流群,其中有來(lái)自O(shè)racle、Citrix、華為、騰訊等國(guó)內(nèi)外云計(jì)算專(zhuān)家,立即掃碼,拉你進(jìn)群。目前已有2000+開(kāi)發(fā)者加入我們......
云原生廠商 云原生技術(shù)服務(wù)商
在云原生時(shí)代,樂(lè)魚(yú)創(chuàng)新致力于通過(guò)賦能開(kāi)發(fā)者,實(shí)現(xiàn)企業(yè)快速迭代與交付,大幅提升創(chuàng)新效率。
產(chǎn)品下載