kubernetes 集群需要使用了一些 YAML 文件來創建相關的資源,先來簡單看一看 YAML 文件是如何工作的,並使用 YAML 文件來定義一個 kubernetes pod,然后再來定義一個 kubernetes deployment;
YAML 基礎
基本語法規則:
- 大小寫敏感
- 使用縮進表示層級關系
- 縮進時不允許使用Tab鍵,只允許使用空格。
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
#
表示注釋,從這個字符一直到行尾,都會被解析器忽略。
在 kubernetes 中,只需要兩種結構類型就行了:
- Lists
- Maps
你可能會遇到 Lists 的 Maps 和 Maps 的 Lists,不過不用擔心,只要掌握了這兩種結構也就可以了;
Maps
首先來看看 Maps,我們都知道 Map 是字典,就是一個key:value
的鍵值對,Maps 可以讓我們更加方便的去書寫配置信息,例如:
---
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 對應的值就是一個 Maps 了,而且嵌套的 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"
}
}
}
Lists
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
}]
}]
}
}
使用 YAML 創建 Pod
API 說明: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/
創建 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,這里它的值是 v1,這個版本號需要根據我們安裝的 kubernetes 版本和資源類型進行變化的
- kind,這里我們創建的是一個 Pod,當然根據你的實際情況,這里資源類型可以是 Deployment、Job、Ingress、Service 等待。
- metadata:包含了我們定義的 Pod 的一些 meta 信息,比如名稱、namespace、標簽等等信息。
- spec:包括一些 containers,storage,volumes,或者其他 Kubernetes 需要知道的參數,以及諸如是否在容器失敗時重新啟動容器的屬性。