Kubernetes 學習筆記(三):kubectl 常用命令及插件


個人筆記

二、推薦的插件

必須把插件推薦放在前面,尤其是 k9s,絕對是當前最好用的 kubernetes 管理工具!

  1. K8s 終端管理工具 - k9s: 牆裂推薦!比 kubernetes-dashboard/kubectl 好用多了!
  2. k8s 集群與名字空間切換工具 - kubectx: 強烈推薦!
  3. kube-shell: 提供類似 ipython 的交互式 kubectl 體驗
  4. ksniff: Pod 網絡抓包工具,強烈推薦!
  5. K8s Pod Debug 工具: Pod 問題診斷工具,牆裂推薦!
  6. Kubernetes 插件中心 - Krew: 用於管理所有插件,不過因為是直接從 github 下載,在國內速度感人。。只推薦給有翻牆工具的同學。

其他插件列表:kubectl plugins

一、Kubectl 基礎命令

1. 查詢

# 指定 kubeconfig
kubectl --kubeconfig <config-path> get pods

# 指定名字空間的 pods
kubectl --namespace <namespace> get pods
kubectl -n <namespace> get pods

# 顯示更多的信息(pod 所在節點,clusterip 等)
kubectl get pods -o wide

# 查詢所有名字空間的 pods
kubectl get pods --all-namespace
kubectl get pods -A  # 縮寫

# 列出所有的名字空間
kubectl get ns  # ns 是 namespace 的縮寫

# 查看 default 空間的所有服務
kubectl get svc

# 查看 ingress
kubectl get ingress

# 查看當前命名空間下的所有資源(不包含CRD)
kubectl  get  all
# 列出所有資源及資源實例(不包含CRD)
kubectl  get  all --all

# 列出所有的自定義資源
kubectl get crds

# 列出某自定義資源的所有實例
kubectl get <crd-name>
# 舉例,列出所有的 istio virtualservice
kubectl get virtualservices.networking.istio.io
kubectl get virtualservices  # 縮寫方式

# 查詢 k8s 的資源使用情況 (CPU/Memory/Storage)
kubectl top node
kubectl top deployment

2. 添加/修改

kubectl create 只允許創建原來不存在的資源,而 kubectl apply 可以創建/修改資源(有一部分信息不支持通過 apply 修改)。雖然說官方不推薦使用 apply 進行資源的創建。。

# 臨時運行一個 pod/deployment
# 1. 創建一個 nginx pod,並同時為其創建一個 service(ClusterIp)暴露出 80 端口,targetPort 默認和 port 一致
kubectl run nginx --image=nginx --expose=true  --port=80  --generator=run-pod/v1
# 這一句的效果等同上面 run 命令的 --expose=true  --port=80,只是這邊的 targetPort 和 port 可以不一致
kubectl expose pod nginx --port=80 --target-port=80

# 為節點添加標簽
kubectl label node "disk=ssd"

#刪除標簽
kubectl  label node disk-

# 修改已經存在的標簽
kubectl label node "disk=hdd" --override

# 遞歸便利整個文件夾的 yaml 文件
kubectl create --recursive -f .  # 遞歸遍歷當前文件夾中的 yaml,依次 create


# 直接修改資源
kubectl edit pod <pod-name>  # 會直接彈出 vim 界面供修改,內容為 yaml 格式。

3. 調試 Pod:在 pod 內執行命令

kubectl exec <pod-name> -- <command>  # -- 用於分隔 kubectl 命令和要在容器內部執行的命令
# 常用調試命令
kubectl exec <pod-name> -- ping xxx
kubectl exec <pod-name> -- nslookup xxx
kubectl exec <pod-name> -- cat xxx

kubectl exec -it <pod-name> bash  # 使用容器的 shell,如果沒有 bash,可以試試使用 sh。如果連 sh 都沒有,那就只有上面的方法可用了。

另外 kubectl 1.18 提供了一個 Pod 調試命令 kubectl alpha debug,可啟動一個專用的調試容器,對某 Pod 進行調試。不過該項功能目前還處於 Alpha 狀態,只建議試用。命令如下:

# Create an interactive debugging session in pod mypod and immediately attach to it.
# (requires the EphemeralContainers feature to be enabled in the cluster)
kubectl alpha debug mypod -i --image=busybox

上面提到的 EphemeralContainers 特性需要 kubernetes 1.16+

4. 刪除

# 刪除整個名字空間
kubectl delete ns <space-name>  # ns 是 namespace 的縮寫

# 刪除所有的 pods
kubectl delete pod --all

# 刪除 default 名字空間中(幾乎)所有的資源(不包括 CRD 自定義資源,比如 istio 的 virtualservice/gateway/destinationrule)
kubectl delete all --all  # 第一個 all 表示所有的資源類型(pod/service/ingress,但不包括 secret),第二個 all 表示資源的所有實例。

# 刪除默認名字空間中的所有 istio 配置
kubectl delete destinationrules --all
kubectl delete virtualservices --all
kubectl delete gateway --all
# 或者一次清除三個
kubectl delete destinationrules,virtualservices,gateway --all

5. 污點、驅逐維護、滾動更新/回滾

# 添加、刪除污點
kubectl taint -h

# 封鎖/取消封鎖某個節點(將該節點的狀態設為 Unschedulable)
kubectl cordon -h
kubectl uncordon -h

# 驅逐該節點上的所有 Pod,僅 Daemonset 除外
kubectl drain -h

# deployment 的回滾
## deployment 默認使用滾動更新,歷史版本上限由 `spec.revisionHistoryLimit` 控制
kubectl rollout history deploy  # 查看(當前名字空間)所有 deployments 的歷史版本
kubectl rollout history deploy <deployment-name>  # 查看指定 deployment 的所有歷史版本
kubectl rollout undo deploy  # 回退(當前名字空間)所有的 deployments
kubectl rollout undo deploy <deployment-name> --to-revision=3 # 回退指定 deployment 到版本 3

6. 常用命令舉例

  1. 列出未完全 Ready 的 pods: kubectl get pods -A | grep -Ev '([0-9]+)/\1'-A--all-namespaces
    • 強烈推薦使用 k9s,通過快捷鍵 Ctrl-z 只查看所有有問題的資源。
    • 錯誤示范kubectl get pods -A --field-selector=status.phase!=Running,不會列出狀態為 CrashBackoffLoop 的 pods!以及已 Running 但未 Ready 的 pods!
  2. 查看崩潰容器的日志:kubectl logs <pod-name> --previous,即上一個 pod 的日志

7. 使用 kube-ctx 方便地管理多個集群

通常創建完集群后,我們能得到一個 kubeconfig 文件,我們可以使用改文件與集群通信。
可是如果有多個集群需要管理,那每次都得指定 --kubeconfig xxx,就顯得很麻煩,該如何簡化操作呢?

首先觀察 kubeconfig 文件的內容,它是一個 yaml 格式的文件,包含了管理集群需要的所有信息:

  1. cluster 部分:apiserver 地址及集群授權數據
  2. context 部分:集群管理員用戶的賬號名及 TLS 證書(公鑰)+私鑰,用於驗證身份
  3. current-context: 當前 context 的名稱

觀察 kubeconfig 的結構可以發現,它是支持多個 clusters/context 的。那多個集群的 kubeconfig 是不是能合並成一個,然后使用 current-context 切換集群呢?答案是可以!

首先我們將多個集群的 kubeconfig 合並成一個,方法如下:

# 1. 合並前先確定兩個 kubeconfig 的 cluster-name 和 context-name 不能一樣!一定要改成不一樣的!否則會相互覆蓋!
# 2. KUBECONFIG 以 PATH 類似的語法設定多個 config 的位置
KUBECONFIG=<config1>:<config2> kubectl config view --flatten > $HOME/.kube/config

然后就可以通過 kubectx 方便地切換集群了。

kubectl ctx  # 查看所有集群
kubectl ctx <context-name>  # 切換集群

P.S. 其實也可用於切換集群內的用戶身份,以后再研究下。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM