对不少IT人员来说,每天与Kubernetes交互的机制一般是通过kubectl——一种命令行工具。kubectl主要用于与Kubernetes API服务器通信,以在Kubernetes中创建、更新和删除工作负载。本教程的目的是概述您可以使用的一些常用命令,并提供管理Kubernetes的良好起点。

我们将介绍如何在您的计算机上安装kubectl,如何与您的Kubernetes环境进行通信并执行一些常见操作。大多数常见的kubectl命令会提供某特定的操作,如创建、删除等。此方法通常需要解释描述Kubernetes中的对象(如POD、服务、资源等)的文件(YAML或JSON)。这些文件通常被用作模板以及环境的持续文档,并有助于保留Kubernetes对声明性配置的关注。命令行上给出的操作将传递给API服务器,然后根据需要与Kubernetes中的后端服务进行通信。


我们将介绍一些最常见的kubectl命令并提供一些示例。有关每个命令的更多详细信息,包括所有支持的标志和子命令,请查看kubectl参考文档:

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands。


安装kubectl


kubectl是一个独立的程序,因此不需要复杂的安装过程。它是一个需要位于操作系统PATH中的单个文件。有许多方法可以获得kubectl二进制文件,例如通过操作系统的本机包管理器或通过curl。下表中的一些示例就是如何为各种操作系统安装kubectl:

16be3eb5f64a0711?w=2418&h=913&f=png&s=73036


注意


随着新版本的发布,最佳版本的kubectl for Windows将随着时间的推移而发生变化。要查找当前最佳二进制文件,请点击此链接查找最新的稳定版本,并根据需要调整上述URL:https://storage.googleapis.com/kubernetes-release/release/stable.txt


环境中使用的kubectl版本,需要与Kubernetes服务器的版本保持一致。您可以通过键入以下内容来查看正在使用的kubectl客户端的版本:

16be3ebc3be03dcc?w=754&h=169&f=png&s=2746

kubectl在各方面都会保持与一个版本的兼容性。其中客户端版本会比服务器版本领先一步。这为服务器版本:v1.13.4中提供的功能和命令提供了支持。如果客户端版本不是服务器版本之后的各版本中的一个,那么在尝试访问相应服务器版本中可用的功能时,可能会遇到错误或不兼容。


kubectl语法


kubectl 的语法使用如下:

16be3ed6b4922b6f?w=753&h=69&f=png&s=1592

  • Command(命令):指你想要执行的操作(创建、删除等等)

  • Type(类别):指你正在执行命令的资源类型(Pod、Service等)

  • Name(名称):对象的名称(需区分大小写)。如果未指定名称,则可以获取有关命令匹配的所有资源的信息(例如Pod)

  • Flags(标志):这个可以按需选择(非必须),不过它在查找特定资源时非常有用。例如,--namespacespace可以让你指定要在哪个特定的命名空间中执行操作。


kubeconfig


kubectl使用配置文件来访问Kubernetes集群。默认的kubectl配置文件位于〜/ .kube / config,称为kubeconfig文件。

kubeconfig文件组织有关集群、用户、命名空间和身份验证机制的信息。kubectl命令使用这些文件来查找它在选择集群并与之通信时所需要的信息。

加载顺序遵循以下规则:

  1. 如果设置了--kubeconfig标志,则仅加载给定文件。该标志只能设置一次,不会发生合并。

  2. 如果设置了$ KUBECONFIG环境变量,则根据系统的正常路径分隔规则,将其解析为文件系统路径列表。

  3. 否则,如果上述两项都未设置,则使用${HOME}/.kube/config 文件,不进行任何合并。


如果您看到类似于以下内容的消息,则意味着kubectl配置不正确或无法连接到Kubernetes集群。

The connection to the server <server-name: port> was refused - did you specify the right host or port?

你可以通过多种方式创建配置文件,具体取决于你使用何种Kubernetes发行版。以下列出的是不同的K8S发行版及其位置:

16be3edb98a775db?w=2441&h=889&f=png&s=62890


RKE

使用RKE创建Kubernetes集群时,RKE会在本地目录中创建一个kube_config_rancher-cluster.yml文件,该文件包含使用kubectl等工具连接到新集群所需的凭据。

您可以将此文件复制到$ HOME / .kube / config,或者,如果您正在使用多个Kubernetes集群,请将KUBECONFIG环境变量设置为kube_config_rancher-cluster.yml的路径,如下所示:

16be3ee38c98deab?w=754&h=69&f=png&s=1932

Rancher统一管理的Kubernetes集群

在Rancher中,您可以通过Web UI下载kubeconfig文件,并使用它通过kubectl连接到Kubernetes环境。

在Rancher UI中,单击要通过kubectl连接的集群。在页面的右上角,单击Kubeconfig File按钮:

16be3ee5c518c86f?w=1551&h=322&f=gif&s=41766

单击按钮以详细查看配置文件以及放置在~/.kube/config中的方向。

16be3ee8df3597a1?w=926&h=529&f=png&s=587079


将配置复制到~/.kube/config后,你无需指定--kube-config文件位置,就可以运行kubectl命令:

一些基本命令的示例


以下我将重点介绍在典型环境中会用到的许多命令。我们将从概述集群开始,一直到探索Kubernetes环境中当前正在运行的内容的各种场景。

相信下文的内容将帮助您熟悉kubectl和典型输出的命令。

管理kubectl配置

kubectl命令包含一些不同的命令,可用来帮助查看和管理自己的配置。这些在初始设置期间,或在你需要处理的集群集发生变化时,将非常有用。

要查看当前配置,请键入:

apiVersion: v1 clusters: - cluster:     certificate-authority-data: DATA+OMITTED     server: https://www.<yoururl>.com/k8s/clusters/<cluster>   name: gcpcluster - cluster:     certificate-authority-data: DATA+OMITTED     server: https://10.240.0.41:6443   name: gcpcluster-k8s-1 - cluster:     certificate-authority-data: DATA+OMITTED     server: https://10.240.0.42:6443   name: gcpcluster-k8s-2 - cluster:     certificate-authority-data: DATA+OMITTED     server: https://10.240.0.43:6443   name: gcpcluster-k8s-3 contexts: - context:     cluster: gcpcluster     namespace: rancher     user: user-qkvpz   name: gcpcluster


你将能看到的输出内容汇总展现了你所配置的集群和及上下文。cluster键包含每个可用集群的列表,以及相关的连接和验证详细信息。contexts键将用户、集群和可选的命名空间组合在一起,以形成用于与集×××互的唯一标识和使用上下文。

要获得每个可用上下文的更简洁摘要,你可以键入:

16be3ef34596b1d7?w=751&h=260&f=png&s=6906

输出的内容显示了每个已定义上下文的详细信息以及当前选定的上下文,由星号(*)表示。

要快速检查当前使用的上下文,请键入:

虽然我们不会在本摘要中介绍它,但除此之外你还可以使用kubectl set-cluster、kubectl set-credentials和kubectl set-context以及各种标志来定义集群和上下文,不过我们在本文中就不赘述了。

要更改要连接的上下文,请使用use-context命令:

检查集群组件的状态

为集群选择好适当的上下文后,可以使用get componentstatuses(缩写为get cs)命令检查核心主组件的状态:

16be3efc496fa232?w=752&h=294&f=png&s=6349

输出的内容将显示调度程序、控制器管理器和etcd节点的状态以及从每个服务收集的最新消息和错误。如果你的集群运行不正常,这是一个很好的、进行第一次诊断检查的机会。

可以使用cluster-info命令收集其他连接和服务信息:

Kubernetes master is running at https://www.<yoururl>.com/k8s/clusters/<cluster> KubeDNS is running at https://www.<yoururl>.com/k8s/clusters/<cluster>/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

这里,输出显示了我们的Kubernetes master的端点以及KubeDNS服务端点的端点。

要查看有关作为集群成员的每个单个节点的信息,需使用get nodes命令:

NAME    STATUS   ROLES                      AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION    CONTAINER-RUNTIME k8s-1   Ready    controlplane,etcd,worker   34d   v1.13.5   <IP>          <none>        Ubuntu 18.10   4.18.0-1011-gcp   docker://18.9.5 k8s-2   Ready    controlplane,etcd,worker   34d   v1.13.5   <IP>          <none>        Ubuntu 18.10   4.18.0-1011-gcp   docker://18.9.5 k8s-3   Ready    controlplane,etcd,worker   34d   v1.13.5   <IP>          <none>        Ubuntu 18.10   4.18.0-1011-gcp   docker://18.9.5

这列出了在每个节点上运行的核心软件的状态、角色、连接信息和版本号。如果需要在集群节点上执行维护或登录以调试问题,此命令可以帮助您提供所需的信息。

查看资源和事件信息

要概述集群中可用的命名空间,请使用get namespaces命令:

16be3f01cbeb205a?w=751&h=354&f=png&s=6884

这显示了当前集群中定义的命名空间分区。

要跨所有命名空间概述集群上运行的所有资源,使用以下命令:

16be3f0461d75984?w=755&h=285&f=png&s=9243

输出的内容会显示部署了每个资源的命名空间信息,以及加上了资源类型前缀的资源名称(例如上面显示的示例中的pod)。之后,有关每个资源的就绪和运行状态的信息将有助于确定进程是否运行正常。

要查看与资源关联的事件,请使用get events命令:

NAMESPACE       LAST SEEN   TYPE      REASON                   KIND                      MESSAGE cattle-system   9m31s       Normal    BackOff                  Pod                       Back-off pulling image "miguelgt/k8s-demo:v2" cattle-system   24m         Warning   Failed                   Pod                       Error: ImagePullBackOff cattle-system   14m         Normal    BackOff                  Pod                       Back-off pulling image "miguelgt/k8s-demo:v2" cattle-system   9m30s       Warning   Failed                   Pod                       Error: ImagePullBackOff


输出内容将列出资源记录的最新事件,包括事件消息及其触发的原因。


示 例


为了更具体地演示您在使用kubectl时可能参与的工作流程,我们将在这一部分介绍将容器部署到集群的快速方案,并将其部署到非默认命名空间中。

默认情况下,如果在未指定命名空间的情况下部署集群,kubectl会将资源放在名为default的命名空间中。如果要部署到其他名称空间,则需要指定所需的替代项。

虽然我们可以为创建命令提供命名空间,但如果我们要使用命名空间来处理多个命令,更改上下文的方法会更为容易。更改与上下文关联的命名空间将自动将命名空间规范应用于任何其他命令,直到更改上下文。

要更改当前上下文的命名空间,请使用带有--currentand --namespace标志的set-context命令:


这将改变当前上下文,以自动将未来的操作应用于rancher命名空间。

接下来,我们可以创建一个名为nginx的部署,它基于默认的nginx容器镜像运行容器。因为我们改变了我们的上下文,所以它会在rancher命名空间中运行:


您可以通过列出当前部署的pod来检查部署是否成功:


在这里,我们可以看到Nginx部署正常运行。READY那一列显示容器已就绪,状态是“正在运行”,没有出现故障。

虽然我们已经验证了pod正在运行,但我们还没有得到关于它部署到了哪个命名空间的信息。但是,我们可以通过添加--all-namespaces标志来稍微改变输出:



这将显示在每个命名空间中运行的pod,并另外添加一个NAMESPACE列,列出每个资源部署到了哪个命名空间。在这里,我们看到Nginx pod已正确部署到我们的rancher命名空间而不是通常的default命名空间。

这表明我们的上下文操作和我们的部署都按预期工作了。

你还可以通过键入以下内容来清理已部署的资源:


其他参考信息


虽然本章中深入讨论这些内容可能超出了本文原意的范围,但我们还是为大家列出了一些非常有用的命令。

Pod

16be3f092b1c5ec8?w=2339&h=1273&f=png&s=126932

资源删除

16be3f1000689c6d?w=1967&h=913&f=png&s=69043


服务


事件&指标


命名空间&安全

16be3f13f9b4493d?w=1966&h=862&f=png&s=67532


中级命令

16be3f16863f4653?w=2161&h=1533&f=png&s=152849


其他资源


  • kubectl的官方概述:https://kubernetes.io/docs/reference/kubectl/overview/

  • kubectl的官方命令文档:https://kubernetes.io/docs/reference/kubectl/kubectl/

  • kubectl的官方备忘单:https://kubernetes.io/docs/reference/kubectl/cheatsheet/

  • Rancher kubeconfig文档:https://rancher.com/docs/rancher/v2.x/en/cluster-admin/kubeconfig/

  • 有关使用kubectl访问集群的Rancher文档:https://rancher.com/docs/rancher/v2.x/en/cluster-admin/kubectl/

  • kubectl配置命令:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#config

  • 使用kubeconfig文件组织集群:https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/