K8S 里所有的資源或者配置文件都可以用 yaml 或 Json 定義。YAML 是一個(gè) JSON/ 的超集,任何有效 JSON 文件也都是一個(gè)有效的YAML文件。
Yaml 語(yǔ)法規(guī)范
- 用縮進(jìn)表示層級(jí)關(guān)系,一般用 2 個(gè)或者 4個(gè)空格(類(lèi)似 python 語(yǔ)法)
- 不允許使用 Tab 鍵拍霜,只允許使用空格
K8S Yaml 示例
---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: flaskapp-demo
image: jcdemo/flaskapp
ports:
- containerPort: 5000
K8S Yaml 詳細(xì)說(shuō)明
K8S Yaml 配置文件主要分為基本標(biāo)簽、元數(shù)據(jù)標(biāo)簽薪介、資源內(nèi)容 3 個(gè)部分
基本標(biāo)簽
apiVersion: v1
#必選祠饺,版本號(hào),例如v1
kind: Pod
#必選汁政,Pod
元數(shù)據(jù)標(biāo)簽
metadata: #必選道偷,元數(shù)據(jù)
name: string #必選,Pod名稱(chēng)
namespace: string #必選记劈,Pod所屬的命名空間
labels: #自定義標(biāo)簽
- name: string #自定義標(biāo)簽名字
annotations: #自定義注釋列表
- name: string
內(nèi)容標(biāo)簽
spec: #必選勺鸦,Pod中容器的詳細(xì)定義
containers: #必選,Pod中容器列表
- name: string #必選目木,容器名稱(chēng)
image: string #必選换途,容器的鏡像名稱(chēng)
imagePullPolicy: [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優(yōu)先使用本地鏡像,否則下載鏡像刽射,Nerver表示僅使用本地鏡像
command: [string] #容器的啟動(dòng)命令列表军拟,如不指定,使用打包時(shí)使用的啟動(dòng)命令
args: [string] #容器的啟動(dòng)命令參數(shù)列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內(nèi)部的存儲(chǔ)卷配置
- name: string #引用pod定義的共享存儲(chǔ)卷的名稱(chēng)誓禁,需用volumes[]部分定義的的卷名
mountPath: string #存儲(chǔ)卷在容器內(nèi)mount的絕對(duì)路徑懈息,應(yīng)少于512字符
readOnly: boolean #是否為只讀模式
ports: #需要暴露的端口庫(kù)號(hào)列表
- name: string #端口號(hào)名稱(chēng)
containerPort: int #容器需要監(jiān)聽(tīng)的端口號(hào)
hostPort: int #容器所在主機(jī)需要監(jiān)聽(tīng)的端口號(hào),默認(rèn)與Container相同
protocol: string #端口協(xié)議现横,支持TCP和UDP漓拾,默認(rèn)TCP
env: #容器運(yùn)行前需設(shè)置的環(huán)境變量列表
- name: string #環(huán)境變量名稱(chēng)
value: string #環(huán)境變量的值
resources: #資源限制和請(qǐng)求的設(shè)置
limits: #資源限制的設(shè)置
cpu: string #Cpu的限制阁最,單位為core數(shù)戒祠,將用于docker run --cpu-shares參數(shù)
memory: string #內(nèi)存限制沸伏,單位可以為Mib/Gib造虏,將用于docker run --memory參數(shù)
requests: #資源請(qǐng)求的設(shè)置
cpu: string #Cpu請(qǐng)求拙已,容器啟動(dòng)的初始可用數(shù)量
memory: string #內(nèi)存清楚漱牵,容器啟動(dòng)的初始可用數(shù)量
livenessProbe: #對(duì)Pod內(nèi)個(gè)容器健康檢查的設(shè)置拼卵,當(dāng)探測(cè)無(wú)響應(yīng)幾次后將自動(dòng)重啟該容器硕并,檢查方法有exec纳猪、httpGet和tcpSocket陋葡,對(duì)一個(gè)容器只需設(shè)置其中一種方法即可
exec: #對(duì)Pod容器內(nèi)檢查方式設(shè)置為exec方式
command: [string] #exec方式需要制定的命令或腳本
httpGet: #對(duì)Pod內(nèi)個(gè)容器健康檢查方法設(shè)置為HttpGet,需要制定Path救拉、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對(duì)Pod內(nèi)個(gè)容器健康檢查方式設(shè)置為tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啟動(dòng)完成后首次探測(cè)的時(shí)間难审,單位為秒
timeoutSeconds: 0 #對(duì)容器健康檢查探測(cè)等待響應(yīng)的超時(shí)時(shí)間,單位秒亿絮,默認(rèn)1秒
periodSeconds: 0 #對(duì)容器監(jiān)控檢查的定期探測(cè)時(shí)間設(shè)置告喊,單位秒,默認(rèn)10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure]#Pod的重啟策略派昧,Always表示一旦不管以何種方式終止運(yùn)行黔姜,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟蒂萎,Nerver表示不再重啟該P(yáng)od
nodeSelector: obeject #設(shè)置NodeSelector表示將該P(yáng)od調(diào)度到包含這個(gè)label的node上秆吵,以key:value的格式指定
imagePullSecrets: #Pull鏡像時(shí)使用的secret名稱(chēng),以key:secretkey格式指定
- name: string
hostNetwork:false #是否使用主機(jī)網(wǎng)絡(luò)模式五慈,默認(rèn)為false纳寂,如果設(shè)置為true,表示使用宿主機(jī)網(wǎng)絡(luò)
volumes: #在該pod上定義共享存儲(chǔ)卷列表
- name: string #共享存儲(chǔ)卷名稱(chēng) (volumes類(lèi)型有很多種)
emptyDir: {} #類(lèi)型為emtyDir的存儲(chǔ)卷泻拦,與Pod同生命周期的一個(gè)臨時(shí)目錄烈疚。為空值
hostPath: string #類(lèi)型為hostPath的存儲(chǔ)卷,表示掛載Pod所在宿主機(jī)的目錄
path: string #Pod所在宿主機(jī)的目錄聪轿,將被用于同期中mount的目錄
secret: #類(lèi)型為secret的存儲(chǔ)卷爷肝,掛載集群與定義的secre對(duì)象到容器內(nèi)部
scretname: string
items:
- key: string
path: string
configMap: #類(lèi)型為configMap的存儲(chǔ)卷,掛載預(yù)定義的configMap對(duì)象到容器內(nèi)部
name: string
items:
- key: string
path: string
附A:Pod 三種重啟策略
Always:
當(dāng)容器終止退出后陆错,總是重啟容器灯抛,默認(rèn)策略。
OnFailure:
當(dāng)容器異常退出(退出狀態(tài)碼非0)時(shí)音瓷,才重啟容器对嚼。
Never:
當(dāng)容器終止退出,從不重啟容器绳慎。
示例:test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
labels:
os: ubuntu
spec:
containers:
- name: hello
image: ubuntu:14.04
env:
- name: Test
value: "123456"
command: ["bash","-c","while true;do date;sleep 1;done"]
restartPolicy: OnFailure
附A:Deployment
Deployment 是 K8S 1.2的新功能
應(yīng)用場(chǎng)景
- 1.部署一個(gè)新的應(yīng)用程序
- 2.實(shí)現(xiàn)滾動(dòng)更新纵竖、灰度發(fā)布
- 3.部署應(yīng)用時(shí)如果出現(xiàn)問(wèn)題,能夠回滾到之前的版本
示例:
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12.2
ports:
- containerPort: 80
創(chuàng)建 depolyment
創(chuàng)建 deployment 說(shuō)明:
kubectl create -f deployment_nginx.yml
kubectl get deployment -o wide
kubectl get rs
kubectl get pods
升級(jí)應(yīng)用
#更新APP-執(zhí)行滾動(dòng)更新
#滾動(dòng)更新允許增量更新新的Pods實(shí)例杏愤,部署的更新以零宕機(jī)時(shí)間進(jìn)行靡砌。新的Pod將在具有可用資源的節(jié)點(diǎn)上進(jìn)行調(diào)度。
kubectl set image deployment nginx-deployment nginx=nginx:1.13
回滾應(yīng)用
#查看歷史版本
kubectl rollout history deployment nginx-deployment
#回滾到歷史版本
kubectl rollout undo deployment nginx-deployment