➜ Old React website
Chung Cheuk Hang MichaelJava Web Developer
使用 JMH benchmark Java/Spring Boot appSpring 項目中訂閱 Azure Service Bus

kubectl 基本操作

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

手動增加或者減少 DeploymentPod 數量:
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 重新部署:
  1. 先部署新既 Pod
  2. 等新既 Pod ready(probes 成功)。
  3. 移除舊既 Pod
  4. 重複以上步驟直至新既 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 參考資料