Kubernetes,kubectl常用命令詳解
kubectl概述
祭出一張圖,轉載至 kubernetes-handbook/kubectl命令概述 ,可以對命令族有個整體的概念。
環境準備
允許master節點部署pod,使用命令如下:
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl安裝後,預設是沒有比如自動補全等功能的,頻繁使用比較不方便。目前已經有各類kubectl小 工具 可以提高效率,還有kubectl專用的shell了。個人感覺比較好用有以下這些:
- 自動補全
kubectl 命令在bash中預設是沒有自動補全的,需要安裝bash_completion,新增自動補全指令碼。這裡以CentOS為例,其他作業系統配置可以參看
# 安裝bash-completion
yum install -y epel-release.noarch
yum install -y bash_completion
# 新增補全指令碼
kubectl completion bash >/etc/bash_completion.d/kubectl複製程式碼
重新登入shell,可以發現kubectl的子命令,包括資源名稱都可以用Tab鍵自動補全了:
- 快速切換叢集和Namespace
生產環境一般是多叢集,至少也是多NS的環境,免不了經常在不同叢集和不同NS間切換。切換叢集要修改環境變數、切換NS要在命令跟上 -n namespace,都不是太方便。而用kubectx和kubens兩個小工具可以實現快速切換。這倆在同一專案裡:
# 安裝
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
# 使用kubectx
# kubectx : 列出所有上下文
# kubectx <NAME> : 切換到某個上下文
$ kubectx minikube
Switched to context "minikube".
# kubectx - : 切換回上一個上下文
$ kubectx -
Switched to context "oregon".
# kubectx <NEW_NAME>=<NAME> : 重新命名一個叢集上下文
$ kubectx dublin=gke_ahmetb_europe-west1-b_dublin
Context "dublin" set.
Aliased "gke_ahmetb_europe-west1-b_dublin" as "dublin".
# kubectx <NEW_NAME>=. : 重新命名當前上下文
# kubectx -d <NAME> : 刪除上下文
# 使用kubens
# kubens : 列出所有的NS
# kubens <NS-NAME> : 切換當前NS
$ kubens kube-system
Context "test" set.
Active namespace is "kube-system".
# kubens - : 切換回上一個NS
$ kubens -
Context "test" set.
Active namespace is "default".複製程式碼
關於多叢集切換的配置和上下文的概念可以參看 官方檔案 ,有中文。
- kubectl shell
kubectl已經有比較成熟的專用shell了,優化了自動補全,模糊匹配等功能:
但實際使用過程中,偶爾還是會各種小問題。推薦兩個比較熱門的,有需要可以嘗試一下:
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
複製程式碼
k8s中Pod重啟方法
有最新的 yaml 檔案
kubectl replace --force -f xxxx.yaml
沒有 yaml 檔案,但是使用的是 Deployment 物件。
kubectl scale deployment esb-admin --replicas=0 -n {namespace}
kubectl scale deployment esb-admin --replicas=1 -n {namespace}
由於 Deployment 物件並不是直接操控的 Pod 物件,而是操控的 ReplicaSet 物件,而 ReplicaSet 物件就是由副本的數目的定義和Pod 模板組成的。所以這條命令分別是將ReplicaSet 的數量 scale 到 0,然後又 scale 到 1,那麼 Pod 也就重啟了。