Kubernetes 筆記 05 yaml 配置文件詳解


本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

Hi,大家好,歡迎大家和我一起學 K8S,這是系列第 5 篇。

生活中,隨處可見,幾乎每一款產品都會附帶一份說明書,說明書可以記錄產品的使用方法,也可以記錄產品的配方。有了說明書,我們完全可以窺探一款產品的全貌。

在 K8S 中,yaml 配置文件就是 K8S 資源對象的說明書,定義了對象包含的元素及采取的動作,每種對象都可以通過 yaml 配置文件來創建。

yaml 是什么

yaml 是一種用來寫配置文件的語言,沒錯,它是一門語言。如果你用過 json,那么對它就不會陌生,yaml 又被稱為是 json 的超集,使用起來比 json 更方便。

結構上它有兩種可選的類型:Lists 和 Maps。

List 用 -(破折號) 來定義每一項,Map 則是一個 key:value 的鍵值對來表示。如下是一個 json 文件到 yaml 文件的轉換:

json:

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
        "name": "xx"
  }
  "spec": {
        "containers": [{
            "name": "front-end",
            "image": "nginx",
            "ports": [{
                "containerPort": "80"
            }]
        }, {
            "name": "flaskapp-demo",
            "image": "jcdemo/flaskapp",
            "ports": [{
                "containerPort": "5000"
            }]
        }]
  }
}

yaml:

---
apiVersion: v1
kind: Pod
metadata:
  name: xx
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: flaskapp-demo
      image: jcdemo/flaskapp
      ports: 8080

這個文件簡單地定義了一個 Pod 對象,包含兩個容器,我們可以很清晰地看到兩者是如何轉換的。

K8S 創建資源的兩種方式

在 K8S 中,有兩種創建資源的方式:kubectl 命令和 yaml 配置文件。

兩種方式各有各的好處。命令行的方式最為簡單,一條命令就萬事大吉,但缺點也很明顯,你並不知道這條命令背后到底做了哪些事,配置文件就提供了一種讓你知其然更知其所以然的方式。總的來說,它有以下好處:

  • 完整性:配置文件描述了一個資源的完整狀態,可以很清楚地知道一個資源的創建背后究竟做了哪些事;
  • 靈活性:配置文件可以創建比命令行更復雜的結構;
  • 可維護性:配置文件提供了創建資源對象的模板,能夠重復使用;
  • 可擴展性:適合跨環境、規模化的部署。
  • ......

當然,復雜的東西對用戶就難以做到友好,我們需要熟悉它的配置文件的語法,有一定難度。下面舉幾個例子,讓你對 yaml 配置文件有一個基本的認識。

幾個例子

下面,我們分別來看看 deploymentpodservice 這三種資源的說明書都長啥樣。

由於 K8S 對每種資源的定義非常龐雜,限於篇幅,我們只看一些必選的參數,目的是通過這幾個例子,讀懂 yaml 配置文件。

deployment

定義 deployment 配置文件,命名為:nginx-deployment.yaml

apiVersion: apps/v1   # 1.9.0 之前的版本使用 apps/v1beta2,可通過命令 kubectl api-versions 查看
kind: Deployment 	#指定創建資源的角色/類型
metadata: 	 #資源的元數據/屬性
  name: nginx-deployment	#資源的名字,在同一個namespace中必須唯一
spec:
  replicas: 2 	 #副本數量2
  selector:      #定義標簽選擇器
    matchLabels:
      app: web-server
  template: 	 #這里Pod的定義
    metadata:
      labels: 	 #Pod的label
        app: web-server
    spec:		 # 指定該資源的內容  
      containers:  
      - name: nginx 	 #容器的名字  
        image: nginx:1.12.1  #容器的鏡像地址    
        ports:  
        - containerPort: 80  #容器對外的端口

執行kubectl create -f nginx.yaml創建 deployment 資源:

pod

定義 pod 配置文件,命名為 redis-pod.yaml

apiVersion: v1
kind: Pod  
metadata:  
  name: pod-redis
  labels:
    name: redis
spec: 
  containers:
  - name: pod-redis
    image: docker.io/redis  
    ports:
    - containerPort: 80	#容器對外的端口

執行kubectl create -f pod-redis.yaml創建 pod 資源:

可以看到,成功創建一個 Pod,ContainerCreating表示 Pod 中的容器正在執行鏡像的下載和安裝過程,過一會兒,就顯示Running了,表明 Pod 應用部署完成。

service

定義 service 配置文件,命名為 httpd-svc.yaml

apiVersion: v1  
kind: Service  # 指明資源類型是 service
metadata:  
  name: httpd-svc # service 的名字是 httpd-svc
  labels:  
    name: httpd-svc 
spec:  
  ports:  # 將 service 8080 端口映射到 pod 的 80 端口,使用 TCP 協議
  - port: 8080
    targetPort: 80  
    protocol: TCP  
  selector:  
    run: httpd # 指明哪些 label 的 pod 作為 service 的后端

執行kubectl create -f httpd-svc.yaml創建 service 資源:

可以看到,service httpd-svc 分配到一個 Cluster-IP 10.96.0.1,我們可以通過該 IP 訪問 service 所維護的后端 Pod。

另外,還有一個 service kubernetes,這個是 Kubernetes API Server 的 service,Cluster 內部的各組件就是通過這個 service 來訪問 API Server。

總結

yaml 是 K8S 資源對象的說明書,每個對象擁有哪些屬性都可以在 yaml 中找到詳盡的說明,初學者建議多寫 yaml 文件,少用命令行。

以上三個例子只是對 yaml 文件做個簡單說明,更詳細的信息還是參考官網。

OK,本文就到此為止,下文我們開始進入豌豆莢之旅。覺得不錯,別忘了轉發分享給你的朋友哦。

參考:
https://www.kubernetes.org.cn/1414.html


我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


免責聲明!

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



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