網(wǎng)站開發(fā)要用到的工具鄭州網(wǎng)絡(luò)營銷公司哪家好
在k8s當(dāng)中支持兩種聲明資源的方式:
1、 yaml格式:主要用于和管理資源對象
2、 json格式:主要用于在API接口之間進(jìn)行消息傳遞
聲明式管理方法(yaml)文件
1、 適合對資源的修改操作
2、 聲明式管理依賴于yaml文件,所有的內(nèi)容都在yaml文件當(dāng)中。
3、 編輯好的yaml文件還是要靠陳述式命令發(fā)布到k8s集群當(dāng)中。
分別有三種方式:
create
#只能創(chuàng)建,不能更新。從指定的yaml文件中讀取配置。創(chuàng)建服務(wù)。不能更新服務(wù)。
apply -f
#既可以創(chuàng)建資源對象,也可以更新資源對象。如果yaml文件更改了,apply可以直接更新資源對象。(使用最多)
delete -f
#刪除yaml文件中聲明的資源對象。例如deployment、pod、service
如何生成yaml文件
1、 手動創(chuàng)建
2、 根據(jù)已有的資源直接生成
kubectl get deployments.apps nginx -o yaml > /opt/test.yaml
#基于已有資源直接創(chuàng)建yaml文件
kubectl apply -f test.yaml
#執(zhí)行yaml文件
#只能運(yùn)行一次。
#運(yùn)行成功后如果還需要修改需要基于最新的deployment再創(chuàng)建yaml文件
kubectl apply -f test.yaml --force
#強(qiáng)制執(zhí)行yaml文件
#如果不想使用最新的deployment再創(chuàng)建yaml文件可以使用--force強(qiáng)制執(zhí)行
只要是基于yaml文件創(chuàng)建的的都可以導(dǎo)出
kubectl get svc nginx-service -o yaml > /opt/service.yaml
#基于已有的yaml文件生成
基于yaml文件創(chuàng)建的pod也都可以導(dǎo)出
kubectl get pod nginx-6fdbccbdbb-7lkzn -o yaml > /opt/service.yaml
#基于已有的yaml文件生成
常見的yaml類型
1、 deployment的yaml文件格式用于部署還有daemonset和statefulser
2、 service的yaml文件用于暴露服務(wù)端口
3、 不基于控制器的pod的yaml文件
deployment的yaml文件格式
kubectl explain deployment
#查看deployment詳細(xì)信息
#只有deployment的API-VERSION版本是apps/v1vim nginx1.yaml
#創(chuàng)建yaml文件apiVersion: apps/v1
#聲明api版本的標(biāo)簽
kind: Deployment
#定義資源的類型、角色或者是控制器.例如:service/pod/deployment/job/ingress/daemonset/statefulset
metadata:name: nginx1
#定義創(chuàng)建資源名稱namespace: zyg
#定義命名空間labels:bqb: nginx1
#定義標(biāo)簽名稱
#定義創(chuàng)建資源的元數(shù)據(jù)信息。例如:資源名稱以及資源對象部署的命名空間也可以在這里聲明、標(biāo)簽等等信息
spec:
#定義deployment資源需要的參數(shù)和屬性replicas: 3
#定義副本數(shù)selector:
#定義標(biāo)簽選擇器。屬于哪個標(biāo)簽。滿足哪個標(biāo)簽的資源定義副本數(shù)為3matchLabels:bqb: nginx1
#選擇匹配的標(biāo)簽需要和上面定義的標(biāo)簽完全對應(yīng)template:
#定義業(yè)務(wù)的模板。如果定義了多個副本,那么所有的副本屬性都會按照模板的配置進(jìn)行匹配。副本使用的配置是>哪些。metadata:labels:bqb: nginx1
#定義了pod的副本都使用元數(shù)據(jù)的標(biāo)簽和屬性來進(jìn)行匹配spec:containers:- name: nginximage: nginx:1.10ports:- containerPort: 80
#聲明容器的相關(guān)參數(shù)。包括:容器的命名/容器的版本/容器的暴露端口號。
#雖然這里指定了暴露端口號是80,nginx鏡像默認(rèn)端口就是80.
#即使定義了別的端口,也不會改變?nèi)萜鞯哪J(rèn)端口。
#如果不是默認(rèn)端口,則需要在這里聲明端口號
# ports:
# - containerPort: 80
service的yaml文件
kubectl explain service
#查看service詳細(xì)信息vim nginx-service.yaml#定義API版本:
apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: zyglabels:bqb: nginx1
#元數(shù)據(jù)信息包括:service的名稱,所屬的命名空間。以及要匹配的deployment的標(biāo)簽。要和之前的保持一致
spec:type: NodePortports:- port: 80
#定義service內(nèi)部暴露的端口targetPort: 80
#定義容器對外暴露的端口nodePort: 30000
#定義外部端口如果有需要可以直接定義selector:bqb: nginx1
#這里的標(biāo)簽是為了匹配所有的標(biāo)簽都是bqb: nginx1的pod的后端提供服務(wù)kubectl apply -f nginx-service.yaml
kubectl get svc -n zyg
pod的yaml文件
kubectl explain pod
#查看pod詳細(xì)信息vim nginx-pod.yaml#定義pod的apiVersion
apiVersion: v1
#定義資源的類型
kind: Pod
#定義元數(shù)據(jù)信息,pod的名稱/所屬的命名空間/標(biāo)簽等信息
metadata:name: centos1namespace: zyg
#定義運(yùn)行在哪個命名空間
spec:restartPolicy: Never
#pod內(nèi)的容器如果啟動失敗或者有問題時的重啟策略
#Always:永不重啟/Never:從不重啟/Onfailure:只有異常退出才會重啟。狀態(tài)碼非0則重啟.如果狀態(tài)碼是0則不重啟
#restartPolicy:是容器的重啟策略。
#如果資源類型定義為deployment這個容器的重啟策略只能是Always。不寫默認(rèn)是Alwayscontainers:- name: centosimage: centos:7kubectl apply -f nginx-pod.yaml
kubectl get pods -n zyg
restartPolicy的三種狀態(tài)碼
pod內(nèi)的容器如果啟動失敗或者有問題時的重啟策略
Always:一直重啟
Never:從不重啟
Onfailure:只有異常退出才會重啟。狀態(tài)碼非0則重啟.如果狀態(tài)碼是0則不重啟
command和args
command、args定義容器運(yùn)行的命令參數(shù)。類似于docker中的CMD和entrypoint
command、arges只能存在一個。args可以給command傳參
containers:- name: centosimage: centos:7command: ["echo"]args: ["hello,world!"]
#啟動時候默認(rèn)執(zhí)行的命令
#args可以給command傳參類似于(CMD和entrypoint)
#如果在yaml文件中定義了輸出內(nèi)容,就會覆蓋掉原來容器內(nèi)部的標(biāo)準(zhǔn)輸出
command和args都會覆蓋原容器的標(biāo)準(zhǔn)輸出(CMD和entrypoint)
args的寫法
例如:
寫法1:
containers:- name: centosimage: centos:7args: - /bin/bash
#默認(rèn)執(zhí)行的shell- -c
#表示命令行- while true; do sleep 3600; done
#執(zhí)行的命令,多個命令需要用分號隔開寫法2:containers:- name: centosimage: centos:7args: ["/bin/bash", "-c", "touch /opt/123.txt; echo 123 > /opt/123.txt; sleep 3600"]
#在一行定義多個內(nèi)容需要用逗號隔開。多個命令需要用分號隔開
#執(zhí)行多個命令必須要加"/bin/bash", "-c"
#-c:表示輸出命令的格式kubectl exec -it centos1 -n zyg -- cat /opt/123.txt
#使用--可以直接在容器外部查看容器內(nèi)部的信息
command寫法
寫法1:containers:- name: centosimage: centos:7command: ["/bin/bash", "-c", "touch /opt/123.txt; echo 123 > /opt/123.txt; sleep 3600"]
#在一行定義多個內(nèi)容需要用逗號隔開。多個命令需要用分號隔開
#執(zhí)行多個命令必須要加"/bin/bash", "-c"寫法2:containers:- name: centosimage: centos:7command: ["/usr/bin/test", "-e", "/etc/passwd"]
#這樣的格式只能執(zhí)行單個命令。需要加上絕對路徑
command和args的總結(jié)
同一個yaml文件內(nèi)command和args只能存在一個表示容器啟動時的命令
除非需要傳參的時候command和args可以同時出現(xiàn)
無論是args或者是command都會覆蓋CMD和entrypoint標(biāo)準(zhǔn)輸出
建議寫在一行提高可讀性
總結(jié)
1、 三種發(fā)布方式
藍(lán)綠發(fā)布、灰度發(fā)布(目前最常用)、滾動發(fā)布(基于deployment默認(rèn)的發(fā)布模式)
灰度發(fā)布(目前最常用):基于deployment的滾動發(fā)布,使用了暫停的機(jī)制。pause(暫停)/resume(繼續(xù))。只有所有升級完畢之后才可以回滾
2、 三種yaml文件類型
1、 deployment的yaml文件格式用于部署還有daemonset和statefulser
2、 service的yaml文件用于暴露服務(wù)端口
3、 不基于控制器的pod的yaml文件
yaml文件內(nèi)的模板模塊:
deployment類型
apiVersion模塊:apps/v1。只有deployment是apps/v1
kind模塊:所有的類型都是由kind聲明
在kind之后生成
kind之后的第一個字母需要大寫
metadata模塊:這一部分中namespace(命名空間)需要已經(jīng)存在,否則不會自動創(chuàng)建。需要手動創(chuàng)建。
spec模塊:定義副本數(shù)、標(biāo)簽選擇器等信息
template模塊:定義了業(yè)務(wù)模板需要和之前的標(biāo)簽保持一致
spec模塊:這里的spec屬于業(yè)務(wù)模板模塊。這里定義的是容器的信息。定義容器名稱,定義鏡像版本。也可以指定容器的暴露端口。
但是需要注意。如果容器的默認(rèn)端口沒有修改。yaml文件中定義暴露端口不會生效。所以如果是默認(rèn)的服務(wù)可以不加定義端口
service類型
apiVersion模塊:v1
spec模塊:中port是service的暴露端口,targetPort是容器的暴露端口。
tpye模塊:的類型
pod類型
apiVersion模塊:v1
spec模塊:這一模塊中的 restartPolicy定義pod內(nèi)的容器如果啟動失敗或者有問題時的重啟策略 Always:一直重啟
Never模塊:從不重啟
Onfailure:只有異常退出才會重啟。狀態(tài)碼非0則重啟.如果狀態(tài)碼是0則不重啟
restartPolicy:是容器的重啟策略。
如果資源類型定義為deployment這個容器的重啟策略只能是Always。不寫默認(rèn)是Always
command和args
同一個yaml文件內(nèi)command和args只能存在一個表示容器啟動時的命令,不要同時出現(xiàn)
除非需要傳參的時候可以同時出現(xiàn)
無論是args或者是command都會覆蓋CMD和entrypoint標(biāo)準(zhǔn)輸出
建議寫在一行提高可讀性