提高您的kubectl生产力

本文介绍了如何提高kubectl使用效率,包括利用命令完成节省输入时间,使用kubectl explain快速查找资源规格,自定义列输出格式展示所需信息,轻松在集群和命名空间之间切换,以及使用kubectl插件扩展功能。通过这些技巧,可以更高效地管理和操作Kubernetes集群。
摘要由CSDN通过智能技术生成

如果您使用Kubernetes,那么kubectl可能是您最常用的工具之一。每当您花费大量时间使用特定工具时,都应该非常了解它并学习如何有效地使用它。

本文包含一系列技巧,使您更有效地使用kubectl。同时,它旨在加深您对Kubernetes各个方面工作方式的理解。

本文的目标不仅是使您使用Kubernetes的日常工作更高效,而且更愉快!

内容

简介:什么是kubectl?

在学习如何更有效地使用kubectl之前,您应该对它是什么以及它如何工作有基本的了解。

从用户的角度来看,kubectl是控制Kubernetes的座舱。它允许您执行所有可能的Kubernetes操作。

从技术角度来看,kubectl是Kubernetes API的客户端。

Kubernetes API是HTTP REST API。该API是真正的Kubernetes用户界面。Kubernetes是通过此API完全控制的。这意味着每个Kubernetes操作都作为API端点公开,并且可以由对此端点的HTTP请求执行。

因此,kubectl的主要工作是执行对Kubernetes API的HTTP请求:

 

Kubernetes是一个完全以资源为中心的系统。这意味着Kubernetes维护资源的内部状态,并且所有Kubernetes操作都是对这些资源的CRUD操作。您可以通过操纵这些资源来完全控制Kubernetes(Kubernetes会根据资源的当前状态确定要做什么)。因此,Kubernetes API参考被组织为资源类型及其相关操作的列表。

让我们考虑一个例子。

假设您要创建一个ReplicaSet资源。为此,您将在名为replicaset.yamlfile的文件中定义ReplicaSet ,然后运行以下命令:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl create -f replicaset.yaml</code></span></span>

显然,这将在Kubernetes中创建您的ReplicaSet。但是幕后发生了什么?

Kubernetes具有create ReplicaSet操作,并且像所有Kubernetes操作一样,它作为API端点公开。此操作的特定API端点如下:

 
 
 
<span style="color:#000000"><span style="color:#657b83"><code>POST /apis/apps/v1/namespaces/{namespace}/replicasets</code></span></span>

您可以在API参考中找到所有Kubernetes操作的API端点。要向端点发出实际请求,您需要将API服务器的URL放在API参考中列出的端点路径之前。

因此,当您执行上述命令时,kubectl向上述API端点发出HTTP POST请求。ReplicaSet定义(您在replicaset.yaml文件中提供的定义)在请求的正文中传递。

这是kubectl对于与Kubernetes集群交互的所有命令的工作方式。在所有这些情况下,kubectl只需向适当的Kubernetes API端点发出HTTP请求即可。

请注意,完全有可能使用诸如curl通过手动向Kubernetes API发出HTTP请求之类的工具来控制Kubernetes 。Kubectl只是使您更轻松地使用Kubernetes API。

这些是什么是kubectl及其工作原理的基础。但是,每个kubectl用户都应该了解更多有关Kubernetes API的信息。为此,让我们简要地介绍一下Kubernetes的内部结构。

Kubernetes内部

Kubernetes由一组独立的组件组成,这些组件在群集的节点上作为单独的进程运行。一些组件在主节点上运行,而其他组件在工作节点上运行,并且每个组件都有非常特定的功能。

这些是主节点上最重要的组件:

  • 存储后端:存储资源定义(通常使用etcd
  • API服务器:提供Kubernetes API并管理存储后端
  • 控制器管理员:确保资源状态符合规范
  • 调度程序:将Pod调度到工作程序节点

这是工作节点上最重要的组件:

  • Kubelet:管理工作节点上容器的执行

要查看这些组件如何协同工作,让我们考虑一个示例。

假设您刚刚执行kubectl create -f replicaset.yaml,那么kubectl便对创建的ReplicaSet API端点发出了HTTP POST请求(传递您的ReplicaSet资源定义)。

哪些因素会导致群集中出现这种情况?在下面观看:

 

并在此之后的文字描述。

创建ReplicaSet终结点的API请求由API服务器处理。API服务器对请求进行身份验证,并将您的ReplicaSet资源定义保存在存储后端中。

此事件触发ReplicaSet控制器,它是控制器管理器的子过程。ReplicaSet控制器监视存储后端中ReplicaSet资源的创建,更新和删除,并在发生这种情况时通过事件得到通知。

ReplicaSet控制器的工作是确保存在所需数量的ReplicaSet的副本Pod。在我们的示例中,尚不存在Pod,因此ReplicaSet控制器创建这些Pod定义(根据ReplicaSet定义中的Pod模板)并将其保存在存储后端中。

新Pod的创建将触发调度程序调度程序将监视尚未调度到工作程序节点的Pod定义。调度程序为每个Pod选择合适的工作节点,并使用此信息更新存储后端中的Pod定义。

请注意,到目前为止,群集中的任何地方都没有运行任何工作负载代码。到目前为止,所有要做的就是在主节点上的存储后端中创建和更新资源。

此事件触发监视正在调度到其工作节点的Pod的kubelet。已安排您的ReplicaSet Pods的工作节点的kubelet指示配置的容器运行时(可能是Docker)下载所需的容器映像并运行容器。

到此,终于,您的ReplicaSet应用程序正在运行!

Kubernetes API的作用

从上面的示例中可以看到,Kubernetes组件(API服务器和存储后端除外)通过监视存储后端中的资源更改并操纵存储后端中的资源来工作。

但是,这些组件不会直接访问存储后端,而只能通过Kubernetes API访问

请考虑以下示例:

如您所见,这与kubectl也使用相同的API

Kubernetes API对于内部组件和外部用户的双重使用是Kubernetes的基本设计概念

有了这些知识,您可以总结Kubernetes的工作方式如下:

  1. 存储后端存储Kubernetes的状态(即资源)。
  2. API服务器以Kubernetes API的形式提供到存储后端的接口。
  3. 所有其他Kubernetes组件和用户都通过Kubernetes API读取,监视和操纵Kubernetes的状态(即资源)。

熟悉这些概念将有助于您更好地了解kubectl并充分利用它!

现在,让我们看看一系列具体的技巧和窍门,以帮助您提高kubectl的生产率。

1.使用命令完成功能保存输入

命令完成是提高kubectl生产率的最有用但经常被忽略的技巧之一。

命令完成功能使您可以使用Tab键自动完成kubectl命令的各个部分。这适用于子命令,选项和参数,包括诸如资源名称之类难以键入的内容。

在这里,您可以看到kubectl命令的完成情况:

终端自动补全

 

命令完成可用于BashZsh Shell。

官方文件中包含的详细说明有关设置命令完成,但下面的章节为你提供了一个回顾。

命令完成的工作方式

通常,命令完成是一个Shell功能,可以通过完成脚本来工作。完成脚本是Shell脚本,用于定义特定命令的完成行为。通过输入完成脚本可以完成相应命令。

Kubectl可以使用以下命令自动生成并打印出Bash和Zsh的完成脚

 

从理论上讲,在适当的shell中提供此命令的输出会启用kubectl命令完成。

但是,实际上,Bash(包括Linux和macOS之间的差异)和Zsh的细节有所不同。以下各节说明所有这些情况:

Linux上的Bash

Bash的完成脚本取决于bash-completion项目,因此您必须首先安装它。

您可以使用各种软件包管理器安装bash-completion 。例如:

 
 

您可以使用以下命令测试bash-completion是否正确安装:

 
 

如果此命令输出了shell函数的代码,则表明bash-completion已正确安装。如果命令输出not found错误,则必须在~/.bashrc文件中添加以下行:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code><span style="color:#e6db74">source</span> /usr/share/bash-completion/bash_completion</code></span></span>

是否必须将此行添加到~/.bashrc文件中,取决于用于安装bash-completion的软件包管理器。对于APT,这是必要的,对于百胜而言则不是。

安装完bash-completion后,您必须进行设置,以便在所有Shell会话中获取kubectl完成脚本

一种方法是在~/.bashrc文件中添加以下行:

 
 
 

.bashrc

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#b58900">source</span> <<span style="color:#586e75">(</span>kubectl completion <span style="color:#b58900">bash</span><span style="color:#586e75">)</span></code></span></span>

另一种可能性是将kubectl完成脚本添加到/etc/bash_completion.d目录(如果不存在,则创建它):

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl completion <span style="color:#e6db74">bash</span> <span style="color:#f8f8f2">></span>/etc/bash_completion.d/kubectl</code></span></span>

/etc/bash_completion.d目录中的所有完成脚本均由bash-completion自动提供。

两种方法是等效的。

重新加载外壳后,kubectl命令完成应该可以正常工作!

跳到下一部分→

在MacOS上的Bash

使用macOS时,会有些复杂。原因是macOS上Bash的默认版本是3.2,这已经过时了。不幸的是,kubectl完成脚本至少需要Bash 4.1,因此不适用于Bash 3.2。

Apple在macOS中包含过时的Bash版本的原因是,较新的版本使用了GPLv3许可证,而Apple不支持该许可证

这意味着,要在macOS上使用kubectl命令完成功能,您必须安装较新版本的Bash。您甚至可以将其设置为新的默认外壳程序,这将在将来为您节省很多此类麻烦。这实际上并不困难,您可以在我之前写的《在macOS上升级Bash》一文中找到说明。

在继续之前,请确保您现在确实在使用Bash 4.1或更高版本(请参阅参考资料bash --version)。

Bash的完成脚本取决于bash-completion项目,因此您必须首先安装它。

您可以使用Homebrew安装bash-completion :

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>brew <span style="color:#e6db74">install</span> bash-completion@2</code></span></span>

bash-completion v2@2代表。kubectl完成脚本需要bash-completion v2,而bash-completion v2至少需要Bash 4.1。这就是为什么您不能在低于4.1的Bash版本上使用kubectl完成脚本的原因。

brew install命令的输出包括一个“注意事项”部分,其中包含将以下行添加到您的~/.bash_profile文件的说明:

 
 
 

.bash_profile

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#b58900">export</span> <span style="color:#cb4b16"><span style="color:#268bd2">BASH_COMPLETION_COMPAT_DIR</span></span>=/usr/local/etc/bash_completion.d
<span style="color:#586e75">[</span><span style="color:#586e75">[</span> -r <span style="color:#2aa198">"/usr/local/etc/profile.d/bash_completion.sh"</span> <span style="color:#586e75">]</span><span style="color:#586e75">]</span> && <span style="color:#b58900">.</span> <span style="color:#2aa198">"/usr/local/etc/profile.d/bash_completion.sh"</span></code></span></span>

您必须执行此操作才能完成bash-completion的安装。但是,我建议将这些行添加到您~/.bashrc~/.bash_profile文件而不是文件中。这样可以确保bash补全功能在子shell中也可用。

重新加载外壳程序后,可以使用以下命令测试bash-completion是否正确安装:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code><span style="color:#e6db74">type</span> _init_completion</code></span></span>

如果这输出了shell函数的代码,那么您已经准备就绪。

现在,您必须进行设置,以便在所有shell会话中获取kubectl完成脚本

一种方法是在~/.bashrc文件中添加以下行:

 
 
 

.bashrc

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#b58900">source</span> <<span style="color:#586e75">(</span>kubectl completion <span style="color:#b58900">bash</span><span style="color:#586e75">)</span></code></span></span>

另一种可能性是将kubectl完成脚本添加到/usr/local/etc/bash_completion.d目录中:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl completion <span style="color:#e6db74">bash</span> <span style="color:#f8f8f2">></span>/usr/local/etc/bash_completion.d/kubectl</code></span></span>

仅当您使用Homebrew安装了bash-completion时,此方法才有效。在这种情况下,bash-completion会将此目录中的所有完成脚本作为源。

如果您还用Homebrew安装了kubectl,则甚至不必执行上述步骤,因为完成脚本应该已经/usr/local/etc/bash_completion.d由kubectl Homebrew公式放置在目录中。在这种情况下,kubectl补全应该在安装bash-completion后自动开始工作。

最后,所有这些方法都是等效的。

重新加载外壳后,kubectl完成应该可以正常工作!

跳到下一部分→

sh

Zsh的完成脚本没有任何依赖性。因此,您所需要做的就是进行设置,以便它可以在您所有的Shell会话中获取。

您可以通过在~/.zshrc文件中添加以下行来做到这一点:

 
 
 

.zshrc

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#b58900">source</span> <<span style="color:#586e75">(</span>kubectl completion <span style="color:#b58900">zsh</span><span style="color:#586e75">)</span></code></span></span>

如果command not found: compdef重新加载外壳程序后出现错误,则必须启用compdef内置功能,可以通过在~/.zshrc文件开头添加以下内容来实现:

 
 
 

.zshrc

<span style="color:#000000"><span style="color:#657b83"><code>autoload -Uz compinit
compinit</code></span></span>

2.快速查找资源规格

创建YAML资源定义时,您需要了解这些资源的字段及其含义。API参考中提供了一个查找此信息的位置,其中包含所有资源的完整规范。

但是,每次需要查找某些内容时都切换到Web浏览器很麻烦。因此,kubectl提供了该kubectl explain命令,该命令可以打印出终端中所有资源的资源规范。

的用法kubectl explain如下:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl explain resource<span style="color:#f8f8f2">[</span>.field<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">..</span>.</code></span></span>

该命令输出所请求资源或字段的规范。所显示kubectl explain的信息与API参考中的信息相同。

在这里,您可以看到kubectl explain实际操作:

 

默认情况下,kubectl explain仅显示单个级别的字段。您可以显示带有标志的整个字段--recursive

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl explain deployment.spec --recursive</code></span></span>

如果不确定可以使用哪些资源名称,可以使用kubectl explain以下命令显示所有资源名称

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl api-resources</code></span></span>

此命令以复数形式显示资源名称(例如deployments而不是deployment)。它还显示deploy具有一个资源的简称(例如)。不用担心这些差异。所有这些名称变体对于kubectl都是等效的。也就是说,您可以将它们中的任何一个用于kubectl explain

例如,以下所有命令都是等效的:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl explain deployments.spec
<span style="color:#708090"># or</span>
kubectl explain deployment.spec
<span style="color:#708090"># or</span>
kubectl explain deploy.spec</code></span></span>

3.使用自定义列输出格式

kubectl get命令的默认输出格式(用于读取资源)如下:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
engine-544b6b6467-22qr6   <span style="color:#ae81ff">1</span>/1     Running   <span style="color:#ae81ff">0</span>          78d
engine-544b6b6467-lw5t8   <span style="color:#ae81ff">1</span>/1     Running   <span style="color:#ae81ff">0</span>          78d
engine-544b6b6467-tvgmg   <span style="color:#ae81ff">1</span>/1     Running   <span style="color:#ae81ff">0</span>          78d
web-ui-6db964458-8pdw4    <span style="color:#ae81ff">1</span>/1     Running   <span style="color:#ae81ff">0</span>          78d</code></span></span>

这是一种很好的人类可读格式,但是它只包含有限数量的信息。如您所见,每个资源仅显示了一些字段(与完整的资源定义相比)。

这就是自定义列输出格式的来源。它使您可以自由定义列和要在其中显示的数据。您可以选择资源的任何字段以在输出中显示为单独的列

自定义列输出选项的用法如下:

 
 
 
<span style="color:#000000"><span style="color:#657b83"><code>-o custom-columns=<header>:<jsonpath>[,<header>:<jsonpath>]...</code></span></span>

您必须将每个输出列定义为一<header>:<jsonpath>对:

  • <header> 是列的名称,您可以选择任何所需的内容。
  • <jsonpath> 是一个选择资源字段的表达式(下面将详细说明)。

让我们看一个简单的例子:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl get pods -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'NAME:metadata.name'</span>
NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4</code></span></span>

在这里,输出包括一列,显示所有Pod的名称。

The expression selecting the Pod names is metadata.name. The reason for this is that the name of a Pod is defined in the name field of the metadata field of a Pod resource (you can look this up in the API reference or with kubectl explain pod.metadata.name).

Now, imagine you want to add an additonal column to the output, for example, showing the node that each Pod is running on. To do so, you can just add an appropriate column specification to the custom columns option:

 
 
 

bash

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl get pods <span style="color:#f8f8f2">\</span>
  -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'NAME:metadata.name,NODE:spec.nodeName'</span>
NAME                      NODE
engine-544b6b6467-22qr6   ip-10-0-80-67.ec2.internal
engine-544b6b6467-lw5t8   ip-10-0-36-80.ec2.internal
engine-544b6b6467-tvgmg   ip-10-0-118-34.ec2.internal
web-ui-6db964458-8pdw4    ip-10-0-118-34.ec2.internal</code></span></span>

The expression selecting the node name is spec.nodeName. This is because the node a Pod has been scheduled to is saved in the spec.nodeName field of a Pod (see kubectl explain pod.spec.nodeName).

Note that Kubernetes resource fields are case-sensitive.

You can set any field of a resource as an output column in that way. Just browse the resource specifications and try it out with any fields you like!

But first, let's have a closer look at these field selection expressions.

JSONPath expressions

The expressions for selecting resource fields are based on JSONPath.

JSONPath is a language to extract data from JSON documents (it is similar to XPath for XML). Selecting a single field is only the most basic usage of JSONPath. It has a lot of features, like list selectors, filters, and more.

However, with kubectl explain, only a subset of the JSONPath capabilities is supported. The following summarises these supported features with example usages:

 
 
 

bash

<span style="color:#000000"><span style="color:#f8f8f2"><code><span style="color:#708090"># Select all elements of a list</span>
kubectl get pods -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'DATA:spec.containers[*].image'</span>

<span style="color:#708090"># Select a specific element of a list</span>
kubectl get pods -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'DATA:spec.containers[0].image'</span>

<span style="color:#708090"># Select those elements of a list that match a filter expression</span>
kubectl get pods -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'DATA:spec.containers[?(@.image!="nginx")].image'</span>

<span style="color:#708090"># Select all fields under a specific location, regardless of their name</span>
kubectl get pods -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'DATA:metadata.*'</span>

<span style="color:#708090"># Select all fields with a specific name, regardless of their location</span>
kubectl get pods -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'DATA:..image'</span></code></span></span>

Of particular importance is the [] operator. Many fields of Kubernetes resources are lists, and this operator allows you to select items of these lists. It is often used with a wildcard as [*] to select all items of the list.

Below you will find some examples that use this notation.

Example applications

The possibilities for using the custom columns output format are endless, as you can display any field, or combination of fields, of a resource in the output. Here are some example applications, but feel free to explore on your own and find applications that are useful to you!

Tip: if you end up using one of these a commands frequently, you can create a shell alias for it.

Display container images of Pods

 
 
 

bash

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl get pods <span style="color:#f8f8f2">\</span>
  -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'NAME:metadata.name,IMAGES:spec.containers[*].image'</span>
NAME                       IMAGES
engine-544b6b6467-22qr6    rabbitmq:3.7.8-management,nginx
engine-544b6b6467-lw5t8    rabbitmq:3.7.8-management,nginx
engine-544b6b6467-tvgmg    rabbitmq:3.7.8-management,nginx
web-ui-6db964458-8pdw4     wordpress</code></span></span>

This command displays the names of all the container images of each Pod.

Remember that a Pod may contain more than one container. In that case, the container images of a single Pod are displayed as a comma-separated list in the same column.

Display availability zones of nodes

 
 
 

bash

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl get nodes <span style="color:#f8f8f2">\</span>
  -o custom-columns<span style="color:#f8f8f2">=</span><span style="color:#a6e22e">'NAME:metadata.name,ZONE:metadata.labels.failure-domain\.beta\.kubernetes\.io/zone'</span>
NAME                          ZONE
ip-10-0-118-34.ec2.internal   us-east-1b
ip-10-0-36-80.ec2.internal    us-east-1a
ip-10-0-80-67.ec2.internal    us-east-1b</code></span></span>

This command can be useful if your Kubernetes cluster is deployed on a public cloud infrastructure (such as AWS, Azure, or GCP). It displays the availability zone that each node is in.

The availability zone is a cloud concept that denotes a point of replication within a geographical region.

The availability zones for each node are obtained through the special failure-domain.beta.kubernetes.io/zone label. If the cluster runs on a public cloud infrastructure, then this label is automatically created and its value is set to the name of the availability zone of the node.

标签不是Kubernetes资源规范的一部分,因此您无法在API参考中找到以上标签。但是,如果将节点输出为YAML或JSON,则可以看到它(以及所有其他标签):

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl get nodes -o yaml
<span style="color:#708090"># or</span>
kubectl get nodes -o json</code></span></span>

除了探索资源规范外,这通常是发现更多有关资源的信息的好方法。

4.轻松在集群和名称空间之间切换

当kubectl必须向Kubernetes API发出请求时,它将读取系统上的所谓kubeconfig文件,以获取它需要访问的所有连接参数并向API服务器发出请求。

默认的kubeconfig文件是~/.kube/config。该文件通常是由某些命令自动创建或更新的(例如,如果使用托管的Kubernetes服务,则为aws eks update-kubeconfiggcloud container clusters get-credentials)。

当您使用多个集群时,那么您在kubeconfig文件中配置了多个集群的连接参数。这意味着,您需要一种方法来告诉kubectl您希望将其连接到这些集群中的一个。

在群集中,您可以设置多个名称空间(名称空间是物理群集中的一种“虚拟”群集)。Kubectl还可确定用于kubeconfig文件中的请求的名称空间。因此,您需要一种方法来告诉kubectl您要使用哪个命名空间。

本节说明了它是如何工作的,以及如何轻松地做到这一点。

请注意,您还可以通过在KUBECONFIG环境变量中列出它们来拥有多个kubeconfig文件。在这种情况下,所有这些文件将在执行时合并到一个有效的配置中。您还--kubeconfig可以使用每个kubectl命令的选项覆盖默认的kubeconfig文件。请参阅官方 文档

Kubeconfig文件

让我们看看kubeconfig文件实际包含什么:

 

如您所见,kubeconfig文件由一组上下文组成。上下文包含以下三个元素:

  • 群集:群集的API服务器的URL
  • 用户:集群中特定用户的身份验证凭据
  • 命名空间:连接到集群时要使用的命名空间

实际上,人们通常在其kubeconfig文件中为每个群集使用单个上下文。但是,每个集群也可以有多个上下文,它们的用户命名空间不同。但这似乎不太常见,因此群集和上下文之间通常存在一对一的映射。

在任何给定时间,这些上下文之一将被设置为当前上下文(通过kubeconfig文件中的专用字段):

 

当kubectl读取kubeconfig文件时,它始终使用当前上下文中的信息。因此,在上面的示例中,kubectl将连接到Hare群集。

因此,要切换到另一个集群,您只需在kubeconfig文件中更改当前上下文即可:

 

在上面的示例中,kubectl现在将连接到Fox集群。

并切换到同一集群中的另一个名称空间,可以更改当前上下文的名称空间元素的值:

 

在上面的示例中,kubectl现在将在Fox集群中使用Prod命名空间(而不是之前设置的Test命名空间)。

需要注意的是kubectl还提供了--cluster--user--namespace,和--context选项,使您可以覆盖各个元素和当前上下文本身,不管是什么在kubeconfig文件中设置的。请参阅kubectl options

理论上,您可以通过手动编辑kubeconfig文件来进行这些更改。但是,这当然是乏味的。以下各节介绍了各种工具,可让您自动进行这些更改。

使用kubectx

在集群和名称空间之间切换的一种非常流行的工具是kubectx

此工具提供kubectxkubens命令,可让您分别更改当前上下文和名称空间。

如前所述,如果每个集群只有一个上下文,则更改当前上下文意味着更改集群。

在这里,您可以看到这两个命令的作用:

 

在幕后,这些命令仅需编辑kubeconfig文件即可,如上一节所述。

要安装kubectx,只需按照GitHub页面上的说明进行操作

双方kubectxkubens提供命令完成通过完成脚本。这使您可以自动完成上下文名称和名称空间,从而不必完全键入它们。您也可以在GitHub页面上找到设置完成的说明。

kubectx的另一个有用功能是交互模式。该功能与必须单独安装的fzf工具结合使用(实际上,安装fzf会自动启用kubectx交互模式)。交互式模式允许您通过交互式模糊搜索界面(由fzf提供)选择目标上下文或名称空间。

使用外壳别名

实际上,您实际上并不需要单独的工具来更改当前上下文和名称空间,因为kubectl也提供了执行此操作的命令。特别是,该kubectl config命令提供了用于编辑kubeconfig文件的子命令。这里是其中的一些:

  • kubectl config get-contexts:列出所有上下文
  • kubectl config current-context:获取当前上下文
  • kubectl config use-context:更改当前上下文
  • kubectl config set-context:更改上下文的元素

但是,直接使用这些命令不是很方便,因为它们的键入时间很长。但是您可以做的是将它们包装到可以更容易执行的shell别名中。

我根据这些命令创建了一组别名,这些别名提供了与kubectx类似的功能。在这里,您可以看到它们的运行情况:

 

请注意,别名使用fzf提供交互式模糊搜索界面(如kubectx的交互式模式)。这意味着,您需要安装fzf才能使用这些别名。

以下是别名的定义:

 
 
 

.bashrc

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#93a1a1"># Get current context</span>
<span style="color:#b58900">alias</span> <span style="color:#cb4b16">krc</span>=<span style="color:#2aa198">'kubectl config current-context'</span>
<span style="color:#93a1a1"># List all contexts</span>
<span style="color:#b58900">alias</span> <span style="color:#cb4b16">klc</span>=<span style="color:#2aa198">'kubectl config get-contexts -o name | sed "s/^/  /;\|^  <span style="color:#cb4b16"><span style="color:#cb4b16">$(</span>krc<span style="color:#cb4b16">)</span></span>$|s/ /*/"'</span>
<span style="color:#93a1a1"># Change current context</span>
<span style="color:#b58900">alias</span> <span style="color:#cb4b16">kcc</span>=<span style="color:#2aa198">'kubectl config use-context "<span style="color:#cb4b16"><span style="color:#cb4b16">$(</span>klc | fzf -e | <span style="color:#b58900">sed</span> <span style="color:#2aa198">"s/^..//"</span><span style="color:#cb4b16">)</span></span>"'</span>

<span style="color:#93a1a1"># Get current namespace</span>
<span style="color:#b58900">alias</span> <span style="color:#cb4b16">krn</span>=<span style="color:#2aa198">'kubectl config get-contexts --no-headers "<span style="color:#cb4b16"><span style="color:#cb4b16">$(</span>krc<span style="color:#cb4b16">)</span></span>" | awk "{print \<span style="color:#cb4b16">$5</span>}" | sed "s/^$/default/"'</span>
<span style="color:#93a1a1"># List all namespaces</span>
<span style="color:#b58900">alias</span> <span style="color:#cb4b16">kln</span>=<span style="color:#2aa198">'kubectl get -o name ns | sed "s|^.*/|  |;\|^  <span style="color:#cb4b16"><span style="color:#cb4b16">$(</span>krn<span style="color:#cb4b16">)</span></span>$|s/ /*/"'</span>
<span style="color:#93a1a1"># Change current namespace</span>
<span style="color:#b58900">alias</span> <span style="color:#cb4b16">kcn</span>=<span style="color:#2aa198">'kubectl config set-context --current --namespace "<span style="color:#cb4b16"><span style="color:#cb4b16">$(</span>kln | fzf -e | <span style="color:#b58900">sed</span> <span style="color:#2aa198">"s/^..//"</span><span style="color:#cb4b16">)</span></span>"'</span></code></span></span>

安装这些别名,您只需将以上定义添加到您的~/.bashrcor~/.zshrc文件中,然后重新加载您的shell!

使用插件

Kubectl允许安装可以像本机命令一样调用的插件。例如,您可以安装一个名为kubectl-foo的插件,然后以方式调用它kubectl foo

Kubectl插件将在本文的后面部分中详细介绍

能够像这样更改当前上下文和名称空间不是很好吗?例如,要运行kubectl ctx以更改上下文并kubectl ns更改名称空间吗?

我创建了两个可以做到这一点的插件:

在内部,这些插件建立在上一部分的别名的基础上。

在这里,您可以看到正在使用的插件:

 

请注意,插件使用fzf提供了交互式模糊搜索界面。这意味着,您需要安装fzf才能使用这些插件。

安装插件,您只需将名为kubectl-ctx和的Shell脚本下载kubectl-ns到您的任何目录中PATH,并使它们可执行(例如,使用chmod +x)。就是这样!之后,您应该立即可以使用kubectl ctxkubectl ns

5.使用自动生成的别名保存键入

Shell别名通常是保存键入的好方法。该kubectl-别名项目以这个想法心脏,并提供800别名共同kubectl命令。

您可能想知道如何记住800个别名?实际上,您不需要记住它们,因为它们都是根据简单的方案生成的,如下所示以及一些示例别名:

尝试将鼠标悬停在示例别名上以获得视觉效果。

如您所见,别名由组成,每个组件代表kubectl命令的特定元素。每个别名可以有一个用于基本命令操作资源的组件,以及一个用于选项的多个组件,您只需按照上述方案从左到右“填充”这些组件即可。

请注意,当前的详细方案位于GitHub页面上。在这里您还可以找到别名完整列表

例如,别名kgpooyamlall代表命令kubectl get pods -o yaml --all-namespaces

  • ķKubectl
  • G得到
  • PO豆荚
  • Oyaml-o yaml
  • 全部--all-命名空间

请注意,大多数选项组件的相对顺序无关紧要。因此,kgpooyamlall等同于kgpoalloyaml

您不需要使用所有组件作为别名。例如kkgkloksys,或者kgpo是有效的别名也。此外,您可以在命令行上将别名与其他单词组合在一起。

例如,您可以使用k proxy来运行kubectl proxy

  • ķKubectl
  •  代理人

或者,您可以使用它kg roles来运行kubectl get roles(Roles资源目前不存在别名组件):

  • ķKubectl
  • G得到
  •  角色

要获取特定的Pod,可以使用kgpo my-pod以下命令kubectl get pod my-pod

  • ķKubectl
  • G得到
  • PO豆荚
  •  我的豆荚

请注意,某些别名甚至需要在命令行上进一步输入参数。例如,kgpol别名代表kubectl get pods -l。该-l选项需要一个参数(标签规范)。因此,您必须使用此别名,例如,如下所示:

  • ķKubectl
  • G得到
  • PO豆荚
  • 升-l
  •  app = ui

出于这个原因,你可以使用af以及l只在一个别名的结尾部分。

通常,一旦掌握了该方案,就可以从要执行的命令中直观地推断出别名,并节省大量输入!

安装

要安装kubectl-aliases,您只需.kubectl-aliases要从GitHub下载文件并在您的~/.bashrc~/.zshrc文件中获取它:

 
 
 

.bashrc

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#b58900">source</span> ~/.kubectl_aliases</code></span></span>

就是这样!重新加载外壳程序后,您应该可以使用所有800个kubectl别名!

完成时间

如您所见,您经常在命令行上将其他单词附加到别名上。例如:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kgpooyaml test-pod-d4b77b989</code></span></span>

如果使用kubectl命令完成功能,则可能习惯于自动完成资源名称之类的事情。但是当您使用别名时仍然可以这样做吗?

这是一个重要的问题,因为如果它不起作用,那将抵消这些别名的某些好处!

答案取决于您使用的外壳。

对于Zsh,完成工作对于别名是开箱即用的。

对于Bash,不幸的是,默认情况下,别名的补全功能不起作用。好消息是,它可以通过一些额外的步骤来完成。下一节将说明如何执行此操作。

在Bash中启用别名的完成

Bash的问题在于,它会尝试在别名名称上(而不是在别名命令(如Zsh)上)尝试完成(无论何时按Tab)。由于您没有所有800个别名的完成脚本,因此无法使用。

完整的别名项目提供了解决这个问题的通用解决方案。它利用别名的完成机制,在内部将别名扩展为别名命令,并返回扩展命令的完成建议。这意味着,它使别名的完成行为与别名命令的行为完全相同。

在下文中,我将首先说明如何安装complete-alias,然后如何配置它以启用所有kubectl别名的完成。

安装完整别名

首先,完全别名取决于bash-completion。因此,在安装完全别名之前,您需要确保已安装bash-completion。前面已经针对LinuxmacOS给出了相关说明。

对于macOS用户的重要说明:kubectl完成脚本一样,complete-alias不适用于Bash 3.2,后者是macOS上Bash的默认版本。特别是,完全别名取决于bash-completion v2(brew install bash-completion@2),它至少需要Bash 4.1。这意味着,要在macOS上使用完全别名,您需要安装较新版本的Bash

要安装完全别名,您只需bash_completion.shGitHub存储库下载脚本,然后将其作为源~/.bashrc文件保存在文件中:

 
 
 

.bashrc

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#b58900">source</span> ~/bash_completion.sh</code></span></span>

重新加载外壳程序后,应该正确安装complete-alias。

启用kubectl别名的完成

从技术上讲,完全别名提供了_complete_aliasshell功能。该函数检查别名,并返回别名命令的完成建议。

要将其与特定别名联系起来,必须使用complete内置的Bash设置_complete_alias为别名的完成功能

例如,让我们以k代表kubectl命令的别名为例。要将其设置_complete_alias为该别名的完成功能,必须执行以下命令:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>complete -F _complete_alias k</code></span></span>

这样的效果是,每当您对k别名自动完成时,_complete_alias都会调用该函数,该函数将检查别名并返回kubectl命令的完成建议。

再举一个例子,让我们以kg别名来代表kubectl get

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>complete -F _complete_alias kg</code></span></span>

同样,这样做的效果是,当您自动完成时kg,您将获得与相同的完成建议kubectl get

注意,可以通过这种方式对系统上的任何别名使用完全别名。

因此,要为所有kubectl别名启用补功能,只需为每个别名运行以上命令。以下代码段正是这样做的(假设您将kubectl-aliases安装到~/.kubectl-aliases):

 
 
 

.bashrc

<span style="color:#000000"><span style="color:#657b83"><code><span style="color:#859900">for</span> <span style="color:#cb4b16">_a</span> <span style="color:#859900">in</span> <span style="color:#cb4b16"><span style="color:#cb4b16">$(</span><span style="color:#b58900">sed</span> <span style="color:#2aa198">'/^alias /!d;s/^alias //;s/=.*$//'</span> ~/.kubectl_aliases<span style="color:#cb4b16">)</span></span><span style="color:#586e75">;</span> <span style="color:#859900">do</span>
  complete -F _complete_alias <span style="color:#2aa198">"<span style="color:#cb4b16">$_a</span>"</span>
<span style="color:#859900">done</span></code></span></span>

只需将此代码段添加到您的~/.bashrc文件中,重新加载您的Shell,现在您就可以对800个kubectl别名使用完成功能了!

6.用插件扩展kubectl

1.12版开始,kubectl包含插件机制,可让您使用自定义命令扩展kubectl。

这是一个可以通过以下方式调用的kubectl插件的示例kubectl hello

 

如果您熟悉它,kubectl插件机制将紧跟Git插件机制的设计。

本节将向您展示如何安装插件,可以在其中找到现有插件以及如何创建自己的插件。

安装插件

Kubectl插件以简单的可执行文件的形式分发,名称为kubectl-x。该前缀kubectl-是必需的,其后是新的kubectl子命令,该子命令允许调用该插件。

例如,上面显示的hello插件将作为名为的文件分发kubectl-hello

安装插件,您只需将kubectl-x文件复制到您的任何目录中PATH并使其可执行(例如,使用chmod +x)。之后,您可以立即使用调用插件kubectl x

您可以使用以下命令列出系统上当前安装的所有插件:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code>kubectl plugin list</code></span></span>

如果您有多个具有相同名称的插件,或者存在无法执行的插件文件,则此命令还会显示警告。

使用krew查找和安装插件

Kubectl插件使自己像软件包一样可以共享和重用。但是,在哪里可以找到其他人共享的插件?

krew)项目旨在提供一个统一的解决方案,共享,查找,安装和管理kubectl插件。该项目称自己为“ kubectl插件的软件包管理器”(krew的名字暗示了brew)。

Krew围绕着一个kubectl插件索引,您可以从中选择和安装。在这里,您可以看到实际操作:

 

如您所见,krew本身就是一个kubectl插件。这意味着,安装krew本质上就像安装其他任何kubectl插件一样。您可以在GitHub页面上找到krew的详细安装说明。

最重要的krew命令如下:

 
 
 

重击

<span style="color:#000000"><span style="color:#f8f8f2"><code><span style="color:#708090"># Search the krew index (with an optional search query)</span>
kubectl krew search <span style="color:#f8f8f2">[</span><span style="color:#f8f8f2"><</span>query<span style="color:#f8f8f2">></span><span style="color:#f8f8f2">]</span>
<span style="color:#708090"># Display information about a plugin</span>
kubectl krew info <span style="color:#f8f8f2"><</span>plugin<span style="color:#f8f8f2">></span>
<span style="color:#708090"># Install a plugin</span>
kubectl krew <span style="color:#e6db74">install</span> <span style="color:#f8f8f2"><</span>plugin<span style="color:#f8f8f2">></span>
<span style="color:#708090"># Upgrade all plugins to the newest versions</span>
kubectl krew upgrade
<span style="color:#708090"># List all plugins that have been installed with krew</span>
kubectl krew list
<span style="color:#708090"># Uninstall a plugin</span>
kubectl krew remove <span style="color:#f8f8f2"><</span>plugin<span style="color:#f8f8f2">></span></code></span></span>

请注意,使用krew安装插件不会阻止以传统方式安装插件。即使您使用krew,您仍然可以通过其他方式安装在其他地方找到的插件(或创建自己的插件)。

请注意,该kubectl krew list命令仅列出已与krew一起安装的插件,而该kubectl plugin list命令列出了所有已与krew一起安装的插件和以其他方式安装的插件。

创建自己的插件

当然,您可以创建自己的kubectl插件,这很容易做到。

您只需要创建一个执行所需操作的可执行文件,为它指定一个表单名称kubectl-x,然后按照上述说明安装即可。

可执行文件可以是任何类型,可以是Bash脚本,已编译的Go程序,Python脚本,实际上并不重要。唯一的要求是它可以由操作系统直接执行。

让我们现在创建一个示例插件。在上一节中,您使用了kubectl命令列出每个Pod的容器图像。您可以轻松地将此命令转换为可以通过调用的插件kubectl img

为此,只需创建一个kubectl-img具有以下内容的文件:

 
 
 

kubectl-img

<span style="color:#000000"><span style="color:#657b83"><code><strong><span style="color:#cb4b16">#!/bin/bash</span></strong>
kubectl get pods -o custom-columns=<span style="color:#2aa198">'NAME:metadata.name,IMAGES:spec.containers[*].image'</span></code></span></span>

现在,使该文件具有可执行文件,chmod +x kubectl-img并将其移动到您目录中的任何目录PATH。之后,您可以立即使用带有kubectl img!的插件。

如前所述,kubectl插件可以用任何编程或脚本语言编写。如果使用shell脚本,则具有可以轻松从插件调用kubectl的优势。但是,您可以使用真实的编程语言编写更复杂的插件,例如,使用Kubernetes客户端库。如果使用Go,还可以使用cli-runtime库,该库专门用于编写kubectl插件。

共享您的插件

如果您认为自己的某个插件可能对其他人有用,请随时在GitHub上共享它。确保将其添加到kubectl-plugins主题,以便其他人可以找到它。

您还可以请求将插件添加到krew索引。您可以在krew GitHub存储库中找到有关如何执行此操作的说明。

命令完成

目前,不幸的是,插件机制尚不支持命令完成。这意味着您需要完整键入插件名称以及插件的所有参数。

但是,kubectl GitHub存储库中对此有一个开放功能请求。因此,有可能在将来的某个时候实现此功能。

转载:

https://learnk8s.io/blog/kubectl-productivity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值