本文首發於我的公眾號 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 配置文件有一個基本的認識。
幾個例子
下面,我們分別來看看 deployment
、pod
、service
這三種資源的說明書都長啥樣。
由於 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,本文就到此為止,下文我們開始進入豌豆莢之旅。覺得不錯,別忘了轉發分享給你的朋友哦。
我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。