Kubernetes是当今基础架构的主导技术,这意味着系统管理员须要熟悉其管理。多年来,笔者一直坚持天天管理Kubernetes集群,而且总结了一些技巧,但愿能够帮助其余人简化他们的管理。node
笔者在这里分享9个有关kubectl的命令,主要说明笔者天天用来管理Kubernetes集群的正常运行的命令。笔者将它们分为几部分,以帮助读者肯定是否应将它们用于某些任务。笔者还以长号和简写形式包含了一些标志,以帮助读者更快地使用它们。docker
从命令行实用程序开始,最安全的地方是提问(读操做)而不是发出命令(写操做)。有用的get命令可使您滚动起来。shell
命令1:Kubectl getapi
使用get能够获取集群中当前拥有的资源列表。您能够得到的资源类型包括:安全
Namespacebash
Pod架构
Nodeapp
Deployment编辑器
Serviceide
ReplicaSets
每一个选项都提供有关群集中可用资源的详细信息。例如,这是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 Active8ddefaultActive9dkube-node-lease Active9dkube-public Active9dkube-system Active9d
每一个get命令均可以使用–namespace或-n标志集中于给定的命名空间。当您想要查看kube-system中的Pod时,笔者会特别提供帮助,这是运行Kubernetes自己所需的服务。
$ kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-66bff467f8-mjptx1/1Running29dcoredns-66bff467f8-t2xcz1/1Running29detcd-minikube1/1Running19dkube-apiserver-minikube1/1Running19dkube-controller-manager-minikube1/1Running29dkube-proxy-rpc9d1/1Running19dkube-scheduler-minikube1/1Running29dstorage-provisioner1/1Running19d
命令2:Kubectl create
使用kubectl,您几乎能够在集群中建立任何类型的资源。其中一些资源确实须要配置文件和命名空间来设置资源以及名称。您能够建立的资源包括:
service
cronjob
deployment
job
namespace (ns)
所以,建立create namespace须要另外一个参数来命名命名空间。
$kubectl create ns hello-therenamespace/hello-there created
咱们也可使用cron命令来连续建立运行做业,就像许多Linux朋友会熟悉的那样。在这里,咱们使用cronjob命令每五秒钟回显一次“ hello”。
$kubectl create cronjob my-cron --image=busybox --schedule="/5 *"--echohellocronjob.batch/my-namespaced-cron created
您也可使用简化版的命令cj而不是cronjob。
$kubectl create cj my-existing-cron --image=busybox --schedule="/15 *"--echohellocronjob.batch/my-existing-cron created
命令3:Kubectl edit
那么,当笔者们建立某些东西并想要更新时会发生什么呢?这就是kubectl edit的做用。
运行此命令时,能够编辑集群中的任何资源。它将打开您的默认文本编辑器。所以,咱们将编辑现有的cronjob,咱们能够运行:
$kubectl edit cronjob/my-existing-cron
这显示了咱们要编辑的配置。
这个计划设置为每15秒一次:
咱们将其更改成每25秒写入一次资源:
编写完成后,咱们能够看到它已更改。
$ kubectl edit cronjob/my-existing-croncronjob.batch/my-existing-cron edited
若是要使用其余编辑器,可使用此KUBE_EDITOR语法添加来覆盖它。
$ KUBE_EDITOR="nano"kubectl edit cronjob/my-existing-cron
命令4:Kubectl delete
到目前为止,除了将其彻底删除以外,咱们已经作了全部事情,这就是咱们下一步要作的。咱们刚刚编辑的cronjob是两个cronjobs之一,所以如今咱们将删除整个资源。
$ kubectldeletecronjobmy-existing-croncronjob.batch"my-existing-cron"deleted
做为警告,切勿删除你所不知道的全部相关信息的内容。一旦资源被删除,就没法恢复。您将不得不从新建立它,所以在运行此命令以前请三思。
命令5:Kubectl apply
以前,笔者提到过某些命令将须要配置文件。该apply命令容许您在集群内经过文件应用配置资源。这也能够经过命令行standard in (STDIN)来完成此操做,可是建议始终是按文件进行。
笔者认为该命令有些高级,由于您须要知道如何使用群集以及要应用哪一种配置文件。对于此示例,笔者曾经使用来自Helm的基于角色访问控制(RBAC)配置用于一个服务账户。
$kubectl apply -f commands.yamlserviceaccount/tiller createdclusterrolebinding.rbac.authorization.k8s.io/tiller created
您能够应用几乎任何所需的配置,可是始终须要肯定要应用的配置,不然可能会看到意想不到的结果。
命令6:Kubectl describe
Describe显示您正在查看的资源的详细信息。最多见的用例是描述一个pod或节点,以检查事件中是否有错误,或者资源是否太有限而没法使用。
您能够描述的资源包括:
Nodes
Pods
Services
Deployments
Replica sets
Cronjobs
在此示例中,咱们能够从前面的示例中describe集群中当前的cronjob。
$ kubectldescribecronjob my-cron片断:Name: my-cronNamespace:defaultLabels: Annotations: Schedule: /5 *ConcurrencyPolicy:AllowSuspend:FalseSuccessful Job HistoryLimit:3FailedJob HistoryLimit:1StartingDeadlineSeconds: Selector: <unset>Parallelism: <unset>Completions: <unset>PodTemplate:Labels: Containers: my-cron: Image: busyboxPort: Host Port:
命令7:Kubectl logs
虽然describe命令提供pod内应用程序发生的事件,但logs提供了与pod相关的Kubernetes内发生的事件详细信息。理解这一区别能够帮助您解决应用程序内部和Kubernetes内部发生的问题,由于它们都是不被容许发生的相同问题。
$kubectl logs cherry-chart-88d49478c-dmcfv -n charts
片断:
172.17.0.1- - [19/Apr/2020:16:01:15+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:20+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:25+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:30+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:35+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:40+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:45+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:50+0000]"GET / HTTP/1.1"200612"-""kube-probe/1.18""-"172.17.0.1- - [19/Apr/2020:16:01:55+0000]"GET / HTTP/1.1"200612"-""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"200612"-""Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0"“-”
因为某些部署在一个pod中有多个容器,您还能够对日志使用-c<container name>,从而只在一个特定容器中查找日志。
命令8:Kubectl exec
与docker exec命令很是类似,您也能够执行到容器中以直接对应用程序进行故障排除。当Pod中的日志没有为您提供可能要调试的问题的答案时,此功能颇有用。使用exec命令时,该行的末尾必须始终提供您在pod内使用的shell。
$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts --/bin/bashroot@cherry-chart-88d49478c-dmcfv:/#
命令9: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/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 格式:
$kubectl cp charts/cherry-chart-88d49478c-dmcfv:commands.txt commands_copy.txt$lscommands_copy.txt