備戰CKA每日一題——第4天

  • 2019 年 11 月 25 日
  • 筆記

看到大家這幾天的答題情況,還是很不錯的,但是還需要認真審題,按要求答題,還有就是記得練習查詢官網文檔,並把標籤分類保存下來。

昨日考題

通過單個命令創建一個deployment並暴露Service。deployment和Service名稱為cka-1120,使用nginx鏡像, deployment擁有2個pod

昨日答案

[root@liabio ~]# kubectl run  cka-1120--replicas 2 --expose=true --port=80 --image=nginxkubectl 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 createddeployment.apps/cka-1120 created  [root@liabio ~]# kubectl get all | grep cka-1120pod/cka-1120-554b9c4798-7jcrb1/1Running0118mpod/cka-1120-554b9c4798-fpjwj   1/1Running0118mservice/cka-1120ClusterIP10.108.140.25<none>80/TCP           118mdeployment.apps/cka-11202/222118m

昨日解析

官網中提供了詳細的kubectl使用方法,位於REFERENCE–kubectl CLI–kubectl Commands標籤下。即:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#run

kubectl run會創建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,指定實例數,默認為1;

–expose如果為true,會創建有ClusterIP的service,默認為false;

–port表示容器暴露的埠,如果expose為true,該埠也是service的埠;

–image指定容器用的鏡像;

–dry-run為true時,只列印將要發送的對象,而不真正發送它,默認為false。

創建名為cka-1120-01,帶環境變數的deployment

kubectl run cka-1120-01 --image=nginx --env="DNS_DOMAIN=cluster.local" --env="POD_NAMESPACE=default"

創建名為cka-1120-02,帶label的deployment

kubectl run cka-1120-02 --image=nginx --labels="app=nginx,env=prod"

還有一個–restart參數,默認為Always,如果設置為OnFailure,則job會被創建;如果設置為Never,則普通Pod會被創建。

[root@liabio ~]# kubectl run cka-1120-03 --image=nginx --restart=OnFailurekubectl 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=Neverpod/cka-1120-04 created

參數–schedule指定cronjob的定時規則,如果指定該參數,則會創建出cronjob

[root@liabio ~]# kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'cronjob.batch/pi created

目前不支援直接創建Statefulset、Daemonset等資源對象。

kubectl run執行後,到底發生了什麼?有必要看看kubectl源碼,入口函數在$GOPATHsrck8s.iokubernetescmdclicheckcheckcliconventions.go中

其中cmd.NewKubectlCommand為構建kubectl以及其子命令行參數。最終的執行業務邏輯的程式碼都在pkgkubectl包下面。不同的子命令:apply、run、create入口對應的在pkgkubectlcmd下面:

最重要的o.Run(f, cmd, args)中會對kubectl run傳入的參數進行一系列校驗,填充默認值。

在360行調用o.createGeneratedObject根據不同的generator生成deployment、cronjob、job、pod等資源對象,並向apiserver發送創建請求。

如果設置了expose為true,在372行,同樣的調用o.createGeneratedObject生成並創建service。

o.createGeneratedObject方法第649行,根據不同的generator實現生成不同的資源對象。

run命令對應的generator實現有以下幾種,程式碼位於pkgkubectlgenerateversionedgenerator.go中的DefaultGenerators函數。

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發送http創建請求。

具體的kubectl run命令的程式碼,感興趣的同學可以進一步深挖,我也會在後續的源碼分析系列文章中進行更詳細的解析。

今日考題

通過命令行,使用nginx鏡像創建一個pod並手動調度到節點名為node1121節點上,Pod的名稱為cka-1121,答題最好附上,所用命令、創建Pod所需最精簡的yaml;如果評論有限制,請把注意點列出,主要需列出手動調度怎麼做?注意:手動調度是指不需要經過kube-scheduler去調度。