系统管理员应该知道的9个kubectl命令

标签: 系统 管理员 知道 | 发表时间:2020-05-25 00:11 | 作者:Fannie
出处:http://weekly.dockone.io

【编者的话】kubectl是kubernetes的一个命令行管理工具,可用于Kubernetes上的应用部署和日常管理。本文列举了9个常见的kubectl命令,并对每个命令进行了简单扼要的介绍,供大家参考。同时,大家也可以通过文中连接获取更详细的介绍。

如今,kubernetes已成为IT基础设施管理界的老大,这也意味着系统管理员需要对其管理非常熟悉。多年以来,我每天都在管理kubernetes集群,所以我总结了一些可以帮助管理员简化管理工作的技巧,供大家参考。
我创建了一个 备忘清单,用于分享kubectl相关的主题,以及我日常使用的kubectl管理命令。备忘清单分为多个小节,方便你判断其是否适合于你的工作。我还在清单引入了一些标签,方便你快速的查阅和使用。

通过kubectl查询,创建,编辑和删除资源

熟悉一个命令行工具最安全的方式是提出问题(读操作),而非发出命令(写操作)。所以使用查询相关的命令是一个很好的开始。

Kubectl get

使用get命令可以列出当前集群上可用的资源清单。你可以通过get获取到的资源包括:
  • Namespace
  • Pod
  • Node
  • Deployment
  • Service
  • Replicasets


每个get命令都可以提供集群中可用资源的详细信息。比如,以下是get nodes命令的输出,列出了Kubernetes的版本和状态。

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

上面的命令,大部分都有简写版本。比如,你可以通过kubectl get namespaces或者kubectl get ns查询namespe信息(可查看备忘录获取完整列表)。

$ 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中的pods时将会非常有用,这些pods是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,你几乎可以创建kubernetes集群中任何类型的资源。一些资源在创建时,需要指定配置文件,namespace以及资源名称。你可以创建的资源包括:
  • service
  • cronjob
  • deployment
  • job
  • namespace (ns)


例如,create namespace需要一个额外的参数指定namespace的名称。

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

我们也可以通过cron创建连续运行的任务,很多使用Linux的朋友可能对此比较熟悉。下面我使用cronjob每隔5秒钟返回一个"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任务时,则可以执行:

$ 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="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命令允许你通过配置文件将配置应用于你的资源。这些配置也可以通过标准输入在命令行输入,但是建议使用文件。
我觉得这是一个进阶命令,因为你需要知道如何使用你的集群,以及什么样的配置文件可以应用于集群。举个例子,我将 Helm的基于角色的访问控制(RBAC)配置用于服务账户。

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

你可以应用几乎任何所需的配置,但是你自己必须清楚这些配置,否则可能得到意想不到的结果。

使用kubectl对kubernetes进行故障排除

Describe会显示你正在查看的资源的详情,最常见的用例是查看一个pod或节点, 以检查是否有异常事件,或者资源是否即将耗尽。
可以查看详情的资源包括:
  • Nodes
  • Pods
  • Services
  • Deployments
  • Replica sets
  • Cronjobs


例如,我们可以查看前面示例中cronjob 的详情。

$ kubectl describe cronjob my-cron  

以下是输出结果的一部分。

Name:                         my-cron  
Namespace:                    default
Labels:                       
Annotations:                  
Schedule:                     */5 * * * *
Concurrency Policy:           Allow
Suspend:                      False
Successful Job History Limit: 3
Failed Job History Limit:     1
Starting Deadline Seconds:    
Selector:                     
Parallelism:                  
Completions:                  
Pod Template:
Labels: 
Containers:
my-cron:
Image:     busybox
Port:      
Host Port: 

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 <容器名称>以便仅查看一个特定容器的日志。

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

该命令用于在容器间复制文件和目录,跟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管理员,还有很多有用的小命令,希望这份备忘单能帮助到你。

原文链接: 9 kubectl commands sysadmins need to know(翻译:木木TM)

相关 [系统 管理员 知道] 推荐:

Linux系统管理员应该知道监控工具

- - CSDN博客推荐文章
如果想监控Linux服务器的性能,请试一下内置的shell命令和一些附加的工具. 很多Linux发行版都有“成吨”的监控工具. 这些工具提供了可度量信息,用于观察系统的活动,找到导致系统性能的可疑之处. 我们下面讨论的工具是一些最基本的. 命令,可以用来系统的分析和服务的调试:. 3、找出CPU、内存瓶颈.

系统管理员应该知道的9个kubectl命令

- - DockOne.io
【编者的话】kubectl是kubernetes的一个命令行管理工具,可用于Kubernetes上的应用部署和日常管理. 本文列举了9个常见的kubectl命令,并对每个命令进行了简单扼要的介绍,供大家参考. 同时,大家也可以通过文中连接获取更详细的介绍. 如今,kubernetes已成为IT基础设施管理界的老大,这也意味着系统管理员需要对其管理非常熟悉.

系统管理员最佳实践准则

- - 博客 - 伯乐在线
本文翻译自  iSystemAdmin 的 《 Best Practices for System Administration Daily Work》. 希望你们每日的系统管理工作都进行的一切顺利. 有时候每天做相同的工作会显得很单调,但这种感觉只会在你没有尝试在服务器上捣鼓些新花样时才会出现.

新时代的 Linux 系统管理员都需要哪些技能?

- - 外刊IT评论
你上次编译内核是多久以前的事儿了. 新生代 Linux 管理员的答案很简单:我压根儿没编译过内核. 我也从没编译过内核,当然自己弄着玩儿的不算. 我实在想不到我为啥需要自定义内核,所以我就用我的“开箱即用”内核了. Linux 老鸟们可能会笑话我们,但你不能否认:随着越来越多的企业采用 Linux,新生代的 Linux 管理员虽然生就一身相当不错的技术实力,却因缺乏编译内核这类简单却基础的技能而和一个优秀的 Linux 管理员之间存在差距.

监测系统的情况,你必须知道的两三事!

- - CSDN博客系统运维推荐文章
       你要是系统运维人员,就要实时的监控系统的一些重要参数,不如僵尸进程,CPU的利用率,内存的使用情况,磁盘空间的使用情况,系统的均衡负载,根据得到的最新信息,我们就能判断系统运行的状态是否良好. 本人接触linux系统也有一点时间,在网上看看了,经过整理,将一些常用的系统监控的命令shell脚本拿出来晒晒,希望给新手提供学习的机会,同时也希望经验丰富者提够些技术知道,多多探讨交流.

Android系统其实不需要极度精简,您未必知道的瘦身之法

- - 一抹新绿
安卓系统其实不需要极度精简,至少我不推荐这种行为,只是一味的精简并不会给系统带来什么好处反而只有害处,因为许多系统应用跟设置里的选项有关联,应当尽量保证系统的完整性. 后台为什么会无缘无故多出很多进程呢. 如果你真的理解安卓进程管理机制和软件架构的话,就会发现各种Receiver,各种CHANGED事件其实才是主因,一切都是软件进程事件触发自行后台启动造成的.

图书馆管理员的报复

- duyao678 - 槽边往事---《比特海日志》
很多年前,我曾经在南京大学图书馆里勤工俭学. 那个图书馆在北院,进了学校大门的右手边,一栋其貌不扬的灰色小楼. 但是,它以傲人的藏书量位列全国高校前三甲. 我当时在第六号书库服务,负责把还回的书籍放置到它们原来的位置上. 夏天南京的温度逼近摄氏40度,空气极为潮湿,遇见冰冷的一楼墙壁就冷凝成水,顺着墙面流淌下来.

ZooKeeper管理员指南——部署与管理ZooKeeper

- - 淘宝网综合业务平台团队博客
本文以ZooKeeper3.4.3版本的官方指南为基础: http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要点,围绕ZK的部署和运维两个方面讲一些管理员需要知道的东西. 本文并非一个ZK搭建的快速入门,关于这方面,可以查看《 ZooKeeper快速搭建》.