備戰(zhàn)CKA每日一題——第4天 | 熟練掌握kubectl命令進(jìn)行創(chuàng)建資源對象操作,并從源碼進(jìn)行解析

本活動在微信公眾號【我的小碗湯】上舉行,有送書活動!這里參與答題不能參與到送書活動哦!

昨日考題

通過單個(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ù)必注明來源(注明:來源于公眾號:我的小碗湯,作者:小碗湯)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容