Kubernetes是當今基礎架構的主導技術,這意味着系統管理員須要熟悉其管理。多年來,筆者一直堅持天天管理Kubernetes集羣,而且總結了一些技巧,但願能夠幫助其餘人簡化他們的管理。node
筆者在這裏分享9個有關kubectl的命令,主要說明筆者天天用來管理Kubernetes集羣的正常運行的命令。筆者將它們分爲幾部分,以幫助讀者肯定是否應將它們用於某些任務。筆者還以長號和簡寫形式包含了一些標誌,以幫助讀者更快地使用它們。docker
從命令行實用程序開始,最安全的地方是提問(讀操做)而不是發出命令(寫操做)。有用的get命令可使您滾動起來。shell
命令1:Kubectl getapi
使用get能夠獲取集羣中當前擁有的資源列表。您能夠得到的資源類型包括:安全
Namespacebash
Pod架構
Nodeapp
Deployment編輯器
Serviceide
ReplicaSets
每一個選項都提供有關羣集中可用資源的詳細信息。例如,這是get nodes命令的輸出,該命令提供了Kubernetes的用法和狀態版本。
$kubectl get nodesNAME STATUS ROLES AGE VERSIONminikube Ready master 9d v1.18.0
這些命令大多數都有縮減版。要獲取命名空間,能夠運行kubectl get namespaces或kubectl get ns:
$ kubectl get nsNAME STATUS AGEcharts Active8ddefaultActive9dkube-node-lease Active9dkube-public Active9dkube-system Active9d
每一個get命令均可以使用–namespace或-n標誌集中於給定的命名空間。當您想要查看kube-system中的Pod時,筆者會特別提供幫助,這是運行Kubernetes自己所需的服務。
$ kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-66bff467f8-mjptx1/1Running29dcoredns-66bff467f8-t2xcz1/1Running29detcd-minikube1/1Running19dkube-apiserver-minikube1/1Running19dkube-controller-manager-minikube1/1Running29dkube-proxy-rpc9d1/1Running19dkube-scheduler-minikube1/1Running29dstorage-provisioner1/1Running19d
命令2:Kubectl create
使用kubectl,您幾乎能夠在集羣中建立任何類型的資源。其中一些資源確實須要配置文件和命名空間來設置資源以及名稱。您能夠建立的資源包括:
service
cronjob
deployment
job
namespace (ns)
所以,建立create namespace須要另外一個參數來命名命名空間。
$kubectl create ns hello-therenamespace/hello-there created
咱們也可使用cron命令來連續建立運行做業,就像許多Linux朋友會熟悉的那樣。在這裏,咱們使用cronjob命令每五秒鐘回顯一次「 hello」。
$kubectl create cronjob my-cron --image=busybox --schedule="/5 *"--echohellocronjob.batch/my-namespaced-cron created
您也可使用簡化版的命令cj而不是cronjob。
$kubectl create cj my-existing-cron --image=busybox --schedule="/15 *"--echohellocronjob.batch/my-existing-cron created
命令3:Kubectl edit
那麼,當筆者們建立某些東西並想要更新時會發生什麼呢?這就是kubectl edit的做用。
運行此命令時,能夠編輯集羣中的任何資源。它將打開您的默認文本編輯器。所以,咱們將編輯現有的cronjob,咱們能夠運行:
$kubectl edit cronjob/my-existing-cron
這顯示了咱們要編輯的配置。
這個計劃設置爲每15秒一次:
咱們將其更改成每25秒寫入一次資源:
編寫完成後,咱們能夠看到它已更改。
$ kubectl edit cronjob/my-existing-croncronjob.batch/my-existing-cron edited
若是要使用其餘編輯器,可使用此KUBE_EDITOR語法添加來覆蓋它。
$ KUBE_EDITOR="nano"kubectl edit cronjob/my-existing-cron
命令4:Kubectl delete
到目前爲止,除了將其徹底刪除以外,咱們已經作了全部事情,這就是咱們下一步要作的。咱們剛剛編輯的cronjob是兩個cronjobs之一,所以如今咱們將刪除整個資源。
$ kubectldeletecronjobmy-existing-croncronjob.batch"my-existing-cron"deleted
做爲警告,切勿刪除你所不知道的全部相關信息的內容。一旦資源被刪除,就沒法恢復。您將不得不從新建立它,所以在運行此命令以前請三思。
命令5:Kubectl apply
以前,筆者提到過某些命令將須要配置文件。該apply命令容許您在集羣內經過文件應用配置資源。這也能夠經過命令行standard in (STDIN)來完成此操做,可是建議始終是按文件進行。
筆者認爲該命令有些高級,由於您須要知道如何使用羣集以及要應用哪一種配置文件。對於此示例,筆者曾經使用來自Helm的基於角色訪問控制(RBAC)配置用於一個服務賬戶。
$kubectl apply -f commands.yamlserviceaccount/tiller createdclusterrolebinding.rbac.authorization.k8s.io/tiller created
您能夠應用幾乎任何所需的配置,可是始終須要肯定要應用的配置,不然可能會看到意想不到的結果。
命令6:Kubectl describe
Describe顯示您正在查看的資源的詳細信息。最多見的用例是描述一個pod或節點,以檢查事件中是否有錯誤,或者資源是否太有限而沒法使用。
您能夠描述的資源包括:
Nodes
Pods
Services
Deployments
Replica sets
Cronjobs
在此示例中,咱們能夠從前面的示例中describe集羣中當前的cronjob。
$ kubectldescribecronjob my-cron片斷:Name: my-cronNamespace:defaultLabels: Annotations: Schedule: /5 *ConcurrencyPolicy:AllowSuspend:FalseSuccessful Job HistoryLimit:3FailedJob HistoryLimit:1StartingDeadlineSeconds: Selector: <unset>Parallelism: <unset>Completions: <unset>PodTemplate:Labels: Containers: my-cron: Image: busyboxPort: Host Port:
命令7:Kubectl logs
雖然describe命令提供pod內應用程序發生的事件,但logs提供了與pod相關的Kubernetes內發生的事件詳細信息。理解這一區別能夠幫助您解決應用程序內部和Kubernetes內部發生的問題,由於它們都是不被容許發生的相同問題。
$kubectl logs cherry-chart-88d49478c-dmcfv -n charts
片斷:
172.17.0.1- - [19/Apr/2020:16:01:15+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:20+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:25+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:30+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:35+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:40+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:45+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:50+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:55+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"
您還能夠經過使用grep命令來消除額外的噪音或尋找其餘事件。該kube-probe可能有噪音,讓咱們用grep命令過濾出來。
$ kubectl logs cherry-chart-88d49478c-dmcfv -n charts |grep-vie kube-probe127.0.0.1- - [10/Apr /2020:23:01:55+0000]"GET / HTTP/1.1"200612"-""Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0"「-」
因爲某些部署在一個pod中有多個容器,您還能夠對日誌使用-c<container name>,從而只在一個特定容器中查找日誌。
命令8:Kubectl exec
與docker exec命令很是類似,您也能夠執行到容器中以直接對應用程序進行故障排除。當Pod中的日誌沒有爲您提供可能要調試的問題的答案時,此功能頗有用。使用exec命令時,該行的末尾必須始終提供您在pod內使用的shell。
$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts --/bin/bashroot@cherry-chart-88d49478c-dmcfv:/#
命令9:Kubectl cp
該命令用於在容器之間複製文件和目錄,就像Linux cp命令同樣。它不是您天天都會使用的東西,可是它是筆者我的最喜歡的,用於在自動化失敗時在緊急狀況下提取或還原備份。
這是將本地文件複製到容器的示例。語法遵循kubectl cp <filename> <namespace/podname:/path/tofile> 格式:
$ kubectl cp commands_copy.txt charts/cherry-chart-88d49478c-dmcfv:commands.txt$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts --/bin/bashroot@cherry-chart-88d49478c-dmcfv:/# lsbin boot commands.txt dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
這是另外一個示例,可是此次是從容器中將文件提取咱們的本地計算機上。語法爲kubectl cp 格式:
$kubectl cp charts/cherry-chart-88d49478c-dmcfv:commands.txt commands_copy.txt$lscommands_copy.txt