前言:
- K8S 裏所有的資源或者配置文件都可以用 yaml 或 Json 定義。YAML 是一個 JSON/ 的超集,任何有效 JSON 文件也都是一個有效的YAML文件。
一、YAML文件詳解
1.1 K8s資源創建方式
-
K8s由兩種創建資源的方式:
① kubectl :命令創建
② yaml/JSON:使用文件方式創建資源對象
兩種格式對比:
-
JSON:更偏向於二次開發層面,軟件中傳的參數都會以json格式傳輸,此處,需要對api進行一個調用,然後傳入json格式給k8s進行有效操作。
特點:用於接口之間消息的傳遞,更適用於開發
-
YAML:如果要對K8s進行有效維護,可以使用此格式對K8s的資源(Pod)進行管理
特點:用於配置和管理,如果基於k8s運維的話,更適合使用此格式文件
本問主要介紹YAML格式,所以此處介紹以下YAML格式的優勢:
- 完整性:配置文件描述了一個資源的完整狀態,可以很清楚地知道一個資源的創建背後究竟做了哪些事;
- 靈活性:配置文件可以創建比命令行更復雜的結構;
- 可維護性:配置文件提供了創建資源對象的模板,能夠重複使用;
- 可擴展性:適合跨環境、規模化的部署。
-
1.2 YAML 簡介
-
YAML 是一種簡潔的非標記性語言,yaml 又被稱爲是 json 的超集,使用起來比 json 更方便
-
結構上它有兩種可選的類型:Lists 和 Maps。
List:用 -(破折號) 來定義每一項
Map:則是一個 key:value 的鍵值對來表示
1.2.1 YAML語法格式
-
語法格式:
- ① 縮進標識層級關係
- ② 不支持製表符(tab鍵)縮進,使用空格縮進
- ③ 通常開頭縮進兩個空格
- ④ 字符後縮進一個空格,如冒號,逗號、短橫槓等
- ⑤ “—” 表示YAML 格式,一個文件的開始
- ⑥ “#” 表示註釋
- ⑦ 三個“.” 表示整個文檔的結束
-
說到語法格式,要談到pod資源發佈的過程,假如使用kubectl expose 發佈,流程如下:
- expose----》創建一個service資源做端口映射,把服務提供出去
- 在創建POD資源之前,需要創建service資源
-
而pods和service都可以使用YAML格式寫出來
- 先寫pods資源
- 再寫service資源
- 中間以“—“進行分隔,表示創建的是兩個資源
-
標籤開頭:
語法:kubectl api-versions(標籤)
根據不同的資源,使用不同的標籤/版本
PS:標籤/v1beta1,beta表示測試版本標題,如果標籤中未指定,可以使用apps代替
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
- YAML格式Pod定義文件完整內容
apiVersion: apps/v1 #基本語法,必選(關鍵字標籤/版本)
kind: Deployment #類型,必選
metadata: #元數據(標籤)
name: nginx-deployment #自定義標籤
labels: #標籤
app: nginx #自定義標籤名(全文標籤要相同)
spec: #選擇器/模板
replicas: 3 #指定的副本集:資源數量
selector: #選擇器信息
matchLabels: #匹配標籤
app: nginx #匹配的標籤名
template: #模板
metadata: #描述性信息,設置的標籤
labels:
app: nginx
spec:
containers: #設置的容器信息
- name: nginx #指定容器名稱(需要與以上相同)
image: nginx:1.15.4 #指定的鏡像
ports:
- containerPort: 80 #指定容器端口
-
小結:yaml文件編寫順序:
-
① 開頭標籤、類型和信息描述
apiVersion、kind和、metadata
-
② 指定選擇器
spec
-
③ 指定容器
spec:container
-
需注意:多一個空格,會導致系統認爲是上一個標籤的子集,會導致報錯
-
二、實例創建
2.1 創建Nginx實例
- 編寫nginx-deployment.yaml文件
[root@master ~]# mkdir demo
[root@master ~]# cd demo/
[root@master demo]# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
- 創建、查看資源
[root@master demo]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
#查看資源
[root@master demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-d55b94fd-d9sbm 0/1 ContainerCreating 0 10s
nginx-deployment-d55b94fd-vsb6l 0/1 ContainerCreating 0 10s
nginx-deployment-d55b94fd-vvkfv 0/1 ContainerCreating 0 10s
- 創建service資源(用於發佈)
[root@master demo]# vim nginx-service.yaml
apiVersion: v1 #版本
kind: Service #類型
metadata: #標籤描述
name: nginx-service #指定指定資源名稱
labels: #標籤信息
app: nginx #自定義標籤名
spec: #發佈信息
type: NodePort #類型:NodePort
ports: #指定端口
- port: 80 #內部端口
targetPort: 80 #對外映射端口:80
selector: #選擇器
app: nginx #指定發佈的資源名稱
----》wq
- 創建nginx-service資源
[root@master demo]# kubectl create -f nginx-service.yaml
service/nginx-service created
[root@master demo]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 7d19h
nginx-service NodePort 10.0.0.196 <none> 80:39632/TCP 9s
- 使用瀏覽器訪問兩個node節點
2.2 自動測試
- 自動測試命令、並不執行創建
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/nginx-deployment.yaml created (dry run)
#--dry-run 只會嘗試運行,不進行操作
#如果由語法問題,會出現提示信息(包括語法提示)
- 查看生成的yaml格式
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o yaml
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
apiVersion: apps/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: nginx-deployment.yaml
name: nginx-deployment.yaml
spec:
replicas: 3
selector:
matchLabels:
run: nginx-deployment.yaml
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: nginx-deployment.yaml
spec:
containers:
- image: nginx
name: nginx-deployment.yaml
ports:
- containerPort: 80
resources: {}
status: {}
- 查看生成的json格式
kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o json
- 直接導出格式模標本
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o yaml > my-deployment.yaml
- 將現有的資源生成模板導出
[root@master demo]# kubectl get depolyment/nginx --export -o yaml
#創建nginx
kubectl run nginx --image=nginx
#查看狀態
kubectl get pods -w
- 查看字段信息
- 以下命令相當於一個小型的官方文檔,可以藉助此文檔查看編寫的格式、語法和可選的內容
[root@master demo]# kubectl explain pods.spec.containers
KIND: Pod
VERSION: v1
RESOURCE: containers <[]Object>
DESCRIPTION:
List of containers belonging to the pod. Containers cannot currently be
added or removed. There must be at least one container in a Pod. Cannot be
updated.
A single application container that you want to run within a pod.
.....省略部分內容
總結:
- YMAL文件編寫的格式其實不用花太大精力去研究,完全可以導出模板,使用現有的模板進行按需更改,我們更多的需要注重Pod資源管理,之後會對Pod的資源管理進行着重介紹