kubectl 是 Kubernetes 的一個指令行管理工具,可用于 Kubernetes 上的應用部署和日常管理。本文列舉了 9 個常見的 kubectl 指令,并總結了一些使用技巧,希望可以幫助系統管理者簡化管理工作。
一、使用 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 秒:
我們将其更改為每 25 秒:
編寫完成後,可以看到修改已生效。
$ 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