一、YAML簡介及說明
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一種標記語言)的遞歸縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。
基本語法:
- 大小寫敏感
- 使用縮進表示層級關系
- 縮進不允許使用tab,只允許空格
- 縮進的空格數不重要,只要相同層級的元素左對齊即可
- '#'表示注釋
數據類型:
YAML 支持以下幾種數據類型:
- 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
- 純量(scalars):單個的、不可再分的值
這里我們說一下對象映射以及數組
YAML 對象:
對象鍵值對使用冒號結構表示 key: value,冒號后面要加一個空格。
也可以使用 key:{key1: value1, key2: value2, ...}。
還可以使用縮進表示層級關系;
apiVersion: v1
kind: Pod
metadata:
name: k8s01-prod
labels:
app: test
YAML 數組:
以 - 開頭的行表示構成一個數組:
- zhangsan
- lisi
- wangwu
YAML 支持多維數組,可以使用行內表示:
{
key: [zhangsan, lisi, wngwu, ...]
}
數組的子項也可以是數組:
companies:
-
id: 1
name: zhangsan
price: 200W
-
id: 2
name: lisi
price: 500W
id: 3
name: wangwu
price: 1000W
二、k8s下的YAML使用及說明
2.1 YAML創建Deployment
kubectl get nodes # 查看nodes
kubectl get ns # 查看命名空間
kubectl get pods # 查看pods
kubectl creat n s test1 # 創建新的命名空間test1
curl -L https://github.com/ahmetb/kubectx/releases/download/v0.9.1/kubens -o /bin/kubens
chmod +x /bin/kubens # 安裝kubens 並給與權限
kubens test1 # 切換命名空間test1
kubectl get deploy # 查看應用
kubectl create deployment test-yaml --image=nginx --dry.run=client -o yaml > test-yaml.yaml
# 創建名為test-yaml的deployment test-yaml.yaml
vim test-yaml.yaml # 編輯yaml
YAML文件詳解
#test-yaml
apiVersion: apps/v1 # 指定api版本,此值必須在kubectl apiversion中 ,可通過kubectl api-versions命令查看所有的api版本
kind: Deployment # 指定創建資源的角色/類型
metadata: # 資源的元數據/屬性
name: test-pod # 資源的名字,在同一個namespace中必須唯一
labels: # 設定資源的標簽
k8s-app: nginx
version: v1
kubernetes.io/cluster-service: "true"
annotations: # 自定義注解列表
- name: String # 自定義注解名字
spec: # specification of the resource content 指定該資源的內容
restartPolicy: Always # 表明該容器一直運行,默認k8s的策略,在此容器退出后,會立即創建一個相同的容器
nodeSelector: # 節點選擇,先給主機打標簽kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: test-pod # 容器的名字
image: 10.133.133.10:12321/devops/nginx:latest # 容器使用的鏡像地址
imagePullPolicy: Never # 三個選擇Always、Never、IfNotPresent,每次啟動時檢查和更新(從registery)images的策略,
# Always,每次都檢查
# Never,每次都不檢查(不管本地是否有)
# IfNotPresent,如果本地有就不檢查,如果沒有就拉取
command: ['sh'] # 啟動容器的運行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT
args: ["$(str)"] # 啟動容器的命令參數,對應Dockerfile中CMD參數
env: # 指定容器中的環境變量
- name: str # 變量的名字
value: "/etc/run.sh" # 變量的值
resources: # 資源管理
requests: # 容器運行時,最低資源需求,也就是說最少需要多少資源容器才能正常運行
cpu: 0.5 # CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m)
memory: 500Mi # 內存使用量
limits: # 資源限制
cpu: 1
memory: 1000Mi
ports:
- containerPort: 30000 # 容器開發對外的端口
name: httpd # 名稱
protocol: TCP
livenessProbe: # pod內容器健康檢查的設置
httpGet: # 通過httpget檢查健康,返回200-399之間,則認為容器正常
path: / # URI地址
port: 80
# host: 127.0.0.1 #主機地址
scheme: HTTP
initialDelaySeconds: 180 # 表明第一次檢測在容器啟動后多長時間后開始
timeoutSeconds: 5 # 檢測的超時時間
periodSeconds: 15 # 檢查間隔時間
# 也可以用這種方法
# exec: 執行命令的方法進行監測,如果其退出碼不為0,則認為容器正常
# command:
# - cat
# - /tmp/health
# 也可以用這種方法
# tcpSocket: //通過tcpSocket檢查健康
# port: number
lifecycle: # 生命周期管理
postStart: # 容器運行之前運行的任務
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop:#容器關閉之前運行的任務
exec:
command: ['service httpd stop']
volumeMounts: # 掛載持久存儲卷
- name: volume # 掛載設備的名字,與volumes[*].name 需要對應
mountPath: /data # 掛載到容器的某個路徑下
readOnly: True
volumes: # 定義一組掛載設備
- name: volume # 定義一個掛載設備的名字
# meptyDir: {}
hostPath:
path: /opt # 掛載設備類型為hostPath,路徑為宿主機下的/opt,這里設備類型支持很多種
# nfs