kubectl 常用命令
自動補全
-
- 使用
bash-completion
實現
- 使用
-
# 安裝bash-completion yum install -y epel-release.noarch yum install -y bash_completion # 添加補全腳本 kubectl completion bash >/etc/bash_completion.d/kubectl
-
- 使用
kube-shell
或kube-prompt
- 使用
-
kubectl已經有比較成熟的專用shell了,優化了自動補全,模糊匹配等功能:
- 安裝
pip3 install kube-shell
- 安裝
-
kube-prompt: https://github.com/c-bata/kube-prompt
Kubectl命令概覽
常用命令分類
常用命令
kubectl [command] [TYPE] [NAME] [flags]
command:子命令
TYPE:資源類型
NAME:資源名稱
flags:命令參數
命令幫助
kubectl命令的幫助很詳細,kubectl -h會列出所有的子命令,在任何子命令后跟 -h,都會輸出詳細的幫助以及用例,遇到問題可以隨時查看幫助。
資源對象
kubectl大部分子命令后都可以指定要操作的資源對象,可以用kubectl api-resources命令參考
全局參數
kubectl options命令可以列出可以全局使用的命令參數,比較重要的有:
--cluster='': 指定命令操作對象的集群
--context='': 指定命令操作對象的上下文
-n, --namespace='': 指定命令操作對象的Namespace
資源字段
kubectl explain命令可以輸出資源對應的屬性字段及定義,在定義資源配置文件時候非常有用。
# Usage:
kubectl explain RESOURCE [options]
# Examples:
$ kubectl explain deployment.spec.selector
KIND: Deployment
VERSION: extensions/v1beta1
RESOURCE: selector <Object>
DESCRIPTION:
Label selector for pods. Existing ReplicaSets whose pods are selected by
this will be the ones affected by this deployment.
A label selector is a label query over a set of resources. The result of
matchLabels and matchExpressions are ANDed. An empty label selector matches
all objects. A null label selector matches no objects.
FIELDS:
matchExpressions <[]Object>
matchExpressions is a list of label selector requirements. The requirements
are ANDed.
matchLabels <map[string]string>
matchLabels is a map of {key,value} pairs. A single {key,value} in the
matchLabels map is equivalent to an element of matchExpressions, whose key
field is "key", the operator is "In", and the values array contains only
"value". The requirements are ANDed.
聲明式資源對象管理
對集群資源的聲明式管理,是Kubernetes最主要的特性之一,而kubectl apply命令是最能體現這個特性的命令。apply命令最主要的參數有兩個:
# Usage:
kubectl apply (-f FILENAME | -k DIRECTORY) [options]
-f 參數后跟yaml或json格式的資源配置文件,-k 參數后跟kustomization.yaml配置文件的位置。
為什么說apply是聲明式管理呢,因為所有對集群的增改操作,都能用apply命令完成,一切取決於后面的配置文件:
如果配置文件中的資源找集群中不存在,則創建這個資源。
如果配置文件中的資源在集群中已存在,則根據配置對資源字段進行更新
舉個例子:
# 部署一個goweb應用,配置pod數為4個:
[root@master-1 ~]# grep replicas deployment-goweb.yaml
replicas: 4
# 使用 apply 創建資源
[root@master-1 ~]# kubectl apply -f deployment-goweb.yaml
deployment.apps/goweb created
[root@master-1 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
goweb-6b5d559869-4x5mb 1/1 Running 0 14s
goweb-6b5d559869-77lbz 1/1 Running 0 14s
goweb-6b5d559869-9ztkh 1/1 Running 0 14s
goweb-6b5d559869-ccjtp 1/1 Running 0 14s
# 修改pod數量為2個:
[root@master-1 ~]# sed -ri 's/4$/2/g' deployment-goweb.yaml
[root@master-1 ~]# grep replicas deployment-goweb.yaml
replicas: 2
# 使用apply更新資源
[root@master-1 ~]# kubectl apply -f deployment-goweb.yaml
deployment.apps/goweb configured
[root@master-1 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
goweb-6b5d559869-4x5mb 1/1 Running 0 8m21s
goweb-6b5d559869-77lbz 1/1 Running 0 8m21s
# pod數已更新為2個
同一個kubectl apply -f deployment-goweb.yaml
命令,可以用來創建資源也可以更新資源。
簡單來說,apply命令的作用就是一個:使集群的實際狀態朝用戶聲明的期望狀態變化,而用戶不用關心具體要進行怎樣的增刪改操作才能呢達到這個期望狀態,也即Kubernetes的聲明式資源管理。
命令式資源對象管理
命令式管理類就是直接通過命令執行增刪改的操作,除了刪除資源外,下面的命令能用apply代替,kubernetes也建議盡量使用apply命令。
- 創建資源
kubectl create deployment my-dep --image=busybox # 創建一個deplpyme
kubectl expose rc nginx --port=80 --target-port=8000 # 創建一個svc,暴露nginx這個rc
-
更新資源
-
kubectl scale --replicas=3 -f foo.yaml # 將foo.yaml中描述的對象擴展為3個 kubectl annotate pods foo description='my frontend' # 增加description='my frontend'備注,已有保留不覆蓋 kubectl label --overwrite pods foo status=unhealthy # 增加status=unhealthy 標簽,已有則覆蓋
-
刪除資源
kubectl delete -f xxx.yaml # 刪除一個配置文件對應的資源對象 kubectl delete pod,service baz foo # 刪除名字為baz或foo的pod和service kubectl delete pods,services -l name=myLabel # -l 參數可以刪除包含指定label的資源對象 kubectl delete pod foo --grace-period=0 --force # 強制刪除一個pod,在各種原因pod一直terminate不掉的時候很有用
查看資源狀態
-
get
最常用的查看命令,顯示一個或多個資源的詳細信息# Usage: kubectl get [(-o|--output=)](TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags] [options] # Examples: kubectl get services # 列出當前NS中所有service資源 kubectl get pods --all-namespaces # 列出集群所有NS中所有的Pod kubectl get pods -o wide # -o wide也比較常用,可以顯示更多資源信息,比如pod的IP等 kubectl get deployment my-dep # 可以直接指定資源名查看 kubectl get deployment my-dep --watch # --watch 參數可以監控資源的狀態,在狀態變換時輸出。在跟蹤服務部署情況時很有用 kubectl get pod my-pod -o yaml # 查看yaml格式的資源配置,這里包括資實際的status,可以用--export排除 kubectl get pod my-pod -l app=nginx # 查看所有帶有標簽app: nginx的pod
kubectl 可用JSONPATH來過濾字段,JSON Path的語法可參考這里
kubectl get pods --selector=app=cassandra rc -o jsonpath='{.items[*].metadata.labels.version}' # 獲取所有具有 app=cassandra 的 pod 中的 version 標簽```
-
describe
describe命令同樣用於查看資源信息,但相比與get只輸出資源本身的信息,describe聚合了相關資源的信息並輸出。比如,在describe node信息時,同時會輸出該node下的pod的資源利用情況。所以describe命令在排錯和調試時非常有用。# Usage: kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME) [options] # Examples: kubectl describe nodes my-node # 查看節點my-node的詳細信息 kubectl describe pods my-pod # 查看pod my-pod的詳細信息
容器管理
雖然邏輯上,Kubernetes的最小管理單位是Pod,但是實際上還是免不了與容器直接交互,特別是對於多容器的Pod,任意容器有問題,都會導致Pod不可用。
- 日志查看
# Usage:
kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options]
# Examples:
kubectl logs my-pod
# 輸出一個單容器pod my-pod的日志到標准輸出
kubectl logs nginx-78f5d695bd-czm8z -c nginx
# 輸出多容器pod中的某個nginx容器的日志
kubectl logs -l app=nginx
# 輸出所有包含app-nginx標簽的pod日志
kubectl logs -f my-pod
# 加上-f參數跟蹤日志,類似tail -f
kubectl logs my-pod -p
# 輸出該pod的上一個退出的容器實例日志。在pod容器異常退出時很有用
kubectl logs my-pod --since-time=2018-11-01T15:00:00Z
# 指定時間戳輸出日志
kubectl logs my-pod --since=1h
# 指定時間段輸出日志,單位s/m/h
-
執行命令
命令作用和參數基本與docker exec一致# Usage: kubectl exec POD [-c CONTAINER] -- COMMAND [args...] [options] # Examples: kubectl exec my-pod ls # 對my-pod執行ls命令 kubectl exec -t -i nginx-78f5d695bd-czm8z bash # 進入pod的shell,並打開偽終端和標准輸入
-
文件傳輸
在排錯和測試服務的時候,時不時需要和容器互相交互文件,比如傳輸容器內存的dump到宿主機,或從宿主機臨時拷貝個新配置文件做調試,這時就可以用*kubectl cp命令。要注意的是,cp命令需要容器里已安裝有tar程序# Usage: kubectl cp <file-spec-src> <file-spec-dest> [options] # Examples: kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir # 拷貝宿主機本地文件夾到pod kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar # 指定namespace的拷貝pod文件到宿主機本地目錄 kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container> # 對於多容器pod,用-c指定容器名
集群管理
除了和具體的資源打交道,在對集群進行維護時,也經常需要查看集群信息和對節點進行管理,集群管理有以下這些常用的命令:
-
集群信息查看
kubectl cluster-info # 查看master和集群服務的地址 kubectl cluster-info dump # 查看集群詳細日志 kubectl version # 查看Kubernetes集群和客戶端版本
-
節點管理
在集群節點出問題時,可能希望把一個節點不再被調度pod,或把節點中目前的pod都驅逐出去kubectl cordon my-node # 標記 my-node 為 unschedulable,禁止pod被調度過來。注意這時現有的pod還會繼續運行,不會被驅逐。 kubectl uncordon my-node # 與cordon相反,標記 my-node 為 允許調度。 kubectl drain my-node # drain字面意思為排水,實際就是把my-node的pod平滑切換到其他node,同時標記pod為unschedulable,也就是包含了cordon命令。 # 但是直接使用命令一般不會成功,建議在要維護節點時,加上以下參數: kubectl drain my-node --ignore-daemonsets --force --delete-local-data # --ignore-daemonsets 忽略daemonset部署的pod # --force 直接刪除不由workload對象(Deployment、Job等)管理的pod # --delete-local-data 直接刪除掛載有本地目錄(empty-dir方式)的pod
常用命令英文縮寫
英文 縮寫
clusters (僅對federation apiservers有效)
componentstatuses (縮寫 cs)
configmaps (縮寫 cm)
daemonsets (縮寫 ds)
deployments (縮寫 deploy)
endpoints (縮寫 ep)
events (縮寫 ev)
horizontalpodautoscalers (縮寫 hpa)
ingresses (縮寫 ing)
jobs
limitranges (縮寫 limits)
namespaces (縮寫 ns)
networkpolicies
nodes (縮寫 no)
persistentvolumeclaims (縮寫 pvc)
persistentvolumes (縮寫 pv)
pods (縮寫 po)
podsecuritypolicies (縮寫 psp)
podtemplates
replicasets (縮寫 rs)
replicationcontrollers (縮寫 rc)
resourcequotas (縮寫 quota)
secrets
serviceaccounts (縮寫 sa)
services (縮寫 svc)
statefulsets
storageclasses
thirdpartyresources
引用和擴展:
https://jimmysong.io/kubernetes-handbook/
https://jimmysong.io/kubernetes-handbook/guide/using-kubectl.html
https://blog.csdn.net/weixin_44631350/article/details/89450781