祭出一張圖,轉載至 kubernetes-handbook/kubectl命令概述 ,能夠對命令族有個總體的概念。html
容許master節點部署pod,使用命令以下:node
kubectl taint nodes --all node-role.kubernetes.io/master-nginx
kubectl安裝後,默認是沒有好比自動補全等功能的,頻繁使用比較不方便。目前已經有各種kubectl小 工具 能夠提升效率,還有kubectl專用的shell了。我的感受比較好用有如下這些:git
kubectl 命令在bash中默認是沒有自動補全的,須要安裝bash_completion,添加自動補全腳本。這裏以CentOS爲例,其餘操做系統配置能夠參看 Install and Set Up kubectlgithub
# 安裝bash-completion yum install -y epel-release.noarch yum install -y bash_completion # 添加補全腳本 kubectl completion bash >/etc/bash_completion.d/kubectl複製代碼
從新登陸shell,能夠發現kubectl的子命令,包括資源名稱均可以用Tab鍵自動補全了:web
生產環境通常是多集羣,至少也是多NS的環境,免不了常常在不一樣集羣和不一樣NS間切換。切換集羣要修改環境變量、切換NS要在命令跟上 -n namespace,都不是太方便。而用kubectx和kubens兩個小工具能夠實現快速切換。這倆在同一項目裏: ahmetb/kubectxdocker
# 安裝 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".複製代碼
關於多集羣切換的配置和上下文的概念能夠參看 官方文檔 ,有中文。shell
kubectl已經有比較成熟的專用shell了,優化了自動補全,模糊匹配等功能:json
但實際使用過程當中,偶爾仍是會各類小問題。推薦兩個比較熱門的,有須要能夠嘗試一下:api
上面的概述圖很全面,爲了方便說嗎,這裏把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不掉的時候頗有用複製代碼
最經常使用的查看命令,顯示一個或多個資源的詳細信息
# 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命令一樣用於查看資源信息,但相比與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 複製代碼
有最新的 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 也就重啓了。