跳至主要内容

Advanced - Kubectl

kubectl 是 Kubernetes 的命令列工具,用於與 Kubernetes 叢集互動。透過 kubectl,使用者可以管理叢集中的資源、部署應用程式、檢查狀態以及進行故障排除。


什麼是 kubectl?

kubectl 是 Kubernetes 提供的主要 CLI 工具,能夠讓使用者透過簡單的命令與 Kubernetes API 伺服器進行互動。

功能特色

  • 管理叢集資源(Pod、Service、Deployment 等)。
  • 部署與滾動更新應用程式。
  • 監控叢集的狀態。
  • 除錯與排解問題。

安裝 kubectl

在 macOS

brew install kubectl

在 Linux

sudo apt-get update
sudo apt-get install -y kubectl

在 Windows

choco install kubernetes-cli

安裝設定

最常見的方式是透過 kubeconfig 檔案(預設在家目錄底下.kube/config)來設定 kubectl。 如果是使用 GKE 或是 Amazon EKS 或 Azure AKS 這樣的雲端服務,他們的命令列工具會自動生成適當的 kubeconfig 檔案。 使用 kubectl get nodes,就可以看到 kubernetes 叢集中的節點列表,這代表你已經成功設定並連接到叢集。


基本語法

kubectl [command] [TYPE] [NAME] [flags]
  • command:動作,例如 getdescribeapply 等。
  • TYPE:資源類型,例如 podservicedeployment 等。
  • NAME:資源名稱(可選),名稱區分大小寫,若省略則顯示全部。
  • flags:額外的選項,例如 --namespace

常用指令

檢視叢集資源

  • 列出所有 Pod:

    kubectl get pods

    顯示所有 Pod 的狀態,如 RunningPending 等。

  • 列出所有資源(包括 Pod、Service 等):

    kubectl get all
  • 顯示詳細資訊:

    kubectl describe pod <POD_NAME>

    提供 Pod 的事件日誌、狀態和錯誤排查資訊。

  • 列出資源並顯示其命名空間:

    kubectl get pods --all-namespaces
  • 篩選特定標籤的資源:

    kubectl get pods -l app=<APP_LABEL>

部署應用程式

  • 建立 Deployment:

    kubectl apply -f deployment.yaml

    根據 YAML 文件部署應用程式。

  • 直接啟動單一容器:

    kubectl run nginx --image=nginx

    創建一個名為 nginx 的 Pod。

  • 滾動更新 Deployment:

    kubectl set image deployment/<DEPLOYMENT_NAME> <CONTAINER_NAME>=<IMAGE>

    更新 Deployment 中的容器映像,例如升級版本。

  • 檢查更新狀態:

    kubectl rollout status deployment/<DEPLOYMENT_NAME>
  • 回滾到先前版本:

    kubectl rollout undo deployment/<DEPLOYMENT_NAME>
  • 查看歷史版本:

    kubectl rollout history deployment/<DEPLOYMENT_NAME>

排除故障

  • 查看 Pod 日誌:

    kubectl logs <POD_NAME>

    查看容器的輸出日誌,幫助排查應用問題。

  • 查看最近的 n 行日誌:

    kubectl logs <POD_NAME> --tail=<N>
  • 追蹤實時日誌:

    kubectl logs -f <POD_NAME>
  • 進入 Pod:

    kubectl exec -it <POD_NAME> -- /bin/bash

    獲取容器內部的 Shell,用於調試。

  • 檢查資源事件:

    kubectl get events

    查看叢集中的最新事件,如錯誤或警告。

  • 測試服務連線:

    kubectl run curlpod --image=radial/busyboxplus:curl -i --tty

    使用測試 Pod 嘗試與服務連接。


刪除資源

  • 刪除 Pod:

    kubectl delete pod <POD_NAME>
  • 刪除 Deployment:

    kubectl delete deployment <DEPLOYMENT_NAME>
  • 刪除指定標籤的資源:

    kubectl delete pods -l app=<APP_LABEL>
  • 刪除命名空間下的所有資源:

    kubectl delete namespace <NAMESPACE>

資源狀態與監控

  • 監控 Pod 狀態變化:

    kubectl get pods -w

    持續追蹤資源狀態變化。

  • 查看資源使用量(需啟用 Metrics Server):

    kubectl top pods

    顯示 Pod 的 CPU 與記憶體使用量。

  • 檢查節點的資源使用狀態:

    kubectl top nodes
  • 檢查 Pod 的配置:

    kubectl describe pod <POD_NAME>

    顯示 Pod 的詳細配置信息,例如環境變量和端口。


匯出與匯入配置

  • 匯出資源配置為 YAML:

    kubectl get pod <POD_NAME> -o yaml

    匯出 Pod 的完整 YAML 定義。

  • 匯出清單而不包含狀態:

    kubectl get pod <POD_NAME> -o yaml --export
  • 使用 YAML 文件重新創建資源:

    kubectl apply -f resource.yaml

命名空間相關

  • 創建命名空間:

    kubectl create namespace <NAMESPACE>
  • 切換命名空間(設定預設值):

    kubectl config set-context --current --namespace=<NAMESPACE>
  • 列出所有命名空間:

    kubectl get namespaces

指令詳細介紹

1. kubectl apply

功能:

將 YAML 或 JSON 格式的資源配置檔案應用到 Kubernetes 叢集中,用於創建或更新資源。

語法:

kubectl apply -f <FILENAME> [--namespace=<NAMESPACE>] [--record]

參數說明:

  • -f <FILENAME>:指定配置檔案,可以是單個檔案或目錄。
  • --namespace=<NAMESPACE>:指定命名空間,若未指定則默認為 default
  • --record:記錄指令內容,方便追蹤變更。

範例:

  • 將單個檔案應用到叢集中:
    kubectl apply -f deployment.yaml
  • 批量應用目錄內的所有檔案:
    kubectl apply -f ./manifests/
  • 指定命名空間執行:
    kubectl apply -f service.yaml --namespace=testing

2. kubectl describe

功能:

顯示資源的詳細資訊,包括當前狀態、事件、錯誤和配置內容,幫助排除問題。

語法:

kubectl describe <RESOURCE_TYPE> <NAME> [--namespace=<NAMESPACE>]

參數說明:

  • <RESOURCE_TYPE>:資源類型(如 poddeployment 等)。
  • <NAME>:資源名稱。
  • --namespace=<NAMESPACE>:指定命名空間。

範例:

  • 查看指定 Pod 的詳細資訊:
    kubectl describe pod my-pod
  • 查看某個 Deployment 的詳細資訊:
    kubectl describe deployment my-deployment
  • 查看特定命名空間內的 Service:
    kubectl describe service my-service --namespace=production

3. kubectl get

功能:

列出指定資源及其基本資訊,可用於快速檢視叢集狀態。

語法:

kubectl get <RESOURCE_TYPE> [<NAME>] [OPTIONS]

參數說明:

  • <RESOURCE_TYPE>:資源類型(如 podsservicesnodes 等)。
  • <NAME>:可選,指定資源名稱。
  • -o:輸出格式(如 jsonyamlwide)。
  • -w:持續監控資源狀態更新。

範例:

  • 列出所有 Pod:
    kubectl get pods
  • 查看詳細輸出(包括節點名稱和容器狀態):
    kubectl get pods -o wide
  • 實時監控資源變化:
    kubectl get pods -w

4. kubectl create

功能:

用於創建新的 Kubernetes 資源。

語法:

kubectl create <RESOURCE_TYPE> <NAME> [OPTIONS]

參數說明:

  • <RESOURCE_TYPE>:資源類型(如 namespaceconfigmap 等)。
  • <NAME>:資源名稱。
  • --from-literal:直接從命令行創建資源數據。
  • --from-file:從文件中加載數據。

範例:

  • 創建新的命名空間:
    kubectl create namespace my-namespace
  • 創建 ConfigMap 並添加鍵值對:
    kubectl create configmap my-config --from-literal=key1=value1

5. kubectl delete

功能:

刪除 Kubernetes 資源。

語法:

kubectl delete <RESOURCE_TYPE> <NAME> [--namespace=<NAMESPACE>]

範例:

  • 刪除指定 Pod:
    kubectl delete pod my-pod
  • 刪除所有 Deployment:
    kubectl delete deployments --all

6. kubectl run

功能:

快速創建單個 Pod 或 Deployment。

語法:

kubectl run <NAME> --image=<IMAGE> [OPTIONS]

範例:

  • 使用 Nginx 映像創建 Pod:
    kubectl run nginx --image=nginx

7. kubectl expose

功能:

為資源創建對外暴露的 Service。

語法:

kubectl expose <RESOURCE_TYPE> <NAME> --port=<PORT> --target-port=<TARGET_PORT>

範例:

  • 將 Pod 暴露為 ClusterIP 類型的服務:
    kubectl expose pod my-pod --port=80 --target-port=8080

8. kubectl set

功能:

更新資源的屬性,例如映像、環境變數等。

語法:

kubectl set <SUBCOMMAND> [OPTIONS]

範例:

  • 更新 Deployment 映像:
    kubectl set image deployment/my-deployment my-container=my-image:v2

9. kubectl exec

功能:

在 Pod 中執行命令或打開 Shell。

語法:

kubectl exec -it <POD_NAME> -- <COMMAND>

範例:

  • 進入 Pod 的交互式 Shell:
    kubectl exec -it my-pod -- /bin/bash

10. kubectl logs

功能:

檢視 Pod 中容器的日誌。

語法:

kubectl logs [OPTIONS] <POD_NAME>

範例:

  • 查看特定 Pod 的日誌:
    kubectl logs my-pod
  • 追蹤實時日誌輸出:
    kubectl logs -f my-pod

進階指令介紹

1. kubectl config

功能:

管理 Kubernetes 的 kubeconfig 文件,用於設定和操作上下文、叢集和用戶憑據。

範例:

  1. 切換上下文
kubectl config use-context <CONTEXT_NAME>
  1. 列出當前上下文
kubectl config current-context
  1. 查看所有上下文
kubectl config get-contexts
  1. 設定預設命名空間
kubectl config set-context --current --namespace=<NAMESPACE>

2. kubectl patch

功能:

使用 JSON 或 YAML 格式更新資源,而無需重新定義完整的配置檔案。

語法:

kubectl patch <RESOURCE_TYPE> <RESOURCE_NAME> --patch '<PATCH_CONTENT>'

範例:

  1. JSON 格式更新
kubectl patch deployment my-deployment \
--patch '{"spec": {"template": {"spec": {"containers": [{"name": "my-container", "image": "new-image:v2"}]}}}}'
  1. YAML 格式更新
kubectl patch service my-service \
--patch "$(cat <<EOF
spec:
type: NodePort
EOF
)"
  1. 使用 --type 指定更新方式
  • strategic(默認):基於資源類型的結構化合併。
  • json:基於 JSON 合併。
  • merge:基於 JSON 合併的併集。
kubectl patch deployment my-deployment --type=merge --patch '{"spec": {"replicas": 5}}'

3. kubectl debug

功能:

用於調試 Pod 或創建調試容器,幫助排查問題。

語法:

kubectl debug <POD_NAME> [OPTIONS]

範例:

  1. 調試容器內執行命令
kubectl debug pod/my-pod -it --image=busybox --target=app-container
  1. 重啟 Pod 並加上調試選項
kubectl debug node/<NODE_NAME> --image=busybox
  1. 添加調試代理
kubectl debug pod/my-pod --image=busybox --share-processes

4. kubectl logs --since

功能:

查看 Pod 容器的日誌,並只顯示自指定時間以來的日誌內容。

語法:

kubectl logs <POD_NAME> [OPTIONS]

範例:

  1. 查看最近 1 小時的日誌
kubectl logs my-pod --since=1h
  1. 查看最近 5 分鐘的日誌
kubectl logs my-pod --since=5m
  1. 實時追蹤並限制最近 30 分鐘的日誌
kubectl logs -f my-pod --since=30m

5. kubectl port-forward

功能:

將本地端口映射到 Kubernetes 叢集中的 Pod 或服務,用於測試或訪問內部應用程式。

語法:

kubectl port-forward <RESOURCE_TYPE>/<RESOURCE_NAME> <LOCAL_PORT>:<REMOTE_PORT>

範例:

  1. 對 Pod 進行端口轉發
kubectl port-forward pod/my-pod 8080:80
  1. 對 Service 進行端口轉發
kubectl port-forward service/my-service 3000:5000

6. -o=jsonpath

功能:

用於過濾資源輸出的內容,僅顯示特定字段。

語法:

kubectl get <RESOURCE_TYPE> -o jsonpath='<JSONPATH_EXPRESSION>'

範例:

  1. 獲取 Pod 名稱
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
  1. 獲取指定資源的 IP
kubectl get pod my-pod -o jsonpath='{.status.podIP}'
  1. 獲取所有容器的名稱
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].name}'

7. Label 選擇器

功能:

使用標籤來選擇資源,用於過濾、更新或刪除資源。

語法:

kubectl get <RESOURCE_TYPE> --selector <KEY>=<VALUE>

範例:

  1. 篩選指定標籤的資源
kubectl get pods --selector app=nginx
  1. 更新標籤
kubectl label deployment my-deployment env=production
  1. 刪除標籤
kubectl label pod my-pod env-

8. kubectl apply --prune

功能:

使用配置檔案同步資源,同時刪除未在配置中的多餘資源。

語法:

kubectl apply -f <FILENAME> --prune -l <LABEL_SELECTOR>

範例:

  1. 根據標籤進行同步
kubectl apply -f deployment.yaml --prune -l app=nginx
  1. 在命名空間中應用同步
kubectl apply -f ./manifests --prune -l env=production --namespace=staging

9. --dry-run

功能:

模擬執行 kubectl 指令,而不實際修改任何資源,適用於測試配置和指令執行結果。

類型:

--dry-run 有兩種主要模式:

  1. client(默認):僅在本地檢查配置,模擬執行指令。
  2. server:發送請求到 API Server,進行完整驗證但不執行任何修改。

範例:

  1. 測試創建資源
kubectl create -f pod.yaml --dry-run=client
  1. 測試更新資源
kubectl apply -f deployment.yaml --dry-run=server
  1. 結合輸出格式檢查
kubectl create deployment my-deployment --image=nginx --dry-run=client -o yaml
  1. 測試刪除資源
kubectl delete pod my-pod --dry-run=client
  1. 測試滾動更新
kubectl set image deployment/my-deployment my-container=nginx:latest --dry-run=server

更多細節

如果希望更多細節,可以使用 help 指令,他會列出更多詳細的資訊

kubectl.exe help