本活動在微信公眾號【我的小碗湯】上舉行,有送書活動!這里參與答題不能參與到送書活動哦!
昨日考題
通過單個(gè)命令創(chuàng)建一個(gè)deployment并暴露Service。deployment和Service名稱為cka-1120,使用nginx鏡像, deployment擁有2個(gè)pod
昨日答案
[root@liabio ~]# kubectl run cka-1120 --replicas 2 --expose=true --port=80 --image=nginx
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
service/cka-1120 created
deployment.apps/cka-1120 created
[root@liabio ~]# kubectl get all | grep cka-1120
pod/cka-1120-554b9c4798-7jcrb 1/1 Running 0 118m
pod/cka-1120-554b9c4798-fpjwj 1/1 Running 0 118m
service/cka-1120 ClusterIP 10.108.140.25 <none> 80/TCP 118m
deployment.apps/cka-1120 2/2 2 2 118m
昨日解析
官網(wǎng)中提供了詳細(xì)的kubectl使用方法,位于REFERENCE-->>kubectl CLI-->>kubectl Commands標(biāo)簽下。
即:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#run
kubectl run會創(chuàng)建deployment或者job來管理Pod,命令語法如下:
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]
NAME指定deployment和service的名稱;
--replicas縮寫-r,指定實(shí)例數(shù),默認(rèn)為1;
--expose如果為true,會創(chuàng)建有ClusterIP的service,默認(rèn)為false;
--port表示容器暴露的端口,如果expose為true,該端口也是service的端口;
--image指定容器用的鏡像;
--dry-run為true時(shí),只打印將要發(fā)送的對象,而不真正發(fā)送它,默認(rèn)為false。
創(chuàng)建名為cka-1120-01,帶環(huán)境變量的deployment
kubectl run cka-1120-01 --image=nginx --env="DNS_DOMAIN=cluster.local" --env="POD_NAMESPACE=default"
創(chuàng)建名為cka-1120-02,帶label的deployment
kubectl run cka-1120-02 --image=nginx --labels="app=nginx,env=prod"
還有一個(gè)--restart參數(shù),默認(rèn)為Always,如果設(shè)置為OnFailure,則job會被創(chuàng)建;如果設(shè)置為Never,則普通Pod會被創(chuàng)建。
[root@liabio ~]# kubectl run cka-1120-03 --image=nginx --restart=OnFailure
kubectl run --generator=job/v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
job.batch/cka-1120-03 created
[root@liabio ~]#
[root@liabio ~]# kubectl run cka-1120-04 --image=nginx --restart=Never
pod/cka-1120-04 created
參數(shù)--schedule指定cronjob的定時(shí)規(guī)則,如果指定該參數(shù),則會創(chuàng)建出cronjob
[root@liabio ~]# kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'
cronjob.batch/pi created
目前不支持直接創(chuàng)建Statefulset、Daemonset等資源對象。
kubectl run執(zhí)行后,到底發(fā)生了什么?
有必要看看kubectl源碼,入口函數(shù)在$GOPATH\src\k8s.io\kubernetes\cmd\clicheck\check_cli_conventions.go中

其中cmd.NewKubectlCommand為構(gòu)建kubectl以及其子命令行參數(shù)。最終的執(zhí)行業(yè)務(wù)邏輯的代碼都在pkg\kubectl包下面。
不同的子命令:apply、run、create入口對應(yīng)的在pkg\kubectl\cmd下面:

最重要的o.Run(f, cmd, args)中會對kubectl run傳入的參數(shù)進(jìn)行一系列校驗(yàn),填充默認(rèn)值。
在360行調(diào)用o.createGeneratedObject根據(jù)不同的generator生成deployment、cronjob、job、pod等資源對象,并向apiserver發(fā)送創(chuàng)建請求。
如果設(shè)置了expose為true,在372行,同樣的調(diào)用o.createGeneratedObject生成并創(chuàng)建service。

o.createGeneratedObject方法第649行,根據(jù)不同的generator實(shí)現(xiàn)生成不同的資源對象。

run命令對應(yīng)的generator實(shí)現(xiàn)有以下幾種,代碼位于pkg\kubectl\generate\versioned\generator.go中的DefaultGenerators函數(shù)。
case "run":
generator = map[string]generate.Generator{
RunV1GeneratorName: BasicReplicationController{},
RunPodV1GeneratorName: BasicPod{},
DeploymentV1Beta1GeneratorName: DeploymentV1Beta1{},
DeploymentAppsV1Beta1GeneratorName: DeploymentAppsV1Beta1{},
DeploymentAppsV1GeneratorName: DeploymentAppsV1{},
JobV1GeneratorName: JobV1{},
CronJobV2Alpha1GeneratorName: CronJobV2Alpha1{},
CronJobV1Beta1GeneratorName: CronJobV1Beta1{},
}
o.createGeneratedObject方法第689行對生成的資源對象向APIServer發(fā)送http創(chuàng)建請求。

具體的kubectl run命令的代碼,感興趣的同學(xué)可以進(jìn)一步深挖,我也會在后續(xù)的源碼分析系列文章中進(jìn)行更詳細(xì)的解析。
今日考題
通過命令行,使用nginx鏡像創(chuàng)建一個(gè)pod并手動調(diào)度到節(jié)點(diǎn)名為node1121節(jié)點(diǎn)上,Pod的名稱為cka-1121,答題最好附上,所用命令、創(chuàng)建Pod所需最精簡的yaml;如果評論有限制,請把注意點(diǎn)列出,主要需列出手動調(diào)度怎么做?
注意:手動調(diào)度是指不需要經(jīng)過kube-scheduler去調(diào)度。
作者簡潔
作者:小碗湯,一位熱愛、認(rèn)真寫作的小伙,目前維護(hù)原創(chuàng)公眾號:『我的小碗湯』,專注于寫golang、docker、kubernetes等知識等提升硬實(shí)力的文章,期待你的關(guān)注。 轉(zhuǎn)載說明:務(wù)必注明來源(注明:來源于公眾號:我的小碗湯, 作者:小碗湯)
作者簡潔
作者:小碗湯,一位熱愛、認(rèn)真寫作的小伙,目前維護(hù)原創(chuàng)公眾號:『我的小碗湯』,專注于寫go語言、docker、kubernetes、java等開發(fā)、運(yùn)維知識等提升硬實(shí)力的文章,期待你的關(guān)注。轉(zhuǎn)載說明:務(wù)必注明來源(注明:來源于公眾號:我的小碗湯,作者:小碗湯)