當前位置:
首頁 > 最新 > 使用 YAML 文件創建 Kubernetes Deployment

使用 YAML 文件創建 Kubernetes Deployment

在之前的文章中,我們一直在討論如何使用,很多時候我們知道怎麼使用命令行工具來啟動一個,也看到我們在安裝kubernetes 過程中使用了一些 YAML 文件來創建,但是發現很多朋友對 YAML 文件來創建一個 POD 還是非常陌生。所以我們來簡單看看 YAML 文件是如何工作的,並使用YAML文件來定義一個 kubernetes pod,然後再來定義一個 kubernetes deployment吧。YAML 基礎是專門用來寫配置文件的語言,非常簡潔和強大,遠比格式方便。語言(發音 /?j?m?l/)的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串列化格式。它的基本語法規則如下:大小寫敏感使用縮進表示層級關係縮進時不允許使用Tab鍵,只允許使用空格。縮進的空格數目不重要,只要相同層級的元素左側對齊即可表示注釋,從這個字元一直到行尾,都會被解析器忽略。在我們的中,你只需要兩種結構類型就行了:ListsMaps也就是說,你可能會遇到Lists的Maps和Maps的Lists,等等。不過不用擔心,你只要掌握了這兩種結構也就可以了,其他更加複雜的我們暫不討論。Maps首先我們來看看,我們都知道是字典,就是一個key:value的鍵值對,可以讓我們更加方便的去書寫配置信息,例如:

---

apiVersion:v1

kind:Pod

第一行的是分隔符,是可選的,在單一文件中,可用連續三個連字號區分多個文件。這裡我們可以看到,我們有兩個鍵:kind 和 apiVersion,他們對應的值分別是:v1和Pod。上面的 YAML 文件轉換成 JSON 格式的話,你肯定就容易明白了:

{

"apiVersion":"v1",

"kind":"pod"

}

我們在創建一個相對複雜一點的 YAML 文件,創建一個 KEY 對應的值不是字元串而是一個 Maps:

---

apiVersion:v1

kind:Pod

metadata:

name:kube100-site

labels:

app:web

上面的 YAML 文件,metadata 這個 KEY 對應的值就是一個了,而且嵌套的 labels 這個 KEY 的值又是一個Map,你可以根據你自己的情況進行多層嵌套。上面我們也提到了 YAML 文件的語法規則,YAML 處理器是根據行縮進來知道內容之間的嗯關聯性的。比如我們上面的 YAML 文件,我用了兩個空格作為縮進,空格的數量並不重要,但是你得保持一致,並且至少要求一個空格(什麼意思?就是你別一會縮進兩個空格,一會縮進4個空格)。我們可以看到 name 和 labels 是相同級別的縮進,所以 YAML 處理器就知道了他們屬於同一個 MAP,而 app 是 labels 的值是因為 app 的縮進更大。注意:在 YAML 文件中絕對不要使用 tab 鍵。同樣的,我們可以將上面的 YAML 文件轉換成 JSON 文件:

{

"apiVersion":"v1",

"kind":"Pod",

"metadata": {

"name":"kube100-site",

"labels": {

"app":"web"

}

}

}

或許你對上面的 JSON 文件更熟悉,但是你不得不承認 YAML 文件的語義化程度更高吧?Lists就是列表,說白了就是數組,在 YAML 文件中我們可以這樣定義:

args

-Cat

-Dog

-Fish

你可以有任何數量的項在列表中,每個項的定義以破折號()開頭的,與父元素直接可以縮進一個空格。對應的 JSON 格式如下:

{

"args": ["Cat","Dog","Fish"]

}

當然,list 的子項也可以是 Maps,Maps 的子項也可以是list如下所示:

---

apiVersion:v1

kind:Pod

metadata:

name:kube100-site

labels:

app:web

spec:

containers:

-name:front-end

image:nginx

ports:

-containerPort:80

-name:flaskapp-demo

image:jcdemo/flaskapp

ports:

-containerPort:5000

比如這個 YAML 文件,我們定義了一個叫 containers 的 List 對象,每個子項都由 name、image、ports 組成,每個 ports 都有一個 key 為 containerPort 的 Map 組成,同樣的,我們可以轉成如下 JSON 格式文件:

{

"apiVersion":"v1",

"kind":"Pod",

"metadata": {

"name":"kube100-site",

"labels": {

"app":web"

}

},

"spec": {

"containers": [{

"name":"front-end",

"image":"nginx",

"ports": [{

"containerPort":"80"

}]

}, {

"name":"flaskapp-demo",

"image":"jcdemo/flaskapp",

"ports": [{

"containerPort":"5000"

}]

}]

}

}

是不是覺得用 JSON 格式的話文件明顯比 YAML 文件更複雜了呢?使用 YAML 創建 Pod現在我們已經對 YAML 文件有了大概的了解了,我相信你應該沒有之前那麼懵逼了吧?我們還是來使用 YAML 文件來創建一個 Deployment 吧。當然如果你的集群還沒搭建完成的話,可以繼續閱讀前面【手動搭建高可用的 kubernetes 集群】的文章。創建 Pod

---

apiVersion:v1

kind:Pod

metadata:

name:kube100-site

labels:

app:web

spec:

containers:

-name:front-end

image:nginx

ports:

-containerPort:80

-name:flaskapp-demo

image:jcdemo/flaskapp

ports:

-containerPort:5000

這是我們上面定義的一個普通的 POD 文件,我們先來簡單分析下文件內容:apiVersion,這裡它的值是,這個版本號需要根據我們安裝的版本和資源類型進行變化的,記住不是寫死的kind,這裡我們創建的是一個 Pod,當然根據你的實際情況,這裡資源類型可以是 Deployment、Job、Ingress、Service 等待。metadata:包含了我們定義的 Pod 的一些 meta 信息,比如名稱、namespace、標籤等等信息。spec:包括一些 containers,storage,volumes,或者其他需要知道的參數,以及諸如是否在容器失敗時重新啟動容器的屬性。你可以在特定找到完整的的屬性。讓我們來看一個典型的容器的定義:

spec:

containers:

-name:front-end

image:nginx

ports:

-containerPort:80

在這個例子中,這是一個簡單的最小定義:一個名字(front-end),基於 nginx 的鏡像,以及容器 將會監聽的一個埠(80)。在這些當中,只有名字是非常需要的,你也可以指定一個更加複雜的屬性,例如在容器啟動時運行的命令,應使用的參數,工作目錄,或每次實例化時是否拉取映像的新副本。以下是一些容器可選的設置屬性:nameimagecommandargsworkingDirportsenvresourcesvolumeMountslivenessProbereadinessProbelivecycleterminationMessagePathimagePullPolicysecurityContextstdinstdinOncetty明白了 POD 的定義後,我們將上面創建 POD 的 YAML 文件保存成,然後使用創建 POD:

$ kubectlcreate-fpod.yaml

pod"kube100-site"created

然後我們就可以使用我們前面比較熟悉的命令來查看 POD 的狀態了:

$ kubectlgetpods

NAME READY STATUS RESTARTS AGE

kube100-site2/2 Running1m

到這裡我們的 POD 就創建成功了,如果你在創建過程中有任何問題,我們同樣可以使用前面的進行排查。我們先刪除上面創建的 POD:

$ kubectldelete-fpod.yaml

pod"kube100-site"deleted

創建 Deployment現在我們可以來創建一個真正的 Deployment。在上面的例子中,我們只是單純的創建了一個 POD 實例,但是如果這個 POD 出現了故障的話,我們的服務也就掛掉了,所以提供了一個的概念,可以讓去管理一組 POD 的副本,也就是副本集,這樣就可以保證一定數量的副本一直可用的,不會因為一個 POD 掛掉導致整個服務掛掉。我們可以這樣定義一個:

---

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

name:kube100-site

spec:

replicas:2

注意這裡的對應的值是extensions/v1beta1,當然要指定為,因為這就是我們需要的,然後我們可以指定一些 meta 信息,比如名字,或者標籤之類的。最後,最重要的是配置選項,這裡我們定義需要兩個副本,當然還有很多可以設置的屬性,比如一個 Pod 在沒有任何錯誤變成準備的情況下必須達到的最小秒數。我們可以在【Kubernetes v1beta1 API】參考中找到一個完整的 Depolyment 可指定的參數列表。現在我們來定義一個完整的 Deployment 的 YAML 文件:

---

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

name:kube100-site

spec:

replicas:2

template:

metadata:

labels:

app:web

spec:

containers:

-name:front-end

image:nginx

ports:

-containerPort:80

-name:flaskapp-demo

image:jcdemo/flaskapp

ports:

-containerPort:5000

看起來是不是和我們上面的很類似啊,注意其中的,其實就是對 POD 對象的定義。將上面的 YAML 文件保存為,然後創建 Deployment:

$ kubectlcreate-fdeployment.yaml

deployment"kube100-site"created

同樣的,想要查看它的狀態,我們可以檢查Deployment的列表:

$ kubectlgetdeployments

NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE

kube100-site22222m

我們可以看到所有的 Pods 都已經正常運行了。到這裡我們就完成了使用 YAML 文件創建 Kubernetes Deployment 的過程,在了解了 YAML 文件的基礎後,定義 YAML 文件其實已經很簡單了,最主要的是要根據實際情況去定義 YAML 文件,所以查閱 Kubernetes 文檔很重要。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

陽光浸潤的角落,給你平和知足的歸宿感
免費吃海鮮自助霸王餐!這家餐廳的老闆怕是瘋了吧!

TAG:全球大搜羅 |