在 Ubuntu 上安装 Kubectl

2025年3月17日 | 阅读 12 分钟

Kubectl 简介

Kubernetes 提供了一个命令行工具,可以借助 Kubernetes API 与 Kubernetes 集群 的控制平面进行通信。该工具称为 kubectl

Kubectl 在目录 $HOME/.kube 中查找一个名为 config 的文件用于配置。我们可以通过设置 --kubeconfig 标志KUBECONFIG 环境变量 来定义其他 kubeconfig 文件。

从用户的角度来看,kubectl 是我们控制 Kubernetes 的驾驶舱。它允许我们执行所有可能的 Kubernetes 操作。从技术用户的角度来看,kubectl 是 Kubernetes API 的客户端。API 才是 Kubernetes 的真正用户界面。

Kubernetes 完全由这个 API 控制。这意味着所有 Kubernetes 操作都公开为一个 API 端点,可以通过对该端点的 HTTP 请求来运行。kubectl 的主要目标是相应地实现对 Kubernetes API 的 HTTP 请求。

Kubernetes 简介

Kubernetes 是一个免费的容器编排系统,用于自动化软件部署、管理和扩展。最初由 Google 开发,现由 Cloud Native Computing Foundation 管理。

Kubernetes 这个词源于希腊语,意为“飞行员”或“舵手”。通常,Kubernetes 被称为 K8s,这是 K 和 s 之间的字母数量。
Kubernetes 与 CRI-O 和 containerd 一起工作。它管理和运行大型云原生工作负载的能力使其在数据中心得到了广泛应用。该平台的多个发行版来自 ISV,并托管在每个主要公共云供应商的云贡献上。

Kubernetes 的概念

Kubernetes 指定了一组原语(构建块),这些原语共同提供了基于自定义指标、内存和 CPU 来扩展、维护和部署应用程序的机制。Kubernetes 是可扩展的,并且与工作负载松散耦合。在 Kubernetes 上运行的容器、扩展和内部组件依赖于 Kubernetes API。

Kubernetes 遵循副本/主架构。Kubernetes 的元素可以分为维护单个节点的组件和控制面板组件。

控制面板

Kubernetes 的主节点管理集群的 Kubernetes 控制面板,处理其工作负载并协调系统内部的通信。Kubernetes 的控制面板由多个组件组成,所有这些进程都可以运行在单个主节点上的多个主节点上。以下是几个 Kubernetes 控制面板组件:

  • etcd 是一个分布式、轻量级、持久化的键值数据存储,由 CoreOS 改进。它可靠地保存集群的配置信息,指示整体集群状态。
  • API 服务器 通过 HTTP 使用 JSON 提供 Kubernetes API,提供外部和内部接口。API 服务器构建和批准 REST 请求,并在 etcd 中更新 API 对象状态。因此,允许客户端在工作节点上设置容器和工作负载。
  • 调度器 是一个可扩展的组件,它根据资源可用性选择在哪个节点上运行任何未调度的 pod。调度器记录所有节点的资源使用情况,以确保工作负载不会调度到资源过剩的地方。
  • 控制器 是将集群的实际状态调整到期望状态的协调循环,与 API 服务器协商以创建、更新和删除它管理的资源(例如,服务和 pod 端点)。

节点

节点也称为 minion 或 worker。它是部署容器的机器。在集群中,所有节点必须运行一个容器运行时,如 containerd,以及以下组件:

  • 容器 位于 pod 中。它是微服务的最低级别,其中包含活动库、应用程序及其依赖项。
  • Kubelet 负责所有节点的工作状态,确保每个容器在节点上都是健康的。
  • Kube-proxy 是一个负载均衡器和网络代理的实现,它提供服务抽象以及其他网络任务。它负责根据传入请求的端口号或 IP 将流量路由到适当的容器。

为什么我们需要 kubectl?

我们的 Kubernetes 平台是一个由工作节点和主节点组成的复合系统。一种与它交互的方式是通过其 API 服务器。该服务器是 Kubernetes 控制平面的主要组件,它表示一个 HTTP REST API,允许所有外部组件、集群和用户之间的通信。

API 被视为我们 Kubernetes 平台的主要用户界面和前端。通过与客户端库、kubectl 交互或直接构建 REST 请求,可以管理、查询和更新我们 Kubernetes 平台上的对象和资源的状态。

Kubectl 是构建 Kubernetes API HTTP 请求的最通用方法之一,它用于执行 Kubernetes 操作、部署容器化应用程序、检查和维护集群中的资源、查看系统日志以及执行监控操作。

Kubectl 身份验证

在生产环境或常规环境中,有两种常用技术可以进行 kubectl 身份验证。这两种技术是令牌(OIDC 令牌和服务帐户令牌)和客户端证书(企业 PKI 证书和自签名 Kubernetes 证书)。

  • 客户端证书基于行业标准,需要有效的 x509 客户端证书。这些证书是授权的,可以由外部或内部签名。
  • 证书通过集群的 Kubernetes API 服务器,从 API 调用(即 CertificateSigningRequest)进行内部签名。这种技术可能更方便、更容易,因为它不需要外部基础设施,尽管它与大规模分发不兼容,因为请求是专用的,更多处理可能成本高昂。
  • 证书通过企业 PKI(公钥基础设施)或外部系统管理员进行外部签名。
  • 我们可以通过多种方式使用令牌进行身份验证,尽管最简单的方法是创建一个服务帐户,并通过该帐户通过 Kubernetes API 生成令牌。然后,该令牌会使用该帐户对请求进行身份验证,从而允许访问授权的集群。此技术对于持续与 Kubernetes API 交互的长期过程非常有用。
  • 使用令牌的另一种技术是生成外部 OIDC(OpenID Connect)令牌。它适用于企业用途和用户应用程序,因为它是最可扩展和最安全的身份验证技术。它也适用于大型团队,因为它为每个集群用户使用单独的登录令牌。

kubectl 的常见用例

kubectl 通常可用于启动或执行所有 Kubernetes 操作。但有一些最常用的功能用于查询和管理 Kubernetes 集群的健康状况。描述和列出资源是其中一项功能。我们需要检查资源的状态并记住当前运行的资源数量,因为会创建更多资源。

  • 可以使用 kubectl describekubectl get 来完成此操作。
    构建资源是我们可以使用 kubectl 的另一个重要方式。通过使用命令,即 kubectl create,我们可以创建和调度 cron 作业、服务、应用程序部署以及其他各种 Kubernetes 资源或组件。使用此命令以及可用的标志,我们可以控制我们想要创建的资源以及何时何地创建它们。
  • 除了构建 Kubernetes 对象之外,我们还可以更新和删除特定的资源实例。如果我们使用 resource.yaml 文件声明创建了资源,我们可以使用命令,即 kubectl apply,来更新、重置或刷新资源,具体取决于文件中的修改。
  • 此外,我们还可以使用 kubectl edit 命令来编辑特定的资源实例。它会打开一个编辑器,在其中所做的修改将升级到资源中。
  • 我们 finally 可以使用 kubectl delete 来删除资源。
  • 如果使用 kubectl logskubectl debug,调整 Kubernetes 对象会很容易。kubectl logs 命令会打印出资源日志,而 kubectl debug 命令会创建关联的调试容器。
  • 最后,能够从容器复制目录和文件以及将目录和文件复制到容器中是从 kubectl 操作 Kubernetes 的有用工具。我们可以使用 kubectl cp 命令来完成此操作。

Kubernetes 状态

Kubernetes 会主动检查对象(无论是 pod、部署还是容器)的健康状况。Kubernetes 的控制面板包含集群的每个 Kubernetes 对象的当前状态和配置记录。另一方面,控制器管理器会查看实际状态和期望状态之间的差异,并进行操作以改进它们。

  • 在 Kubernetes 中,几乎所有对象都有一个规范(spec)和状态。
  • 规范在创建时指定,并宣布对象的期望状态。
  • 此外,状态是该对象的当前状态的任意值。
  • 我们可以使用命令,即 kubectl get,来查看其状态,显示资源的状态以及它如何可用,具体取决于特定的对象或资源。
  • 例如,pod 根据预期的 pod 状态有五个状态值(未知、失败、成功、运行和待定)。

在团队协作中,调试对象状态很重要。由其他用户创建的资源可能会限制我们资源的性能。我们创建的资源可能会卡在 Waiting、Pending 状态,或者由于建立其所需的资产当前在空间有限的集群中使用而失败。我们可以使用 kubectl debug 和 kubectl logs 来理解对象的状态并深入研究各种故障原因。

Kubectl 配置

Kubectl 是一个与 Kubernetes 交互的 CLI(命令行界面)。我们可以使用它来管理 Kubernetes 资源,包括部署、服务和 pod。kubectl 的配置文件是一个配置文件,其中保存了与 Kubernetes 集群交互的所有关键信息。它包括以下信息:

  • 集群中指定的所有上下文的名称。
  • 与 Kubernetes API 服务器进行身份验证的凭据(密码和用户名)。
  • Kubernetes API 服务器的位置。
  • Kubernetes 集群名称。

kubectl 语法

我们可以使用以下语法从终端运行 kubectl 命令:

说明

Command- 它描述了我们希望对多个资源执行的操作。

例如,create、describe、delete、get 等。

TYPE- 它描述了资源的类型。这些资源类型不区分大小写,我们可以定义缩写、单数或复数形式。

例如,以下命令会产生相同的结果:

NAME- 它描述了资源的名称。资源名称区分大小写。如果缺少名称,则会显示每个资源的详细信息。

例如,kubectl get pods。

我们可以通过名称和类型定义所有资源,或在对一个或多个资源执行操作时定义多个文件。

  • 按类型单独定义多个资源

例如,kubectl get pod/example-pod1 replicationcontroller/example-rc1

  • 通过名称和类型定义资源

为同类资源组资源

例如,kubectl get pod example-pod1 example-pod2

flags- 它描述了可选标志。

例如,我们可以使用 --server-s 标志来指定 Kubernetes API 服务器的端口和地址。

注意:标志会覆盖相关的环境变量和我们从命令行定义的默认值。

命名空间覆盖和集群内身份验证

首先,kubectl 将默认确定它是否在 pod 中运行,因此也在集群中运行。它首先检查环境变量,即 KUBERNETES_SERVICE_PORTKUBERNETES_SERVICE_HOST,以及 /var/run/secrets/kubernetes.io.serviceaccount/token 上的服务帐户令牌文件的存在。如果这三者都找到,则会模拟集群内身份验证。

为了保持向后兼容性,当在集群内身份验证期间设置了环境变量,即 POD_NAMESPACE 时,它将覆盖服务帐户令牌中的命名空间(默认)。依赖于命名空间默认值的工具或清单会受到此影响。

POD_NAMESPACE 环境变量。如果设置了环境变量,cli 操作将在命名空间资源上默认使用该变量的值。

kubectl 如何管理 ServiceAccount 令牌

If

  • 设置了环境变量 KUBERNETES_SERVICE_PORT
  • 设置了环境变量 KUBERNETES_SERVICE_HOST
  • /var/run/secrets/kubernetes.io.serviceaccount/token 处有一个 Kubernetes 服务帐户的令牌文件

我们在 kubectl 命令行上没有显式指定任何命名空间

然后,kubectl 会模拟它正在我们集群中运行。该工具,即 kubectl 会查找 ServiceAccount 的命名空间(它与 pod 命名空间相同)并在该命名空间下运行。这与集群外部发生的情况不同。如果 kubectl 在集群外部运行且我们未定义命名空间,kubectl 命令将在(默认)命名空间下运行。

kubectl 操作

以下是一些 kubectl 操作及其语法和描述:

Install Kubectl on Ubuntu

alpha- 它列出了当前与 alpha 功能相关的命令,这些功能在 Kubernetes 集群中默认未启用。

语法

annotate- 它更新或添加多个资源的注解。

语法

api-resources- 它列出可用的 API 资源。

语法

api-versions- 它列出可用的 API 版本。

语法

apply- 它通过 stdin 或文件将配置更改应用于资源。

语法

attach- 它附加到一个活动的容器,以便与 stdin(容器)进行交互或查看流的末尾。

语法

auth- 检查授权。

语法

autoscale- 它自动扩展由复制控制器处理的 pod 组。

语法

certificate- 更改证书资源。

语法

cluster-info- 它显示集群中服务和主节点的端点信息。

语法

completion- 为指定的 shell(zsh 或 bash)生成最终的 shell 补全代码。

语法

config- 它更改 kubeconfig 文件。

语法

convert- 它在不同 API 版本之间转换配置文件。接受 JSON 和 YAML 格式。

重要提示:它需要安装一个插件,即 kubectl-convert。

语法

cordon- 它将节点标记为不可调度。

语法

cp- 它在容器之间复制目录和文件。

语法

create- 它从 stdin 或文件创建多个资源。

语法

delete- 它通过 stdin、文件或指定标签名称、选择器、资源或资源选择器来删除资源。

语法

describe- 它显示多个资源的详细状态。

语法

diff- 对比文件或 stdin 与实时配置。

语法

在 Ubuntu 上安装 kubectl

Kubectl 是一款开源工具,在容器编排中至关重要。Kubernetes 通过在多个云环境或本地服务器上大规模管理和编排集群来运行。

集群是用于运行容器化服务和应用程序的主机组。一个集群至少需要两个不同的节点才能运行——一个工作节点和一个主节点。我们可以选择根据需要添加任意数量的工作节点来扩展集群,以实现可扩展性。

Kubernetes 中,节点指的是服务器。服务器是主节点,负责集群状态。工作节点是运行工作负载的服务器——通常是容器化服务和应用程序。

前提条件

我们需要设置两台在 Ubuntu 系统上运行的服务器。对于 Kubernetes,为了获得最佳性能,最低系统要求是 2 CPUs 和 2 GB RAM。一台服务器将是主节点,另一台将是工作节点。

  • 确保我们将具有 sudo 权限的用户添加到将要执行命令的节点上。
  • 网络连接- 在集群中,服务器应该能够通信。当我们在 CloudSigma 上部署虚拟机时,它们默认会通过公共 IP 连接到 Internet。如果我们通过本地网络工作,可能需要编辑所有服务器上的 /etc/hosts 文件,并相应地连接它们。
  • 我们需要在所有节点上启用和安装 Docker。Kubernetes 依赖于容器运行时来在 pod 中运行容器。Docker 将提供 Ubuntu 所需的运行时环境。

启用 snaps 并安装 kubectl

snap 是一种应用程序包,它包含了运行在其所有依赖项中,可以在所有流行的 Linux 发行版上运行,只需一次构建。它们会自动优雅地更新和回滚。snap 可从 Snap Store 和应用商店安装和发现,并拥有数百万用户。

启用 snapd

如果您运行的是 Focal Fossa (Ubuntu 20.04)、Bionic Beaver (Ubuntu 18.04)Xenial Xerus (Ubuntu 16.04),则无需执行任何操作。Snap 已安装并准备就绪。

对于 Ubuntu 版本介于 Wily Werewolf (Ubuntu 15.10)Trusty Tahr (Ubuntu 14.04 LTS) 之间,以及默认不包含 snap 的 Ubuntu 变体,可以使用 Ubuntu 软件中心 通过搜索 snapd 来安装 snap。也可以通过命令行安装 snapd


Install Kubectl on Ubuntu

Install Kubectl on Ubuntu

要么重新登录并注销,要么重启系统,以确保 snap 路径已正确更新。

安装 kubectl

我们可以简单地运行以下命令来安装 kubectl


Install Kubectl on Ubuntu

卸载 Kubectl

我们可以在终端窗口中使用以下命令来删除或卸载 kubectl:


Install Kubectl on Ubuntu
下一主题TLP Ubuntu