使用 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:全球大搜羅 |