js 網(wǎng)站測速千鋒教育地址
目錄
一、YAML 概述
二、YAML 基本語法
三、YAML 數(shù)據(jù)結(jié)構(gòu)
四、k8s資源清單描述方法
五、YAML 快速編寫
1、使用 kubectl create 命令
2、使用 kubectl get 命令導(dǎo)出 yaml 文件
一、YAML 概述
k8s 集群中對資源管理和資源對象編排部署都可以通過聲明YAML文件來解決,也就是可以把需要對資源對象操作編輯到 YAML 格式文件中,我們把這種文件叫做資源清單文件,通過 kubectl 命令直接使用資源清單文件就可以實(shí)現(xiàn)對大量的資源對象進(jìn)行編排部署了。
- YAML 文件 : 就是資源清單文件,用于資源編排。
二、YAML 基本語法
- 通過縮進(jìn)表示層級關(guān)系;
- 使用空格做為縮進(jìn),縮進(jìn)的空格數(shù)目不重要,只要相同層級的元素左側(cè)對齊即可,一般縮進(jìn)兩個空格;
- 低版本縮進(jìn)時不允許使用 Tab 鍵,只允許使用空格;
- 使用#代表注釋,從這個字符一直到行尾,都會被解釋器忽略;
- 使用 --- 表示新的 yaml 文件開始;
三、YAML 數(shù)據(jù)結(jié)構(gòu)
- 對象:鍵值對的集合,又稱為映射 (mapping) / 哈希(hashes) / 字典(dictionary)
# 對象類型:對象的一組鍵值對,使用冒號結(jié)構(gòu)表示
name: Tom
age: 18# yaml 也允許另一種寫法,將所有鍵值對寫成一個行內(nèi)對象
hash: {name: Tom, age: 18}
- 數(shù)組: 一組按次序排列的值,又稱為序列(sequence) / 列表 (list)
# 數(shù)組類型:一組連詞線開頭的行,構(gòu)成一個數(shù)組
People
- Tom
- Jack# 數(shù)組也可以采用行內(nèi)表示法
People: [Tom, Jack]
- 純量(scalars): 單個的、不可再分的值
number: 10.01flag: true# 字符串默認(rèn)不使用引號表示
str: hello world# 如果字符串中間包含空格或者特殊字符,需要放到引號中
str1: 'hello: world'# 雙引號不會對特殊字符進(jìn)行轉(zhuǎn)義
s1: '張\n三'
s2: "張\n三"# 單引號中還有單引號,需要連續(xù)用兩個單引號進(jìn)行轉(zhuǎn)義
s3: 'hello''world'
四、k8s資源清單描述方法
在 k8s 中,一般使用 YAML 格式的文件來創(chuàng)建符合我們預(yù)期期望的pod,這樣的YAML 文件稱為資源清單。主要分為兩大部分,一個是控制器的定義、另一個是被控制的對象。
資源清單中常用的屬性名稱:
參數(shù)名 | 字段類型 | 說明 | 是否必須 |
version | String | 這里指定是K8S API的版本,目前基本上是v1,可以通過kubectl api-versions命令查詢 | 是 |
kind | String | yaml文件定義的資源類型和角色,比如:Pod、Deployment、ReplicaSet、Service | 是 |
metadata | Object | 元數(shù)據(jù)對象,固定值就寫metadata | 是 |
metadata.name | String | 元數(shù)據(jù)對象的名字,由我們自定義,比如命名Pod的名字,Service的名字 | 是 |
metadata.namespace | String | 元數(shù)據(jù)對象的命名空間,由我們自定義。非必填,默認(rèn)為default | 否 |
spec | Object | 詳細(xì)定義對象,固定值就寫spec | 是 |
spec.containers[] | list | spec對象的容器列表定義 | 是 |
spec.containers[].name | String | 容器名字 | 是 |
spec.containers[].image | String | 容器所使用的鏡像 | 是 |
spec.containers[].imagePullPolicy | String | 定義鏡像拉取策略,有Always、Never、IfNotPresent三個值。 Always:意思是每次都嘗試重新拉取鏡像。(默認(rèn)值是Always) Never:表示僅使用本地鏡像。 IfNotPresent:如果本地有鏡像,就使用本地鏡像,本地沒有就拉取在線鏡像。 | 否 |
spec.containers[].args[] | List | 指定容器啟動命令參數(shù),因?yàn)槭菙?shù)組可以指定多個 | 否 |
spec.containers[].command[] | list | 容器啟動時執(zhí)行的命令,因?yàn)槭菙?shù)組,可以指定多個。如果不指定,使用鏡像打包時的啟動命令 | |
spec.containers[].workingDir | String | 指定容器工作目錄 | 否 |
spec.containers[].volumeMounts[] | List | 指定容器內(nèi)部的存儲卷配置 | 否 |
spec.containers[].volumeMounts[].name | String | 指定可以被容器掛載的存儲卷的名稱 | 否 |
spec.containers[].volumeMounts[].mountPath | String | 指定可以被容器掛載的存儲卷的路徑 | 否 |
spec.containers[].volumeMounts[].readOnly | String | 設(shè)置存儲卷路徑的讀寫模式,true或者false 默認(rèn)為讀寫模式 | 否 |
spec.containers[].ports[] | List | 指定容器需要用到的端口列表 | 否 |
spec.containers[].ports[].name | String | 指定端口名 | 否 |
spec.containers[].ports[].containerPort | String | 指定容器需要監(jiān)聽的端口號 | 否 |
spec.containers[].ports[].hostPort | String | 指定容器所在主機(jī)需要監(jiān)聽的端口號,默認(rèn)跟上面的containerPort相同,注意設(shè)置了hostPort,同一臺主機(jī)無法啟動該容器的相同副本(因?yàn)橹鳈C(jī)端口號不能相同,這樣會沖突) | 否 |
spec.containers[].ports[].protocol | String | 指定端口協(xié)議,支持TCP和UDP。默認(rèn)值為TCP | 否 |
spec.containers[].env[] | List | 容器運(yùn)行前需要設(shè)置的環(huán)境變量列表 | 否 |
spec.containers[].env[].name | String | 環(huán)境變量的名稱 | 否 |
spec.containers[].env[].value | String | 環(huán)境變量的值 | 否 |
spec.containers[].resources | Object | 指定資源限制和資源請求的值(這里開始就是設(shè)置容器的資源上限) | 否 |
spec.containers[].resources.limits | Object | 指定容器運(yùn)行時資源的運(yùn)行上限 | 否 |
spec.containers[].resources.limits.cpu | String | 指定CPU的限制,單位為core數(shù),將用于docker run --cou-shares參數(shù) | 否 |
spec.containers[].resources.limits.memory | String | 指定MEM內(nèi)存的限制,單位為MiB、GiB | 否 |
spec.containers[].resources.requests | Object | 指定容器啟動和調(diào)度時的限制設(shè)置 | 否 |
spec.containers[].resources.requests.cpu | String | CPU請求,單位為core數(shù),容器啟動時初始化可用數(shù)量 | 否 |
spec.containers[].resources.requests.memory | String | 內(nèi)存請求,單位為MiB、GiB,容器啟動時初始化可用數(shù)量 | 否 |
spec.restartPolicy | String | 定義Pod重啟策略,可選值為Always、OnFailure、Never,默認(rèn)值為Always。 Always:Pod一旦終止運(yùn)行,則無論容器是如何終止的,kubelet服務(wù)都將重啟Pod OnFailure:只有Pod以非零退出碼終止時,kubelet才會重啟該容器。如果容器正常結(jié)束(退出碼為0),則kubelet將不會重啟它。 Never:Pod終止后,kubelet將退出碼報(bào)告給Master,不會重啟該P(yáng)od | 否 |
spec.nodeSelector | Object | 定義Node的Label過濾標(biāo)簽,以key-value格式指定 | 否 |
spec.imagePullSecrets | Object | 定義PUll鏡像時使用secret名稱,以name:secretkey格式指定 | |
spec.hostNetwork | Bollean | 是否使用主機(jī)網(wǎng)絡(luò)模式,默認(rèn)值為false。設(shè)置為true表示使用宿主機(jī)網(wǎng)絡(luò),不適用docker網(wǎng)橋。同時設(shè)置了true將無法在同一臺宿主機(jī)上啟動第二個副本。 |
五、YAML 快速編寫
一般來說,我們很少自己手寫 YAML 文件,因?yàn)檫@里面涉及到了很多內(nèi)容,我們一般都會借助工具來創(chuàng)建。
1、使用 kubectl create 命令
這種方式一般用于資源沒有部署的時候,我們可以直接創(chuàng)建一個 YAML 配置文件。
# 嘗試運(yùn)行,并不會真正的創(chuàng)建鏡像
[root@localhost ~]# kubectl create deployment web --image=nginx -o yaml --dry-run=client
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: webname: web
spec:replicas: 1selector:matchLabels:app: webstrategy: {}template:metadata:creationTimestamp: nulllabels:app: webspec:containers:- image: nginxname: nginxresources: {}
status: {}
--dry-run:嘗試運(yùn)行,并不會真正的創(chuàng)建鏡像。
或者我們可以輸出到一個文件中:?
[root@localhost ~]# kubectl create deployment web --image=nginx -o yaml --dry-run=client > nginx.yaml[root@localhost ~]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: webname: web
spec:replicas: 1selector:matchLabels:app: webstrategy: {}template:metadata:creationTimestamp: nulllabels:app: webspec:containers:- image: nginxname: nginxresources: {}
status: {}
然后我們就在文件中直接修改即可。
2、使用 kubectl get 命令導(dǎo)出 yaml 文件
可以首先查看一個目前已經(jīng)部署的鏡像:
kubectl get deploy
然后我們導(dǎo)出 nginx 的配置,然后會生成一個 nginx.yaml 的配置文件。
# 本例使用的1.21.3版本
kubectl get deploy nginx -o=yaml > nginx.yaml# 如果是舊版本的k8s,需指定--export
kubectl get deploy nginx -o=yaml --export > nginx.yaml
示例如下:
[root@localhost ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created[root@localhost ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 8s[root@localhost ~]# kubectl get deploy nginx -o=yaml > nginx.yaml
[root@localhost ~]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: "1"creationTimestamp: "2022-11-25T06:55:03Z"generation: 1labels:app: nginxname: nginxnamespace: defaultresourceVersion: "4408"uid: d6dc9709-72d1-4657-ace2-273cee3e0013
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginximagePullPolicy: Alwaysname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
status:availableReplicas: 1conditions:- lastTransitionTime: "2022-11-25T06:55:09Z"lastUpdateTime: "2022-11-25T06:55:09Z"message: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: "True"type: Available- lastTransitionTime: "2022-11-25T06:55:03Z"lastUpdateTime: "2022-11-25T06:55:09Z"message: ReplicaSet "nginx-6799fc88d8" has successfully progressed.reason: NewReplicaSetAvailablestatus: "True"type: ProgressingobservedGeneration: 1readyReplicas: 1replicas: 1updatedReplicas: 1