Kubernetes 是当今基础架构的主导技术,这意味着系统管理员需要熟悉它的管理。 我多年来一直在管理 Kubernetes 集群,并且掌握了一些技巧,我强烈建议其他人学习这些技巧,以简化他们的管理体验。
我创建了这个 速查表,分享关于 kubectl 的关键笔记以及我每天用来保持集群正常运行的命令。它分为几个部分,以帮助你评估是否应该将它们用于某些任务。我还包括了一些长格式和简写形式的标志,以帮助你更快地熟练掌握它们。
使用 kubectl 获取、创建、编辑和删除资源
使用命令行实用程序最安全的地方是从提问(读取操作)开始,而不是发出命令(写入操作)。 有用的 get 命令可以让你开始。
Kubectl get
使用 get 命令来获取当前集群上的资源列表。 你可以 get 的资源类型包括
- 命名空间 (Namespace)
- Pod
- 节点 (Node)
- 部署 (Deployment)
- 服务 (Service)
- 副本集 (ReplicaSets)
这些资源类型中的每一个都提供了有关集群中可用资源的详细信息。 例如,这是 get nodes 命令的输出,它提供了 Kubernetes 的使用版本和状态。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 9d v1.18.0
大多数这些命令都有缩短的版本。 要获取命名空间,你可以运行 kubectl get namespaces 或 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
每个 get 命令都可以使用 –namespace 或 -n 标志来关注给定的命名空间。 当你想查看 kube-system 中的 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 秒一次

我们将把它改为每 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 是两个 cronjob 之一,所以现在我们将删除整个资源。
$ 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 的资源包括
- 节点 (Nodes)
- Pod
- 服务 (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 中有多个容器,你还可以将 -c <容器名称> 与你的日志一起使用,以便仅在一个特定容器中查找 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 管理员来说非常有用。 我希望这个速查表对你有帮助!
6 条评论