作者:才云 Caicloud K8sMeetup社區
新出爐的 kubectl 備忘單,可以幫助大家了解有關 Kubernetes 命令行實用程序的有用命令。
作者:Jessica Cherry
翻譯:Bach(才云)
校對:星空下的文仔(才云)、bot(才云)
kubectl 是 Kubernetes 的一個命令行管理工具,可用于 Kubernetes 上的應用部署和日常管理。本文列舉了 9 個常見的 kubectl 命令,并總結了一些使用技巧,希望可以幫助系統管理員簡化管理工作。
K8sMeetup
使用 Kubectl 查詢、創建、編輯和刪除資源
對于剛開始使用命令行工具的開發者,最保險的方法是提出問題(讀取操作),而不是發出命令(寫入操作),所以從使用 get 命令開始是個不錯的選擇。
Kubectl get
使用 get 命令可以獲取當前集群中可用的資源列表,包括:
- Namespace
- Pod
- Node
- Deployment
- Service
- ReplicaSet
每個 get 命令都能提供集群中可用資源的詳細信息。例如 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 Active 8ddefault Active 9dkube-node-lease Active 9dkube-public Active 9dkube-system Active 9d
每個 get 命令都可以使用 –namespace 或 -n 參數指定對應的命名空間。這點對于查看 kube-system 中的 Pods 會非常有用,因為這些 Pods 是 Kubernetes 自身運行所需的服務。
$ kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoreDNS-66bff467f8-mjptx 1/1 Running 2 9dcoredns-66bff467f8-t2xcz 1/1 Running 2 9detcd-minikube 1/1 Running 1 9dkube-apiserver-minikube 1/1 Running 1 9dkube-controller-manager-minikube 1/1 Running 2 9dkube-proxy-rpc9d 1/1 Running 1 9dkube-scheduler-minikube 1/1 Running 2 9dstorage-provisioner 1/1 Running 1 9d
Kubectl create
可以查詢資源后,下一步是創建資源。我們可以用 kubectl 在集群中創建任何類型的資源,包括:
- Service
- Cronjob
- Deployment
- Job
- Namespace(ns)
其中,一些資源的創建需要設置配置文件、命名空間以及資源名稱。例如,創建命名空間就需要一個額外參數來指定命名空間。
$ kubectl create ns hello-therenamespace/hello-there created
linux 里可以使用 cron 創建定時運行的任務。同樣的,這里我們使用 cronjob 每五秒鐘返回一次“hello”。
???????
$ kubectl create cronjob my-cron --image=busybox --schedule="*/5 * * * *" -- echo hellocronjob.batch/my-namespaced-cron created
我們也可以使用 cronjob 的簡寫版本 cj。
???????
$ kubectl create cj my-existing-cron --image=busybox --schedule="*/15 * * * *" -- echo hellocronjob.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/v1beta1kind: CronJobmetadata: 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-croncronjob.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-croncronjob.batch "my-existing-cron" deleted
需要注意的是,如果不知道資源是否有關聯信息,最好不要刪除。因為刪除后無法恢復,只能重新創建。
Kubectl Apply
上文提到,某些命令需要配置文件,而 apply 命令可以在集群內調整配置文件應用于資源。雖然也可以通過命令行 standard in (STNIN) 來完成,但 apply 命令更好一些,因為它可以讓你知道如何使用集群,以及要應用哪種配置文件。作為示例,下文會將 Helm 的基于角色的訪問控制(RBAC)配置用于服務帳戶。
???????
$ kubectl apply -f commands.yamlserviceaccount/tiller createdclusterrolebinding.rbac.authorization.k8s.io/tiller created
我們可以應用幾乎任何配置,但是一定要明確所要應用的配置,否則可能會引發意料之外的后果。
K8sMeetup
使用 Kubectl 對 Kubernetes 進行故障排除
Kubectl describe
describe 命令可以查看資源的詳細信息。比較常見的用法是查看一個 Pod 或節點信息,以檢查是否有異常、資源是否耗盡。
該命令可以查看的資源包括:
- Nodes
- Pods
- Services
- Deployments
- Replica sets
- Cronjobs
舉個例子,我們用 describe 命令查看上文集群中 cronjob 的詳細信息。
$ kubectl describe cronjob my-cron
以下是部分信息:
???????
Name: my-cronNamespace: defaultLabels: <none>Annotations: <none>Schedule: */5 * * * *Concurrency Policy: AllowSuspend: FalseSuccessful Job History Limit: 3Failed Job History Limit: 1Starting 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-probe127.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/bashroot@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/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 <
namespace/podname:/path/tofile>。
$ kubectl cp charts/cherry-chart-88d49478c-dmcfv:commands.txt commands_copy.txt$ lscommands_copy.txt
以上就是今天 K8sMeetup 中國社區推薦的內容,祝大家周末愉快!