[译] 总记不住 Helm 和 kubectl 命令?这场超市购物之旅可以帮你

本周四晚上8点, K3s技术实践训练营第三期将准时开播!Rancher中国研发团队出品的

IoT设备管理开源项目

Octopus


首次线上demo啦!快来一睹芳容!

扫描下方二维码即可报名:

最近,我丈夫即将要去面试,他要在电脑上运行一些基本命令。他对面试很焦虑,但他学习和记忆事物的最好方法一直是把他不知道的东西等同于他非常熟悉的东西。因为我们的谈话发生逛超市期间,试图决定当晚做什么菜之后,突然启发了我把kubectl和Helm命令等同于一次普通的超市购物之行,于是这篇文章就诞生了。
首先,我先简单介绍一下Helm和kubectl。
Helm是一个在Kubernetes中用于管理应用程序的工具。你可以通过应用程序地信息简单地部署chart并允许它们在你的Kubernetes环境中启动并且预配置,这一过程仅需几分钟。当你正在学习一些新东西时,查看chart示例总是很有帮助,你可以通过实例了解它们是如何使用的,所以如果你有时间的话可以看看这些chart:
https://github.com/helm/charts/tree/master/stable
kubectl是Kubernetes环境中的命令行交互工具,你可以使用它配置和管理你的集群。它确实需要一些配置才能在环境中工作,建议你仔细查看文档以确定你所需的配置:
https://kubernetes.io/docs/reference/kubectl/overview/

我将在例子中使用命名空间,如果你想详细了解命名空间的入门知识可以查看我们的往期文章: 超长干货 | Kubernetes命名空间详解

既然我们已经了解了所有基本概念,那么让我们开始了解kubectl和Helm的基本命令吧!


购物前的准备:Helm list

一般你去超市之前第一件事是做什么?如果你早有逛超市的计划,那么你应该会先列出一个购物清单(list)。与此相似,list也是我要介绍的第一个基本的Helm命令。
在一个使用Helm部署的应用程序,list提供了该应用程序当前版本的详细信息。在本例中,我有一个部署的应用程序——Jenkins CI/CD应用程序。运行基本的list命令一般都在默认的命名空间中,由于我没有在该命名空间中部署任何应用程序,因此没有任何输出:

$ helm list

NAME    NAMESPACE    REVISION    UPDATED    STATUS    CHART    APP VERSION

但是,如果我使用一个额外的flag运行该命令,我的应用程序及其信息将会显示出来:

$ helm list --all-namespaces

NAME     NAMESPACE  REVISION  UPDATED                   STATUS      CHART           APP  VERSION

jenkins  jenkins        1         2020-01-18 16:18:07 EST   deployed    jenkins-1.9.4   lts

最后,我可以让list命令只检查我想要的命名空间的信息:

$ helm list --namespace jenkins

NAME     NAMESPACE  REVISION  UPDATED                   STATUS    CHART          APP VERSION

jenkins    jenkins      1              2020-01-18 16:18:07 EST  deployed  jenkins-1.9.4  lts

现在我有了一个列表,并且清晰地了解到列表的内容,那么我可以使用get命令获取我的项目了。先从Kubernetes集群说起,我可以从它那里得到什么?


获取商品状态:Kubectl get

Kubectl get命令可以帮助你获取Kubernetes中许多组件的信息,包括pod、节点和命名空间等。同样,如果没有命名空间flag,你所获得的信息一般都是默认的命名空间信息。首先,我将获取集群中的命名空间,看看其中运行的是什么:

$ kubectl get namespaces

NAME             STATUS   AGE

default          Active   53m

jenkins          Active   44m

kube-node-lease  Active   53m

kube-public      Active   53m

kube-system      Active   53m

现在在我的环境中有许多正在运行的命名空间,我将获取节点并查看有多少个节点正在运行:

$ kubectl get nodes

NAME       STATUS   ROLES       AGE   VERSION

minikube   Ready    master  55m   v1.16.2

可以看出,我有一个节点已经启动并且正在运行,主要因为我的minikube正运行在一个小型server上。想要获取一个节点上正在运行的pod信息,请输入:

$ kubectl get pods

No resources found in default namespace.

Oops,它是空的。让我加上具体的命名空间信息试试看:

$ kubectl get pods --namespace jenkins

NAME                      READY  STATUS   RESTARTS  AGE

jenkins-7fc688c874-mh7gv  1/1    Running  0         40m

Good news!该命名空间中有一个pod,它尚未被重启并且已经运行了40分钟。既然我已经知道了这个pod已经启动,那么我想查看我可以从Helm中获得什么。


取商品信息:
Helm get

Helm get略微复杂一些,因为get命令所需的不仅是一个应用程序的名字,并且你可以从应用程序中请求多个东西。我将从获取用于构建应用程序的值开始,然后我会展示get all的一个代码段,它提供了与应用程序相关的所有数据:

$ helm get values jenkins -n jenkins

USER-SUPPLIED VALUES:

null

因为我只做了一个非常小的稳定版安装,所以配置没有改变。如果我运行all命令,我就会得到chart中的所有内容:

$ helm get all jenkins -n jenkins

这将产生大量的数据,所以我建议你保留一份Helm chart的副本,以便你可以查看chart中的模板。我还创建了自己的值,以查看我所拥有的内容。
现在我的购物车里已经有了所有需要的东西,我开始检查描述它们的标签。这些例子只与kubectl有关,它们描述了我通过Helm部署的内容。


了解所需商品描述:Kubectl describe

就像我使用get命令一样,它可以描述Kubernetes中的任何东西。我将把我的示例限制在命名空间、pod和节点上,因为我知道我需要操作每一个组件,所以获取描述并不困难。

$ kubectl describe ns jenkins

Name:           jenkins

Labels:         <none>

Annotations:  <none>

Status:         Active

No resource quota.

No resource limits.

我可以看到我的命名空间的名称并且它处于active状态,而且没有资源或者quote的限制。
使用describe pod命令将会输出大量信息,所以我仅提供一小段输出。如果你运行该命令时没有添加pod名称,那么它将返回该命名空间中所有Pod的信息,信息量极大。所以,请确保你在使用该命令时包含了pod名称,例如:

$ kubectl describe pods jenkins-7fc688c874-mh7gv --namespace jenkins

以上片段提供了容器的状态、容器的管理方式、标签(label)和pod中使用的镜像。在以上简略的输出中不包含资源请求和限制以及init容器和应用在Helm值文件中的存储卷信息等数据。如果你的应用程序由于资源不足而崩溃,那么刚刚提到的这些数据是有用的,因为配置好的init容器所运行的配置预脚本,或生成的隐藏密码不会存储在纯文本YAML文件中。
最后,我将使用describe node命令来查看节点信息。由于本例中仅有一个节点,名为minikube,如果在你的环境中有多个节点,你必须在命令中包含指定的节点名称。
与pod一样,节点命令会产生大量数据,因此我仅仅贴出一小段输出:

$ kubectl describe node minikube


请注意describe node是比较重要的基本命令之一。正如该图所示,该命令返回的统计数据表明了节点何时耗尽资源,这些数据对于提醒你何时需要扩大规模(如果你的环境中没有弹性伸缩)是非常有意义的。其他不在该代码段输出中的数据包括对所有资源和限制所做的请求的百分比,以及资源的周期和分配。


最终检查

通过这些命令,我已经完成了我的采购并获得了我所寻找的所有东西。希望这些基本的命令也能够在你的Kubernetes之旅中帮助到你。
建议你经常使用这些命令行,并且可以通过运行以下命令,在帮助部分学习flag的速记:

$ helm --help

以及

$ kubectl -h


薯条和番茄酱

有些东西就像薯条和番茄酱一样相配,例如Helm和kubectl。
我经常在我的环境中使用这些工具。因为它们在很多地方都有相似之处,所以在使用一个之后,我通常需要继续使用另一个。试试它们一起使用,看看它们能为你做什么。

推荐阅读

GitOps初阶指南:将DevOps扩展至K8S

5个规则,确保你的微服务优化运行

如何选出适合自己的管理Helm Chart的最佳方式?

About Rancher Labs

Rancher Labs由CloudStack之父梁胜创建。旗舰产品Rancher是一个开源的企业级Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理。Rancher一向因操作体验的直观、极简备受用户青睐,被Forrester评为2018年全球容器管理平台领导厂商,被Gartner评为2017年全球最酷的云基础设施供应商。
目前Rancher在全球拥有超过三亿的核心镜像下载量,并拥有包括中国联通、中国平安、中国人寿、上汽集团、三星、西门子、WWK保险集团、澳电讯公司、德国铁路、厦门航空、新东方等全球著名企业在内的共40000家企业客户。


点击【阅读原文】,看Octopus线上首秀!
↓↓↓