Table of contents
1 kubectl 介紹
kubectl
係一個用黎操作雲端 K8s clusters 既 K8s 資源既一個 CLI 工具。
2 登入 K8s cluster
用之前需要先成功登入 K8s cluster,拎到 client certificate、client key、token 等等既 data,之後就可以操作佢上面既 K8s 資源。
呢啲 data 儲存喺 C:/Users/<username>/.kube/config
裡面。
我地可以登入多個 K8s clusters,然後喺佢地之間 switch 黎 switch 去。
2.1 本地開發環境:Docker Desktop
如果係喺本地開發環境,直接喺 Docker Desktop 度 enable Kubernetes 就唔洗額外登入。
2.2 本地開發環境:Minikube
如果係喺本地開發環境,直接用 Minikube 就唔洗額外登入。
2.3 登入 Azure Kubernetes Service(AKS)
如果係用 AKS,就要用 Azure CLI 登入:
az login -u <email>
az aks get-credentials -n <cluster name> -g <resource group> --admin --overwrite-existing
3 kubectl 指令
3.1 切換 cluster
kubectl config use-context <context name>
3.2 查看目前 cluster
我地可以睇到已經登入左既 cluster、佢既 context name、目前既默認 namespace,以及目前既 cluster(打左星號 *
):
kubectl config get-contexts
3.3 切換默認 namespace
kubectl config set-context --current --namespace=<namespace>
如果唔先切換去目標 namespace,而目標 namespace 同現時默認既 namespace 唔同既話,咁就要喺每個 kubectl
command 都用 -n <namespace>
option 去指定目標 namespace。
3.4 列出所有 K8s 資源種類
kubectl api-resources
3.5 列出所有 K8s 資源
kubectl get all
3.6 列出某種類既 K8s 資源
kubectl get <resource type>
3.6.1 Pod
睇 pod name、幾多個 containers 已經 ready、status、create 左幾耐:
kubectl get pods
3.6.2 Deployment
kubectl get deployments
3.6.3 ReplicaSet
kubectl get replicasets
3.6.4 HorizontalPodAutoscaler
kubectl get horizontalpodautoscalers
3.6.5 AuthorizationPolicy
kubectl get authorizationpolicys
3.6.6 Service
kubectl get services
3.6.7 VirtualService
kubectl get virtualservices
3.6.8 DestinationRule
kubectl get destinationrules
3.6.9 ServiceAccount
kubectl get serviceaccounts
3.6.10 Event
kubectl get events
3.6.11 Node
睇 nodes 同埋佢地既 container runtime 版本(containerd
或者 docker
):
kubectl get nodes -o wide
3.7 檢視 K8s 資源內容
用 get
列出某種類既所有 K8s 資源之後,我地會見到個別 K8s 資源既名,然後就可以呢啲名黎 reference 個別 K8s 資源。
睇重要既 fields:
kubectl describe <resource type> <resource name>
睇曬所有 fields:
kubectl get <resource type> <resource name> -o yaml
比較常需要檢視既 K8s 資源有 Pod
以及 Deployment
,因為:
Pod
既內容可以話畀我地知而家個 microservice 用咩參數黎運行,例如 Image ID、env、args、requests、limits,可以幫助我地 troubleshoot 問題。
Deployment
定義左 pod template,係生成 Pod
既範本,修改佢之後 rollout restart 或者 delete Pod
就可以避免重新部署個 microservice。
3.8 修改 K8s 資源內容
kubectl edit <resource type> <resource name>
執行之後,會自動彈出 Notepad,修改完之後喺 Notepad 度 save,之後退出 Notepad,就會見到返回修改完成既回應。
3.9 刪除 K8s 資源
kubectl delete <resource type> <resource name>
Pod
算係比較常需要刪除既 K8s 資源,因為:
- 為左加快開發,我地會想即時改變 microservice 既執行參數,但係因為
Pod
裡面既 microservice 已經運行緊,就咁修改 Pod
唔會起到作用,所以就要修改 Deployment
既 pod template,然後刪除運行緊既 Pod
,等 K8s 自動生成 Pod
黎滿足 ReplicaSet
要求既 Pod
數量。
3.10 查看 Pod
日誌
kubectl logs <pod name>
Follow logs(佢會一直咁 stream logs 去我地個 console):
kubectl logs -f <pod name>
睇最後 20
行 logs,並且繼續 follow:
kubectl logs -f <pod name> --tail=20
儲存喺檔案度(視乎 K8s 會為 Pod
keep 幾多 logs,有上限):
kubectl logs <pod name> > logs.txt
3.11 Port-forward
3.11.1 Port-forward Pod
我地部署左一個 web microservice 上 K8s 之後,當個 Pod
成功運行緊,我地就可以試下佢既 HTTP API 功能。
其中一個方式就係直接訪問個 Pod
,呢個時候就需要用到 port-forward
。
kubectl port-forward <pod name> <port>
kubectl port-forward <pod name> <local port>:<remote port>
例子一:假如個 Pod
expose 緊 8080
,而我地又想 local port 同 remote port 用埋同一個:
kubectl port-forward <pod name> 8080
之後我地可以:
curl localhost:8080
例子二:假如個 Pod
expose 緊 8080
,而我地又想 local port 用另一個,例如係 8081
:
kubectl port-forward <pod name> 8081:8080
之後我地可以:
curl localhost:8081
3.11.2 Port-forward Service
同樣地,我地都可以 port-forward Service
:
kubectl port-forward service/<service name> <port>
kubectl port-forward service/<service name> <local port>:<remote port>
3.11.3 Port-forward Deployment
同樣地,我地都可以 port-forward Deployment
:
kubectl port-forward deployment/<deployment name> <port>
kubectl port-forward deployment/<deployment name> <local port>:<remote port>
3.12 Scale up/down Deployment
手動增加或者減少 Deployment
既 Pod
數量:
kubectl scale --replicas=<new replica count> deployment <deployment name>
註:如果有用緊 HorizontalPodAutoscaler
,因為佢會控制 replicas 既數量,所以手動 scale up、scale down 係唔會 work,除非我地完全 scale down 到 0
或者刪除左個 HorizontalPodAutoscaler
。
3.13 重新部署 Deployment
想重新部署 Pod
但唔想有 downtime 既話,可以 restart Deployment
:
kubectl rollout restart deployment <deployment name>
K8s 會逐一將而家相同數量既 Pod
重新部署:
- 先部署新既
Pod
。
- 等新既
Pod
ready(probes 成功)。
- 移除舊既
Pod
。
- 重複以上步驟直至新既
Pod
取代曬所有舊既 Pod
。
3.14 對 Pod
裡面既 container 執行指令
有時如果需要檢視 container 裡面既檔案,或者執行一啲指令,都可以做到:
kubectl exec -it -c <container> <pod name> -- /bin/bash
kubectl exec -it -c <container> <pod name> -- sh
場景:
- 執行
ls -l
以及 cat <filename>
去睇下有咩檔案,以及個別檔案內容。
- 執行
java -version
去了解 Java microservice 既 Java 版本。
3.15 查看某種類 K8s 資源既資源使用情況
呢度既「資源使用情況」係指 CPU、memory、storage。
kubectl top <resource type>
3.16 部署 K8s 資源
根據檔案內容而部署或者更新 K8s resources:
kubectl apply -f path/to/file.yml
根據檔案內容而刪除 K8s resources:
kubectl delete -f path/to/file.yml
3.17 從 K8s container 抄出檔案
我地可以將一個 K8s pod 既某個 container 既 file system 裡面既檔案抄到本地 file system。
由 container 既 /tmp
抄到目前既 working directory,將檔案名改成 myapp.jar
:
kubectl cp "<pod name>:/tmp/app.jar" ./myapp.jar
由 container 既 /tmp
抄到 C:/output
(Windows),將檔案名改成 myapp.jar
:
kubectl cp "<pod name>:/tmp/app.jar" /output/myapp.jar
抄 container 既 /tmp
成個 folder 既檔案到目前既 working directory:
kubectl cp <pod name>:/tmp/folder ./
抄 container 既 /tmp
成個 folder 既檔案到 C:/output
(Windows):
kubectl cp <pod name>:/tmp/folder /output
3.18 將檔案抄入 K8s container
我地可以將一啲檔案由本地 file system 抄入 K8s pod 既某個 container 既 file system 裡面。
由目前既 working directory 抄到 container 既 /tmp
,將檔案名改成 app.jar
:
kubectl cp ./myapp.jar <pod name>:/tmp/app.jar
由 C:/input
(Windows)抄到 container 既 /tmp
,將檔案名改成 app.jar
:
kubectl cp /input/myapp.jar <pod name>:/tmp/app.jar
抄目前既 working directory 成個 folder 既檔案抄到 container 既 /tmp
:
kubectl cp ./ <pod name>:/tmp
抄 C:/input
(Windows)成個 folder 既檔案抄到 container 既 /tmp
(但 /tmp
裡面會多左個 input
folder):
kubectl cp /input <pod name>:/tmp
之後我地可以 kubectl exec -it
入個 container,然後:
mv /tmp/input/* /tmp
rmdir /tmp/input
4 參考資料