iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 8
1
DevOps

從題目中學習k8s系列 第 8

【從題目中學習k8s】-【Day8】K8s常用指令 (Cheat Sheet)&解題技巧


title: 【從題目中學習k8s】-【Day8】K8s常用指令 (Cheat Sheet)&解題技巧
description: 以無比的恆毅力堅持30天鍊成鐵人--連續30天,一天發表一篇IT技術文章

【從題目中學習k8s】-【Day8】K8s常用指令 (Cheat Sheet)&解題技巧

tags: DevOps CICD K8s Docker

前言

有了前面幾天的鋪墊後,大家應該對K8s都有基本的認識了,還不太了解的朋友也沒關係,後面我們會藉由解題過程來講解觀念,這也就是我們的宗旨~ 那我們今天先來了解一下考前有哪些技巧是必備的吧~


常用操作

不知道大家有沒有發現,筆者前幾天下的一些 command 好像怪怪的,例如kubectl get no,這個 no 是甚麼呢?其實就是 node 的縮寫拉~ 其實在 K8s 中有很多類似這種的縮寫,下command時可以更快速,用 kubectl api-resources 就可以查看 K8s 所有物件和它們的縮寫喔~

其中有個 NAMESPACED 欄位是用來表示該物件是否可以用 namespaced 來區隔。若是true,則該物件屬於 namespaced 範圍的物件;若否,則該物件為 Cluster scoped 的物件,無法assign它的 namespaced

  • 查看該物件數量 (數量 -1)
$ kubectl get <object> | wc -l
15
## 代表有14個<object>
  • 創建Pod
$ kubectl run <pod-name> --image=<image> --restart=Never --dry-run=client -o yaml > pod-def.yaml
$ kubectl apply -f pod-def.yaml

restart=Never用來識別Pod,若restart=Always則是deployment;
--dry-run=client表示一些default的參數先拿掉,暫時不需要submit出去 (通常在輸出yaml時使用),若要直接創建物件不輸出yaml就無需加此參數

以前kubectl run命令可以用來創建幾乎所有物件,只要在後方加上不同參數識別即可 (例如創建Pod要加上--generator=run-pod/v1)。但新版本kubectl run子命令現在只能創建Pod了,無法創建DeploymentJob等其他資源了。原因有二:

  • kubectl run命令參數太多了,不利於新手學習。即使是Kubernetes老手,也不一定能完全記住這麼多的參數,不同的參數行為還不一樣。
  • 程式碼維護越來越困難。

要用kubectl創建其他物件可以用kubectl create指令,例如:

$ kubectl create deploy nginx-deploy --image=nginx --dry-run=client -o yaml > deploy.yaml

其他資源比如 jobcronjobnamespacequotaconfigmapserviceserviceaccount 等都可以通過kubectl create命令很方便地快速創建

注意新版本是 --dry-run=client,舊版本没有client參數,新版本不寫會警告,建議加上。

這邊有個非常非常重要的觀念要提醒大家,那就是不要手刻YAML檔,非常浪費時間。你可以上 k8s官網 查找範例YAML (考試時是允許查找官方文件的,其他參考資料不行),或是用 kubectl run 命令先創建出一個基本YAML,再以此去修改。畢竟YAML文件真不是讓人寫的,應該讓電腦去自動生成。

  • 查看Pod label
kubectl get pod --show-labels
  • 新增Pod label
kubectl label po <pod-name> <key>=<value>
  • 刪除Pod label
kubectl label po <pod-name> <key>-
  • Pod下內部指令
kubectl exec <pod-name> -- <command>
  • Pod expose出去 (創建一個Service)
kubectl expose po <pod-name> --type=NodePort --name=<svc-name> --port=80
  • 查看log
$ kubectl logs <pod-name>
$ kubectl logs <pod-name> > haha.txt
  • 查看initContainerlog
$ kubectl logs <pod-name> -c <initContainer-name>
  • 查看Cluster資訊
$ kubectl config view
$ kubectl cluster-info

Kubectl help

命令參數全部記住肯定是不可能的也完全沒必要,kubectlhelp真是做得不錯,不僅有命令用法,還提供demo範例,很多直接複製就可以用。

$ kbbectl -h
$ kbbectl run -h
$ kbbectl expose -h
...

對於多值參數,如果後面的值為[],比--env=[],則表示該參數可以指定多次,如果後面不是[],則通常不可以指定多次,如何表示多值需要看參數描述,通常是逗號隔開,比如-l或者--labels就是通過逗號隔開指定多個值。

-- 符號的意思是,這個參數表示命令行參數終止解析標誌

建議 kubectl run 命令的 --command 參數放到最後,且一定要使用--符號隔開,避免kubectl過度解析。
例如:

$ kubectl run nginx --image nginx \
  --env='USERNAME=alice' \
  --env 'PASSWORD=123456' \
  -l 'app=web,env=test' \
  -o yaml --dry-run=client \
  --command -- sleep 3600 \
  > test.yaml

如果忘了 Kubernetes 資源的宣告方式或者參數,除了可以網站搜索,還可以使用explain查看。

比如忘了hostPath參數:

kubectl explain Pod.spec.volumes.hostPath

Kubectl Autocomplete

kubectl自動補齊功能可參考這裡(考試環境通常都會幫你裝好)。安裝指令如下:

$ source <(kubectl completion bash) # setup autocomplete in bash into the current shell, bash-completion package should be installed first.
$ echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.
$ alias k=kubectl
$ complete -F __start_kubectl k

Cheat Sheet **

因為考試的時候是允許查找官網資料的,因此如何查找需要的資料是一個非常重要的技巧,這邊推薦一個超級超級超級超級重要的網站,就是kubectl Cheat Sheet,這個網站非常好用也非常重要,裡面有很多小技巧可以讓你節省非常多時間,考前一定要再三複習~


結論

今天介紹一些考試前需要知道的小技巧,還有一些好用的參考資料。再提醒大家一次,不要手刻YAML,一定要善用k8s.io以及kubectl Cheat Sheet 這些資料。好啦,我們前置作業都準備好了,明天就開始做題目吧~

參考資料

k8s.io
kubectl Cheat Sheet
CKA/CKAD Information Collation

Thank you!

You can find me on

  • george4908090@gmail.com

上一篇
【從題目中學習k8s】-【Day7】K8s中的TLS
下一篇
【從題目中學習k8s】-【Day9】第一題 - Pod Scheduling 1
系列文
從題目中學習k8s31

尚未有邦友留言

立即登入留言