kubectl 命令參數詳解與示例
kubectl
是 Kubernetes 的命令行工具,用于與 Kubernetes 集群交互。下面我將詳細介紹 kubectl 的主要命令參數,并提供相應的使用示例。
一、基礎命令
1. kubectl get
- 獲取資源信息
常用參數:
-n, --namespace
: 指定命名空間-o, --output
: 輸出格式 (json|yaml|wide|name|custom-columns=…)-w, --watch
: 監聽資源變化--show-labels
: 顯示標簽--sort-by
: 按指定字段排序
示例:
# 獲取默認命名空間的所有pod
kubectl get pods# 獲取kube-system命名空間的pod,顯示標簽
kubectl get pods -n kube-system --show-labels# 以yaml格式獲取pod信息
kubectl get pod my-pod -o yaml# 監聽pod狀態變化
kubectl get pods -w# 自定義列輸出
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName
2. kubectl describe
- 顯示資源詳細信息
常用參數:
-n, --namespace
: 指定命名空間-l, --selector
: 根據標簽選擇器過濾
示例:
# 描述特定pod
kubectl describe pod my-pod# 描述命名空間中的所有service
kubectl describe services -n kube-system# 使用標簽選擇器描述pod
kubectl describe pods -l app=nginx
3. kubectl create
- 創建資源
常用參數:
-f, --filename
: 使用文件或URL創建--dry-run=client
: 試運行(不實際創建)-o, --output
: 輸出格式--save-config
: 保存配置到注解中
示例:
# 從YAML文件創建資源
kubectl create -f deployment.yaml# 試運行創建deployment
kubectl create deployment my-nginx --image=nginx --dry-run=client -o yaml# 創建命名空間
kubectl create namespace test-ns
4. kubectl apply
- 應用配置變更
常用參數:
-f, --filename
: 使用文件或URL-k, --kustomize
: 使用kustomization目錄--prune
: 刪除不再存在的資源--dry-run=server
: 服務器端試運行
示例:
# 應用YAML配置
kubectl apply -f deployment.yaml# 使用kustomize
kubectl apply -k ./kustomize-dir# 試運行應用變更
kubectl apply -f deployment.yaml --dry-run=server
二、調試命令
1. kubectl logs
- 查看容器日志
常用參數:
-f, --follow
: 實時跟蹤日志--tail
: 顯示最后N行日志--since
: 顯示特定時間后的日志(如5s, 2m, 3h)-p, --previous
: 查看前一個容器的日志(容器崩潰時)
示例:
# 查看pod日志
kubectl logs my-pod# 實時跟蹤日志
kubectl logs -f my-pod# 查看最后50行日志
kubectl logs --tail=50 my-pod# 查看過去1小時的日志
kubectl logs --since=1h my-pod# 多容器pod中指定容器
kubectl logs my-pod -c my-container
2. kubectl exec
- 在容器中執行命令
常用參數:
-i, --stdin
: 保持STDIN打開-t, --tty
: 分配TTY-c, --container
: 指定容器
示例:
# 在pod中執行簡單命令
kubectl exec my-pod -- ls /# 交互式shell
kubectl exec -it my-pod -- /bin/bash# 在特定容器中執行命令
kubectl exec -it my-pod -c my-container -- /bin/sh
3. kubectl port-forward
- 端口轉發
常用參數:
--address
: 綁定地址(默認為localhost)--pod-running-timeout
: 等待pod運行的最長時間
示例:
# 將本地8080轉發到pod的80端口
kubectl port-forward my-pod 8080:80# 轉發到service
kubectl port-forward svc/my-service 8080:80# 綁定到所有網絡接口
kubectl port-forward --address 0.0.0.0 my-pod 8080:80
三、部署管理
1. kubectl rollout
- 管理部署的滾動更新
子命令:
history
: 查看歷史pause
: 暫停resume
: 恢復status
: 查看狀態undo
: 回滾
示例:
# 查看部署歷史
kubectl rollout history deployment/my-deployment# 查看特定修訂版本詳情
kubectl rollout history deployment/my-deployment --revision=2# 暫停部署
kubectl rollout pause deployment/my-deployment# 恢復部署
kubectl rollout resume deployment/my-deployment# 回滾到上一個版本
kubectl rollout undo deployment/my-deployment# 回滾到特定版本
kubectl rollout undo deployment/my-deployment --to-revision=2
2. kubectl scale
- 擴縮容
常用參數:
--current-replicas
: 當前副本數驗證--replicas
: 目標副本數
示例:
# 將deployment擴展到3個副本
kubectl scale --replicas=3 deployment/my-deployment# 基于當前副本數進行擴展
kubectl scale --current-replicas=2 --replicas=5 deployment/my-deployment
四、集群管理
1. kubectl config
- 管理kubeconfig
常用子命令:
current-context
: 顯示當前上下文get-contexts
: 列出所有上下文use-context
: 切換上下文set-cluster
: 配置集群set-credentials
: 配置憑證
示例:
# 查看當前配置
kubectl config view# 切換上下文
kubectl config use-context dev-cluster# 添加新集群配置
kubectl config set-cluster prod-cluster --server=https://prod.example.com
2. kubectl cluster-info
- 顯示集群信息
常用參數:
--dump
: 轉儲當前集群狀態--output
: 輸出格式
示例:
# 顯示集群基本信息
kubectl cluster-info# 顯示詳細集群信息
kubectl cluster-info dump
五、高級命令
1. kubectl patch
- 部分更新資源
常用參數:
--type
: 補丁類型(merge|json|strategic)-p, --patch
: 補丁內容
示例:
# 更新deployment的鏡像
kubectl patch deployment my-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"my-container","image":"nginx:1.19"}]}}}}'# 使用strategic merge patch
kubectl patch deployment my-deployment --type strategic -p '{"spec":{"replicas":5}}'
2. kubectl label
- 管理資源標簽
常用參數:
--overwrite
: 覆蓋現有標簽--list
: 顯示現有標簽--all
: 選擇所有資源
示例:
# 添加標簽
kubectl label pods my-pod env=prod# 覆蓋現有標簽
kubectl label pods my-pod env=staging --overwrite# 批量添加標簽
kubectl label pods --all env=test# 刪除標簽
kubectl label pods my-pod env-
3. kubectl annotate
- 管理資源注解
常用參數:
--overwrite
: 覆蓋現有注解--list
: 顯示現有注解
示例:
# 添加注解
kubectl annotate pods my-pod description="This is a test pod"# 查看注解
kubectl annotate pods my-pod --list# 刪除注解
kubectl annotate pods my-pod description-
六、資源管理
1. kubectl delete
- 刪除資源
常用參數:
-f, --filename
: 使用文件刪除--all
: 刪除所有資源--grace-period
: 優雅刪除期限(秒)--force
: 強制刪除
示例:
# 按名稱刪除pod
kubectl delete pod my-pod# 使用YAML文件刪除
kubectl delete -f deployment.yaml# 刪除命名空間下所有pod
kubectl delete pods --all -n test-ns# 強制刪除pod
kubectl delete pod my-pod --grace-period=0 --force
2. kubectl edit
- 編輯資源
常用參數:
-f, --filename
: 使用文件--output
: 輸出格式--record
: 記錄當前命令到資源注解
示例:
# 編輯deployment
kubectl edit deployment/my-deployment# 使用特定編輯器
KUBE_EDITOR="nano" kubectl edit deployment/my-deployment# 編輯時記錄命令
kubectl edit deployment/my-deployment --record
七、排錯命令
1. kubectl top
- 顯示資源使用情況
常用參數:
--containers
: 顯示容器級別統計--sort-by
: 按指定字段排序
示例:
# 查看節點資源使用
kubectl top nodes# 查看pod資源使用
kubectl top pods# 查看容器級別資源使用
kubectl top pods --containers# 按CPU排序
kubectl top pods --sort-by=cpu
2. kubectl cp
- 在容器和本地系統間復制文件
常用參數:
-c, --container
: 指定容器
示例:
# 從本地復制到pod
kubectl cp /local/path/file.txt my-pod:/remote/path/# 從pod復制到本地
kubectl cp my-pod:/remote/path/file.txt /local/path/# 指定容器復制
kubectl cp /local/path/file.txt my-pod:/remote/path/ -c my-container
八、插件管理
kubectl plugin
- 管理插件
常用子命令:
list
: 列出已安裝插件install
: 安裝插件uninstall
: 卸載插件
示例:
# 列出插件
kubectl plugin list# 安裝插件(插件名需以kubectl-開頭)
mv my-plugin /usr/local/bin/kubectl-my_plugin
chmod +x /usr/local/bin/kubectl-my_plugin# 使用插件
kubectl my-plugin
九、API資源管理
kubectl api-resources
- 查看API資源
常用參數:
--namespaced
: 僅顯示命名空間資源--verbs
: 過濾支持的動詞--sort-by
: 排序字段
示例:
# 查看所有API資源
kubectl api-resources# 查看命名空間資源
kubectl api-resources --namespaced=true# 查看支持create操作的資源
kubectl api-resources --verbs=create
十、自定義輸出
自定義列輸出
示例:
# 自定義列顯示pod信息
kubectl get pods -o custom-columns="NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName,IP:.status.podIP"# 使用JSONPath表達式
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'
十一、邊車模式
在Kubernetes中,要向已經運行的Pod添加臨時邊車容器,有幾種方法可以實現。需要注意的是,Kubernetes本身不支持直接修改正在運行的Pod的容器配置,因為Pod在Kubernetes中是 immutable(不可變)的。
方法1: 使用Ephemeral Containers (臨時容器) - Kubernetes 1.23+
從Kubernetes 1.23開始,臨時容器功能已穩定,這是官方推薦的向運行中Pod添加邊車容器的方法。
kubectl debug <pod-name> -it --image=<sidecar-image> --target=<container-name> --share-processes
示例:
kubectl debug my-pod -it --image=busybox:latest --target=main-container --share-processes
參數說明:
–image: 指定邊車容器使用的鏡像
–target: 指定目標容器,邊車將共享其命名空間
–share-processes: 允許邊車查看主容器的進程
方法2: 使用kubectl alpha debug (舊版本)
對于Kubernetes 1.18-1.22版本:
kubectl alpha debug <pod-name> -it --image=<sidecar-image> --share-processes
方法3: 通過修改Deployment/DaemonSet/StatefulSet
如果需要更持久的邊車容器,可以修改控制器定義:
編輯Deployment/DaemonSet/StatefulSet:
kubectl edit deployment <deployment-name>
在spec.template.spec.containers下添加邊車容器定義
保存后,Kubernetes會滾動更新Pod
方法4: 使用臨時Pod進行調試
如果只是需要臨時調試,可以創建一個新Pod并共享目標Pod的命名空間:
kubectl run debugger --image=busybox -it --rm --restart=Never --pod-running-timeout=1m --overrides='{"spec": {"shareProcessNamespace": true, "containers": [{"name": "debugger", "image": "busybox", "stdin": true, "tty": true, "securityContext": {"privileged": true}}]}}' --target <pod-name>
注意事項
臨時容器是短暫的,不會在Pod重啟后保留
需要確保API服務器啟用了臨時容器功能
某些安全策略可能會限制臨時容器的使用
對于生產環境,建議使用方法3(修改控制器定義)以獲得更可靠的結果
驗證邊車容器
添加后,可以使用以下命令驗證:
kubectl describe pod <pod-name>
kubectl exec -it <pod-name> -c <sidecar-container-name> -- /bin/sh
總結
kubectl 提供了豐富的命令和參數來管理 Kubernetes 集群。掌握這些參數可以幫助您:
- 高效地查詢和管理資源
- 調試和排查問題
- 自動化日常操作
- 定制輸出以滿足特定需求
建議結合 --help
參數查看各命令的詳細用法,如 kubectl get --help
。隨著 Kubernetes 版本更新,部分參數可能會有所變化,請參考對應版本的官方文檔。