YAML配置文件


 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 需要知道的參數,以及諸如是否在容器失敗時重新啟動容器的屬性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM