天天看點

K8s Kubectl 技巧集錦,輕松管理叢集

作者:LinkSLA智能運維管家

kubectl 是 Kubernetes 的一個指令行管理工具,可用于 Kubernetes 上的應用部署和日常管理。本文列舉了 9 個常見的 kubectl 指令,并總結了一些使用技巧,希望可以幫助系統管理者簡化管理工作。

一、使用 Kubectl 查詢、建立、編輯和删除資源

K8s Kubectl 技巧集錦,輕松管理叢集

對于剛開始使用指令行工具的開發者,最保險的方法是提出問題(讀取操作),而不是發出指令(寫入操作),是以從使用 get 指令開始是個不錯的選擇。

  • Kubectl get

使用 get 指令可以擷取目前叢集中可用的資源清單,包括:

  • Namespace
  • Pod
  • Node
  • Deployment
  • Service
  • ReplicaSet

每個 get 指令都能提供叢集中可用資源的詳細資訊。例如 get nodes 指令就提供了 Kubernetes 的狀态和版本。

這些指令大多數還具有簡寫版本。例如,要擷取命名空間,可以使用 kubectl get ns 指令:

$ kubectl get ns

NAME              STATUS   AGE

charts            Active   8d

default           Active   9d

kube-node-lease   Active   9d

kube-public       Active   9d

kube-system       Active   9d           
  • Kubectl create

可以查詢資源後,下一步是建立資源。我們可以用 kubectl 在叢集中建立任何類型的資源,包括:

  • Service
  • Cronjob
  • Deployment
  • Job
  • Namespace(ns)

其中,一些資源的建立需要設定配置檔案、命名空間以及資源名稱。例如,建立命名空間就需要一個額外參數來指定命名空間。

$ kubectl create ns hello-there
namespace/hello-there created           

Linux 裡可以使用 cron 建立定時運作的任務。同樣的,這裡我們使用 cronjob 每五秒鐘傳回一次“hello”。

$ kubectl create cronjob my-cron --image=busybox --schedule="*/5 * * * *" -- echo hello

cronjob.batch/my-namespaced-cron created           

我們也可以使用 cronjob 的簡寫版本 cj。

$ kubectl create cj my-existing-cron --image=busybox --schedule="*/15 * * * *" -- echo hello

cronjob.batch/my-existing-cron created           
  • Kubectl edit

當我們建立好資源後,如果需要修改,該怎麼辦?這時候就需要 kubectl edit 指令了。

我們可以用這個指令編輯叢集中的任何資源。它會打開預設文本編輯器。如果我們要編輯現有的 cron job,則可以執行:

$ kubectl edit cronjob/my-existing-cron           

我們要編輯的配置如下:

# Please edit the object below. Lines beginning with a '#' will be ignored,

# and an empty file will abort the edit. If an error occurs while saving this file will be

# reopened with the relevant failures.

#

apiVersion: batch/v1beta1

kind: CronJob

metadata:

  creationTimestamp: "2020-04-19T16:06:06Z"

  managedFields:

  - apiVersion: batch/v1beta1

    fieldsType: FieldsV1

    fieldsV1:

      f:spec:

        f:concurrencyPolicy: {}

        f:failedJobsHistoryLimit: {}

        f:jobTemplate:

          f:metadata:

            f:name: {}

          f:spec:

            f:template:

              f:spec:

                f:containers:

                  k:{"name":"my-new-cron"}:

                    .: {}

                    f:command: {}

                    f:image: {}

                    f:imagePullPolicy: {}           

原本排程間隔設定為 15 秒:

K8s Kubectl 技巧集錦,輕松管理叢集

我們将其更改為每 25 秒:

K8s Kubectl 技巧集錦,輕松管理叢集

編寫完成後,可以看到修改已生效。

$ kubectl edit cronjob/my-existing-cron

cronjob.batch/my-existing-cron edited           

另外,我們可以通過 KUBE_EDITOR 指令來使用其他編輯器。

$ KUBE_EDITOR="nano" kubectl edit cronjob/my-existing-cron           
  • Kubectl delete

學會了以上指令後,下面我們将進行删除操作。剛剛編輯的 cronjob 是兩個 cronjobs 之一,現在我們删除整個資源。

$ kubectl delete cronjob my-existing-cron
cronjob.batch "my-existing-cron" deleted           

需要注意的是,如果不知道資源是否有關聯資訊,最好不要删除。因為删除後無法恢複,隻能重新建立。

  • Kubectl apply

上文提到,某些指令需要配置檔案,而 apply 指令可以在叢集内調整配置檔案應用于資源。雖然也可以通過指令行 standard in (STNIN) 來完成,但 apply 指令更好一些,因為它可以讓你知道如何使用叢集,以及要應用哪種配置檔案。作為示例,下文會将 Helm 的基于角色的通路控制(RBAC)配置用于服務帳戶。

$ kubectl apply -f commands.yaml

serviceaccount/tiller created

clusterrolebinding.rbac.authorization.k8s.io/tiller created           

我們可以應用幾乎任何配置,但是一定要明确所要應用的配置,否則可能會引發意料之外的後果。

二、使用 Kubectl 對 Kubernetes 進行故障排除

  • Kubectl describe

describe 指令可以檢視資源的詳細資訊。比較常見的用法是檢視一個 Pod 或節點資訊,以檢查是否有異常、資源是否耗盡。

該指令可以檢視的資源包括:

  • Nodes
  • Pods
  • Services
  • Deployments
  • Replica sets
  • Cronjobs

舉個例子,我們用 describe 指令檢視上文叢集中 cronjob 的詳細資訊。

$ kubectl describe cronjob my-cron           

以下是部分資訊:

Name:                         my-cron

Namespace:                    default

Labels:                       <none>

Annotations:                  <none>

Schedule:                     */5 * * * *

Concurrency Policy:           Allow

Suspend:                      False

Successful Job History Limit: 3

Failed Job History Limit:     1

Starting Deadline Seconds:    <unset>

Selector:                     <unset>

Parallelism:                  <unset>

Completions:                  <unset>

Pod Template:

  Labels: <none>

  Containers:

   my-cron:

    Image:     busybox

    Port:      <none>

    Host Port: <none>           
  • Kubectl logs

雖然 describe 指令可以讓你知道 Pod 内部應用程式發生的事,但 logs 指令可以提供 Kubernetes 中 Pod 的更多詳細資訊。了解這種差別可以幫助開發者更好地對應用程式内部以及 Kubernetes 内部發生的問題,并進行故障排除,這二者往往并不相同。

$ kubectl logs cherry-chart-88d49478c-dmcfv -n charts           

以上指令的部分輸出結果如下:

172.17.0.1 - - [19/Apr/2020:16:01:15 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:20 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:25 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:30 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:35 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:40 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:45 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:50 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

172.17.0.1 - - [19/Apr/2020:16:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"           

grep 指令可以過濾無關資訊或檢視特定事件。例如,下面的 kube-probe 可能是無關資訊,我們用 grep 指令對其進行過濾。

$ kubectl logs cherry-chart-88d49478c-dmcfv -n charts | grep -vie kube-probe
127.0.0.1 - - [10/Apr /2020:23:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0" “-”           

在有些部署中,存在一個 Pod 有多個容器的情況,是以我們可以在 logs 指令中使用 -c <容器名稱>,以查找指定容器的日志。

  • Kubectl exec

與 docker exec 指令相似,exec 指令也可以在容器中直接對應用程式進行故障排除。尤其當 Pod 的日志無法定位問題時, 它會特别好用。另外要注意的是,使用 exec 指令時,必須要以 Pod 内使用的 shell 作為指令的最後一個參數。

$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash

root@cherry-chart-88d49478c-dmcfv:/#           
  • Kubectl cp

Kubectl cp 指令與 Linux cp 指令類似,用于容器之間複制檔案和目錄。另外,該指令還能在自動化失敗等緊急情況下進行恢複備份。

以下是将本地檔案拷貝到容器的示例。指令格式為:kubectl cp 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/bash

root@cherry-chart-88d49478c-dmcfv:/# ls

bin  boot  commands.txt  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var           

下面是将容器内的檔案拷貝到本地計算機上的示例。指令格式為:

kubectl cp namespace/podname:/path/tofile。

$ kubectl cp charts/cherry-chart-88d49478c-dmcfv:commands.txt commands_copy.txt

$ ls

commands_copy.txt