使用 kubectl config 管理多个 Kubernetes 集群的指南

通过 kubectl 上下文、kubeconfig 文件、命名空间和更安全的切换命令来管理多个 Kubernetes 集群。

使用 kubectl config 管理多个 Kubernetes 集群的指南

一旦你拥有开发、预发布、生产环境或跨多个云的集群,管理多个 Kubernetes 集群就变得很常见。风险很简单:如果上下文不明确,一条命令可能会误操作到错误的集群。

本指南将向你展示如何使用 kubectl config 来检查上下文、切换集群、设置命名空间以及组织多个 kubeconfig 文件。

理解 Kubeconfig 文件

在深入 kubectl config 命令之前,理解 kubeconfig 文件至关重要。该文件存储了关于你的集群、用户以及将它们绑定在一起的上下文的信息。kubectl 使用此文件进行身份验证并指定要交互的集群。默认情况下,kubectl 会在 $HOME/.kube/config 查找 kubeconfig 文件。

在此文件中,你会找到三个主要部分:

  • clusters:定义 Kubernetes 集群,包括它们的 API 服务器端点和证书颁发机构。
  • users:存储身份验证凭据,例如客户端证书和令牌。
  • contexts:将集群、用户和可选的命名空间关联起来。上下文提供了一种便捷的方式来分组这些配置,使得 kubectl 可以轻松地在不同的集群/用户组合之间切换。

使用 kubectl config 管理上下文

上下文是 kubectl 管理你与不同 Kubernetes 集群连接的主要方式。它们充当快捷方式,允许你通过一条命令在它们之间切换。

查看可用上下文

要查看当前 kubeconfig 文件中所有可用的上下文,请使用以下命令:

kubectl config get-contexts

此命令将输出一个上下文列表,以及每个上下文关联的集群、用户和命名空间。当前活动的上下文将用星号 (*) 标记。

示例输出:

CURRENT   NAME                 CLUSTER              AUTHINFO       NAMESPACE
*         my-dev-context       my-dev-cluster       dev-user       default
          my-prod-context      my-prod-cluster      prod-user      production
          staging-context      staging-cluster      staging-user   staging

获取当前上下文

要快速检查你当前正在使用哪个上下文,请运行:

kubectl config current-context

这将输出活动上下文的名称。

切换上下文

切换到不同的上下文很简单。使用 use-context 子命令,后跟要激活的上下文名称:

kubectl config use-context <context-name>

例如,要切换到上面示例中的 my-prod-context

kubectl config use-context my-prod-context

执行此命令后,后续的 kubectl 命令将定向到 my-prod-context 中指定的集群。

设置上下文

你也可以为集群和用户设置特定的上下文,而不必使其成为将来使用的默认上下文。这对于临时操作很有用。

kubectl config set-context <context-name> --cluster=<cluster-name> --user=<user-name> --namespace=<namespace-name>

如果省略 --namespace,将使用集群的默认命名空间。

管理集群和用户

虽然上下文用于切换,但你也可以直接管理上下文引用的集群和用户配置。

查看集群信息

要列出所有已配置的集群:

kubectl config get-clusters

要查看特定集群的详细信息:

kubectl config view --minify -o jsonpath='{.clusters[?(@.name=="<cluster-name>")].cluster}'

<cluster-name> 替换为集群的实际名称。

查看用户信息

要列出所有已配置的用户:

kubectl config get-users

添加和修改配置

你可以添加新的集群、用户和上下文,或修改现有的:

  • 添加新集群:
    kubectl config set-cluster <cluster-name> --server=<api-server-url> --certificate-authority=<path-to-ca-file> --embed-certs=true
    
  • 添加新用户:
    kubectl config set-credentials <user-name> --client-certificate=<path-to-cert-file> --client-key=<path-to-key-file> --embed-certs=true
    
  • 添加上下文:
    kubectl config set-context <context-name> --cluster=<cluster-name> --user=<user-name> --namespace=<namespace-name>
    

管理多个 Kubeconfig 文件

为了增强安全性和组织性,特别是在处理许多集群或敏感凭据时,最好将 kubeconfig 文件分开保存。kubectl 可以使用 KUBECONFIG 环境变量或 --kubeconfig 标志来管理多个 kubeconfig 文件。

使用 KUBECONFIG 环境变量

你可以指定要加载的 kubeconfig 文件列表。kubectl 会合并这些文件。如果同名的集群、用户或上下文出现在多个文件中,合并优先级取决于 KUBECONFIG 中文件的顺序,因此请使用唯一的名称以避免意外。

要为当前 shell 会话设置此变量:

export KUBECONFIG=~/.kube/config:~/.kube/config-dev:~/.kube/config-prod

要使其持久化,请将 export 行添加到 shell 的配置文件中(例如 ~/.bashrc~/.zshrc)。

使用 --kubeconfig 标志

或者,你可以为单个 kubectl 命令指定特定的 kubeconfig 文件:

kubectl --kubeconfig=~/.kube/config-dev get pods

这对于一次性命令或当你绝对确定正在使用哪个文件时很有用。

多集群管理的最佳实践

  • 使用单独的文件: 将不同环境(开发、预发布、生产)或云提供商的配置存储在不同的 kubeconfig 文件中(例如 config-devconfig-stagingconfig-prod)。
  • 利用 KUBECONFIG 在 shell 配置文件中设置 KUBECONFIG 环境变量,以便轻松合并和管理多个文件,而无需手动合并。
  • 描述性上下文名称: 为上下文使用清晰且描述性的名称(例如 aws-prod-us-east-1gke-dev-eu-west-2),以避免混淆。
  • 命名空间意识: 始终注意你正在操作的命名空间。使用 --namespace 标志或在上下文中设置它以定位正确的命名空间。
  • 定期审计: 定期检查你的上下文和集群配置,以确保它们是最新且安全的。
  • 保护你的 Kubeconfig: 将 kubeconfig 文件视为敏感凭据。限制文件权限,并避免将其提交到版本控制。

最终要点

将上下文检查纳入你的工作流程。在运行风险命令之前执行 kubectl config current-context,使用描述性上下文名称,有意识地设置命名空间,并在不需要时将生产凭据排除在随意 shell 会话之外。