![使用Kubectl管理Kubernetes的全解教程](https://static001.infoq.cn/resource/image/fd/52/fd8ba5748fdc8d273c392dcc5efc2e52.png)
对不少 IT 人员来说,每天与 Kubernetes 交互的机制一般是通过 kubectl——一种命令行工具。kubectl 主要用于与 Kubernetes API 服务器通信,以在 Kubernetes 中创建、更新和删除工作负载。本教程的目的是概述您可以使用的一些常用命令,并提供管理 Kubernetes 的良好起点。
我们将介绍如何在您的计算机上安装 kubectl,如何与您的 Kubernetes 环境进行通信并执行一些常见操作。大多数常见的 kubectl 命令会提供某特定的操作,如创建、删除等。此方法通常需要解释描述 Kubernetes 中的对象(如 POD、服务、资源等)的文件(YAML 或 JSON)。这些文件通常被用作模板以及环境的持续文档,并有助于保留 Kubernetes 对声明性配置的关注。命令行上给出的操作将传递给 API 服务器,然后根据需要与 Kubernetes 中的后端服务进行通信。
![](https://static001.infoq.cn/resource/image/8a/14/8a8dfd3ff24f7b913a16530686fce914.png)
我们将介绍一些最常见的 kubectl 命令并提供一些示例。有关每个命令的更多详细信息,包括所有支持的标志和子命令,请查看 kubectl 参考文档:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands。
安装 kubectl
kubectl 是一个独立的程序,因此不需要复杂的安装过程。它是一个需要位于操作系统 PATH 中的单个文件。有许多方法可以获得 kubectl 二进制文件,例如通过操作系统的本机包管理器或通过 curl。下表中的一些示例就是如何为各种操作系统安装 kubectl:
![](https://static001.infoq.cn/resource/image/d8/8b/d8f679cd009f0c1e3865537bfef9658b.png)
注意
随着新版本的发布,最佳版本的 kubectl for Windows 将随着时间的推移而发生变化。要查找当前最佳二进制文件,请点击此链接查找最新的稳定版本,并根据需要调整上述 URL:
https://storage.googleapis.com/kubernetes-release/release/stable.txt
环境中使用的 kubectl 版本,需要与 Kubernetes 服务器的版本保持一致。您可以通过键入以下内容来查看正在使用的 kubectl 客户端的版本:
![](https://static001.infoq.cn/resource/image/50/d9/50c18ef4823325829836ef35899cedd9.png)
kubectl 在各方面都会保持与一个版本的兼容性。其中客户端版本会比服务器版本领先一步。这为服务器版本:v1.13.4 中提供的功能和命令提供了支持。如果客户端版本不是服务器版本之后的各版本中的一个,那么在尝试访问相应服务器版本中可用的功能时,可能会遇到错误或不兼容。
kubectl 语法
kubectl 的语法使用如下:
![](https://static001.infoq.cn/resource/image/f2/c5/f2333732d1baad8fe0bcdd95794707c5.png)
Command(命令) :指你想要执行的操作(创建、删除等等)
Type(类别) :指你正在执行命令的资源类型(Pod、Service 等)
Name(名称) :对象的名称(需区分大小写)。如果未指定名称,则可以获取有关命令匹配的所有资源的信息(例如 Pod)
Flags(标志) :这个可以按需选择(非必须),不过它在查找特定资源时非常有用。例如,–namespacespace 可以让你指定要在哪个特定的命名空间中执行操作。
kubeconfig
kubectl 使用配置文件来访问 Kubernetes 集群。默认的 kubectl 配置文件位于〜/ .kube / config,称为 kubeconfig 文件。
kubeconfig 文件组织有关集群、用户、命名空间和身份验证机制的信息。kubectl 命令使用这些文件来查找它在选择集群并与之通信时所需要的信息。
加载顺序遵循以下规则:
如果设置了–kubeconfig 标志,则仅加载给定文件。该标志只能设置一次,不会发生合并。
如果设置了
$
KUBECONFIG 环境变量,则根据系统的正常路径分隔规则,将其解析为文件系统路径列表。否则,如果上述两项都未设置,则使用
$
{HOME}/.kube/config 文件,不进行任何合并。
如果您看到类似于以下内容的消息,则意味着 kubectl 配置不正确或无法连接到 Kubernetes 集群。
你可以通过多种方式创建配置文件,具体取决于你使用何种 Kubernetes 发行版。以下列出的是不同的 K8S 发行版及其位置:
![](https://static001.infoq.cn/resource/image/6f/1f/6f094cdc2e76b0e41ab03a0946075c1f.png)
RKE
使用 RKE 创建 Kubernetes 集群时,RKE 会在本地目录中创建一个 kube_config_rancher-cluster.yml 文件,该文件包含使用 kubectl 等工具连接到新集群所需的凭据。
您可以将此文件复制到 $ HOME / .kube / config,或者,如果您正在使用多个 Kubernetes 集群,请将 KUBECONFIG 环境变量设置为 kube_config_rancher-cluster.yml 的路径,如下所示:
![](https://static001.infoq.cn/resource/image/6b/f3/6b8cf2c6e7f418a2799fac44f548d9f3.png)
Rancher 统一管理的 Kubernetes 集群
在 Rancher 中,您可以通过 Web UI 下载 kubeconfig 文件,并使用它通过 kubectl 连接到 Kubernetes 环境。
在 Rancher UI 中,单击要通过 kubectl 连接的集群。在页面的右上角,单击 Kubeconfig File 按钮:
![](https://static001.infoq.cn/resource/image/1c/e4/1c782b74faa9d7596dc6d73313d0c5e4.png)
单击按钮以详细查看配置文件以及放置在~/.kube/config 中的方向。
![](https://static001.infoq.cn/resource/image/8b/4b/8b0e4cf22718ce949e4eda129d9a5a4b.png)
将配置复制到~/.kube/config 后,你无需指定–kube-config 文件位置,就可以运行 kubectl 命令:
![](https://static001.infoq.cn/resource/image/2e/76/2e796af046499563b66875c0f304b776.png)
一些基本命令的示例
以下我将重点介绍在典型环境中会用到的许多命令。我们将从概述集群开始,一直到探索 Kubernetes 环境中当前正在运行的内容的各种场景。
相信下文的内容将帮助您熟悉 kubectl 和典型输出的命令。
管理 kubectl 配置
kubectl 命令包含一些不同的命令,可用来帮助查看和管理自己的配置。这些在初始设置期间,或在你需要处理的集群集发生变化时,将非常有用。
要查看当前配置,请键入:
![](https://static001.infoq.cn/resource/image/66/46/6626009da5231a1d02d6cc4093425246.png)
你将能看到的输出内容汇总展现了你所配置的集群和及上下文。cluster 键包含每个可用集群的列表,以及相关的连接和验证详细信息。contexts 键将用户、集群和可选的命名空间组合在一起,以形成用于与集群交互的唯一标识和使用上下文。
要获得每个可用上下文的更简洁摘要,你可以键入:
![](https://static001.infoq.cn/resource/image/39/f0/39b6c8befea61e36a4fd4ab8c77582f0.png)
输出的内容显示了每个已定义上下文的详细信息以及当前选定的上下文,由星号(*)表示。
要快速检查当前使用的上下文,请键入:
![](https://static001.infoq.cn/resource/image/d3/06/d340ab499b74ad46fe50817d18d89e06.png)
虽然我们不会在本摘要中介绍它,但除此之外你还可以使用 kubectl set-cluster、kubectl set-credentials 和 kubectl set-context 以及各种标志来定义集群和上下文,不过我们在本文中就不赘述了。
要更改要连接的上下文,请使用 use-context 命令:
![](https://static001.infoq.cn/resource/image/03/78/03026e771c272e61680f402333e36578.png)
检查集群组件的状态
为集群选择好适当的上下文后,可以使用 get componentstatuses(缩写为 get cs)命令检查核心主组件的状态:
![](https://static001.infoq.cn/resource/image/f9/02/f98e4d260d342e19b4a05fb882638e02.png)
输出的内容将显示调度程序、控制器管理器和 etcd 节点的状态以及从每个服务收集的最新消息和错误。如果你的集群运行不正常,这是一个很好的、进行第一次诊断检查的机会。
可以使用 cluster-info 命令收集其他连接和服务信息:
![](https://static001.infoq.cn/resource/image/20/98/20f451299bc0d00eeeb0d45b4dd67398.png)
这里,输出显示了我们的 Kubernetes master 的端点以及 KubeDNS 服务端点的端点。
要查看有关作为集群成员的每个单个节点的信息,需使用 get nodes 命令:
![](https://static001.infoq.cn/resource/image/38/65/38f6ba65007b78c55f4ec7027c59b365.png)
这列出了在每个节点上运行的核心软件的状态、角色、连接信息和版本号。如果需要在集群节点上执行维护或登录以调试问题,此命令可以帮助您提供所需的信息。
查看资源和事件信息
要概述集群中可用的命名空间,请使用 get namespaces 命令:
![](https://static001.infoq.cn/resource/image/ea/95/eab5140ce5c97c81c589f8d8ae9f8895.png)
这显示了当前集群中定义的命名空间分区。
要跨所有命名空间概述集群上运行的所有资源,使用以下命令:
![](https://static001.infoq.cn/resource/image/19/02/19e6061b5c7e7f0ce9b17041f13abf02.png)
输出的内容会显示部署了每个资源的命名空间信息,以及加上了资源类型前缀的资源名称(例如上面显示的示例中的 pod)。之后,有关每个资源的就绪和运行状态的信息将有助于确定进程是否运行正常。
要查看与资源关联的事件,请使用 get events 命令:
![](https://static001.infoq.cn/resource/image/91/59/910e8a843d6dbad6eaa43172a9c62559.png)
输出内容将列出资源记录的最新事件,包括事件消息及其触发的原因。
示例
为了更具体地演示您在使用 kubectl 时可能参与的工作流程,我们将在这一部分介绍将容器部署到集群的快速方案,并将其部署到非默认命名空间中。
默认情况下,如果在未指定命名空间的情况下部署集群,kubectl 会将资源放在名为 default 的命名空间中。如果要部署到其他名称空间,则需要指定所需的替代项。
虽然我们可以为创建命令提供命名空间,但如果我们要使用命名空间来处理多个命令,更改上下文的方法会更为容易。更改与上下文关联的命名空间将自动将命名空间规范应用于任何其他命令,直到更改上下文。
要更改当前上下文的命名空间,请使用带有–currentand --namespace 标志的 set-context 命令:
![](https://static001.infoq.cn/resource/image/97/8a/974c81df6fa9f74d23d138e5f08a758a.png)
这将改变当前上下文,以自动将未来的操作应用于 rancher 命名空间。
接下来,我们可以创建一个名为 nginx 的部署,它基于默认的 nginx 容器镜像运行容器。因为我们改变了我们的上下文,所以它会在 rancher 命名空间中运行:
![](https://static001.infoq.cn/resource/image/e6/dd/e6d5b9af75c6af85aeb85fc436c7f9dd.png)
您可以通过列出当前部署的 pod 来检查部署是否成功:
![](https://static001.infoq.cn/resource/image/af/8b/afca6b0fb6320e9e24cd6975ed81788b.png)
在这里,我们可以看到 Nginx 部署正常运行。READY 那一列显示容器已就绪,状态是“正在运行”,没有出现故障。
虽然我们已经验证了 pod 正在运行,但我们还没有得到关于它部署到了哪个命名空间的信息。但是,我们可以通过添加–all-namespaces 标志来稍微改变输出:
![](https://static001.infoq.cn/resource/image/ac/f0/acef6c9c397ee28443b95949a60c92f0.png)
这将显示在每个命名空间中运行的 pod,并另外添加一个 NAMESPACE 列,列出每个资源部署到了哪个命名空间。在这里,我们看到 Nginx pod 已正确部署到我们的 rancher 命名空间而不是通常的 default 命名空间。
这表明我们的上下文操作和我们的部署都按预期工作了。
你还可以通过键入以下内容来清理已部署的资源:
![](https://static001.infoq.cn/resource/image/18/e7/1838cfe98ba4eee6ec0af632a4730be7.png)
其他参考信息
虽然本章中深入讨论这些内容可能超出了本文原意的范围,但我们还是为大家列出了一些非常有用的命令。
Pod
![](https://static001.infoq.cn/resource/image/ba/25/badf90f36c68ba1e46f05be1c7adab25.png)
资源删除
![](https://static001.infoq.cn/resource/image/1e/03/1ee64474dac143aa4cdfbfefc0a72003.png)
服务
![](https://static001.infoq.cn/resource/image/a0/5e/a00af089843a9a83de826c53708ba45e.png)
事件 &指标
![](https://static001.infoq.cn/resource/image/77/77/77c334966a20488b0a3fffa571ced577.png)
命名空间 &安全
![](https://static001.infoq.cn/resource/image/54/1f/54d91c5869b7a3347aa0905760e7d91f.png)
中级命令
![](https://static001.infoq.cn/resource/image/69/24/69234717f6b0964fe77543442e956924.png)
其他资源
kubectl 的官方概述:
kubectl 的官方命令文档:
kubectl 的官方备忘单:
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/
评论