系统管理员需要了解的 9 个 kubectl 命令

下载我们的新 kubectl 速查表,学习 Kubernetes 命令行实用程序的实用命令。
220 位读者喜欢这篇文章。
Blender Hotkey Cheat Sheet

Opensource.com

Kubernetes 是当今基础设施领域的主导技术,这意味着系统管理员需要熟悉如何管理它。多年来,我每天都在管理 Kubernetes 集群,我总结了一些技巧,我强烈建议其他希望简化管理体验的人使用。

我创建了这个速查表,分享关于 kubectl 的关键笔记以及我每天用于保持集群运行的命令。它分为几个部分,以帮助您评估是否应将它们用于某些任务。我还包括了一些长格式和简写形式的标志,以帮助您更快地熟练掌握它们。

使用 kubectl 获取、创建、编辑和删除资源

使用命令行实用程序最安全的起点是提出问题(读取操作)而不是发出命令 (写入操作)。 有用的 get 命令可以帮助您入门。

Kubectl get

使用 get 拉取您当前集群上资源的列表。您可以 get 的资源类型包括

  • 命名空间
  • Pod
  • 节点
  • Deployment
  • Service
  • ReplicaSets

这些都提供了集群中可用资源的详细信息。例如,以下是 get nodes 命令的输出,它提供了 Kubernetes 的使用版本和状态。

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   9d    v1.18.0

大多数这些命令都有缩短版本。要获取命名空间,您可以运行 kubectl get namespaceskubectl 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

每个 get 命令 都可以使用 –namespace-n 标志专注于给定的命名空间。当您想要查看 kube-system 中的 pod 时,我特别使用它,这些 pod 是运行 Kubernetes 本身所需的服务。

$ kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-mjptx           1/1     Running   2          9d
coredns-66bff467f8-t2xcz           1/1     Running   2          9d
etcd-minikube                      1/1     Running   1          9d
kube-apiserver-minikube            1/1     Running   1          9d
kube-controller-manager-minikube   1/1     Running   2          9d
kube-proxy-rpc9d                   1/1     Running   1          9d
kube-scheduler-minikube            1/1     Running   2          9d
storage-provisioner                1/1     Running   1          9d

Kubectl create

既然我们已经收集了一些资源,让我们创建更多资源。使用 kubectl,您可以在集群中创建几乎任何类型的资源。其中一些资源确实需要配置文件和命名空间来设置资源,以及名称。您可以创建的资源包括

  • service
  • cronjob
  • deployment
  • job
  • namespace (ns)

因此,例如, create namespace 需要另一个参数来命名命名空间。

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

我们还可以使用 cron 创建持续运行的作业,就像许多 Linux 朋友熟悉的那样。在这里,我们使用 cronjob 每五秒回显“hello”。

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

您也可以使用缩写版本 cj,而不是 cronjob

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

Kubectl edit

那么,当我们创建了一些东西,并且想要更新时会发生什么?这就是 kubectl edit 的用武之地。

当您运行此命令时,您可以编辑集群中的任何资源。它将打开您的默认文本编辑器。 因此,我们将编辑我们现有的 cron 作业,我们可以运行

$ 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 秒执行一次

kubectl schedule

我们将将其更改为每 25 秒执行一次并写入资源

kubectl schedule

一旦我们写入它,我们就可以看到它已更改。

$ 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 命令允许您通过文件为集群中的资源应用配置。这也可以通过命令行上的 标准输入 (STDIN) 完成,但建议始终通过文件进行。

我认为这个命令有点高级,因为您需要知道如何使用您的集群以及要应用到它的配置文件的类型。对于此示例,我使用的是 Helm 中用于服务帐户的基于角色的访问控制 (RBAC) 配置。

$ kubectl apply -f commands.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

您可以应用几乎任何您想要的配置,但您始终需要确定您要应用的内容,否则您可能会看到意外的结果。

使用 kubectl 排除 Kubernetes 故障

Kubectl describe

Describe 显示您正在查看的资源的详细信息。最常见的用例是描述 pod 或节点,以检查事件中是否存在错误,或者资源是否过于有限而无法使用。

您可以 describe 的资源包括

  • 节点
  • Pods
  • 服务
  • Deployments
  • 副本集
  • 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 中有多个容器,您还可以将 -c <container name> 与您的 logs 一起使用,以便仅在一个特定容器中查找 logs

Kubectl exec

很像 docker exec 命令,您也可以 exec 进入容器以直接排除应用程序故障。当 pod 的 logs 未能为您提供您可能正在调试的问题的答案时,这非常有用。使用 exec 命令时,行尾必须始终提供您在 pod 中使用的 shell。

$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash
root@cherry-chart-88d49478c-dmcfv:/#

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/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

下载 kubectl 速查表

作为 Kubernetes 管理员,有很多有用的命令。我希望这个速查表对您有所帮助!

接下来阅读什么
User profile image.
科技游民,从事我能找到的任何工作。IT 领域 silo 预防的倡导者,与所有团队共享信息的重要性。相信教育所有人以及开源开发。热爱所有科技事物。一切都与 K8s、混沌以及我能找到的任何新事物和闪亮的事物有关!Mastodon ID

6 条评论

不错的信息

很棒的文章!

一个小小的挑剔:exec 命令不仅仅是打开一个 shell,您可以一次性执行 pod/容器有权访问的任何命令。在您的示例中,您只是执行 `/bin/bash` 以便四处查看并运行其他命令,但如果您安装了其他程序或脚本,您可以只调用它,而不是。

因此,假设您有一个命令可以运行您尚未完全自动化的特定操作任务,您的命令可能是

kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /etc/path/to/script.sh

这将只运行 /etc/path/to/script.sh,将所有 stdin/stdout 放到您的终端,然后在完成后退出,而不是保持终端在容器内打开。

不错的文章!您的 cronjob 示例 ‘*/15 * * * *’ 不是每 15 分钟运行一次,而不是每秒运行一次,或者 cron 在 Kubernetes 中是否不同?

这是一篇很棒的文章,但如果我可以提出一个建议,那就是能够共享指向内容特定部分的链接,那就太棒了。

这可以在 HTML 中轻松实现,并且是一个很棒的功能!

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.