跳到主要内容

如何管理和切换本地K8s集群?

在使用 kubectl 管理和操作 Kubernetes 集群时,kubeconfig 文件扮演着核心角色,它包含了连接和认证到集群所需的所有信息,如API服务器地址、用户凭证和上下文定义。对于需要同时管理多个Kubernetes集群的用户而言,理解kubeconfig文件的结构并掌握如何在其间切换是至关重要的。本文将深入探讨kubeconfig文件的自定义选项,并提供多种管理和切换本地多个K8s集群的方法,旨在为初中级技术人员提供一份高质量的教学指导。

kubeconfig 文件结构与自定义

一个典型的 kubeconfig 文件是一个YAML格式的配置文件,其核心组成部分包括:

  • apiVersion: API 版本,通常固定为 v1
  • kind: 对象类型,对 kubeconfig 文件而言,固定为 Config
  • clusters: 定义了要连接的Kubernetes集群的详细信息。
  • users: 定义了用于认证到集群的用户凭证。
  • contexts: 将一个集群、一个用户和一个可选的命名空间组合在一起,形成一个“上下文”。
  • current-context: 指定当前kubectl默认使用的上下文。
  • preferences: 用户界面偏好设置,通常为空。

以下是kubeconfig文件的结构示例:

apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: https://kubernetes.default:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: admin
name: kubernetes
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: <your access name>
user:
token: <your own token>

在上述结构中,并非所有部分都可以随意修改。以下是可自定义和不建议自定义的部分:

1. 可自定义的部分

  • clusters 部分:
    • name: 自定义。集群的逻辑名称,在contexts中引用。例如:name: my-dev-cluster
    • server: 自定义 (必须准确)。Kubernetes API服务器的实际URL。例如:server: https://192.168.49.2:8443
    • insecure-skip-tls-verify: 自定义 (谨慎)。设置为true跳过TLS证书验证。强烈不建议在生产环境中使用,应使用certificate-authority-datacertificate-authority指定CA证书。
  • users 部分:
    • name: 自定义。用户凭证的逻辑名称,在contexts中引用。例如:name: my-admin-user
    • user 下的凭证信息: 自定义 (必须提供)。这是连接集群的关键认证信息。根据认证方式,可以是tokenclient-certificate-data/client-key-datausername/passwordexec插件。例如:token: <your own token><your own token>需替换为实际凭证。
  • contexts 部分:
    • name: 自定义。上下文的逻辑名称,通过kubectl config use-context命令引用。应具有描述性。例如:name: dev-cluster-admin-context
    • context 下的 cluster: 自定义 (引用上方)。必须引用clusters部分定义的集群name
    • context 下的 user: 自定义 (引用上方)。必须引用users部分定义的用户凭证name
    • context 下的 namespace (可选): 如果希望该上下文默认操作特定命名空间,可添加namespace: <your-namespace>
  • current-context 部分:
    • current-context: 自定义。指定kubectl默认使用的上下文名称。可以通过kubectl config use-context <context-name>修改。

2. 不建议或不能自定义的部分

  • apiVersion: 几乎总是 v1,不建议手动修改。
  • kind: 必须是 Config,不能自定义。
  • preferences: 通常为一个空对象{},不需修改。

在本地切换不同的Kubernetes集群

kubectl默认会查找 $HOME/.kube/config 文件。要切换不同的集群,可以通过以下几种方式来管理您的 kubeconfig 文件。

1. 核心概念:KUBECONFIG 环境变量

KUBECONFIG 环境变量允许您指定一个或多个kubeconfig文件的路径。当该变量被设置时,kubectl会将其中列出的所有kubeconfig文件合并起来。

2. 方案一:通过 KUBECONFIG 环境变量指定单个文件

此方法适用于临时使用特定kubeconfig文件而不影响默认设置的场景。

命令示例:

KUBECONFIG=/path/to/your/config1.yaml kubectl get pods

或执行一系列命令:

export KUBECONFIG=/path/to/your/config1.yaml
kubectl get pods
kubectl get nodes
# ... 其他命令 ...
unset KUBECONFIG # 取消设置环境变量

说明:

  • /path/to/your/config1.yaml 需替换为实际路径。
  • 此设置仅影响当前终端会话。

3. 方案二:通过 KUBECONFIG 环境变量合并多个文件

当您希望kubectl同时识别多个kubeconfig文件时,可将文件路径用冒号:(Linux/macOS)或分号;(Windows)连接起来设置到KUBECONFIG环境变量中。

命令示例 (Linux/macOS):

export KUBECONFIG=/path/to/your/config1.yaml:/path/to/your/config2.yaml:/path/to/your/config3.yaml
kubectl config get-contexts

说明:

  • kubectl config get-contexts 将列出所有合并后的可用上下文。
  • 合并后,可使用kubectl config use-context <context-name>切换。

4. 方案三:使用 kubectl config use-context 切换上下文

如果您的多个集群配置已合并到一个kubeconfig文件中(如~/.kube/config,或通过方案二合并后),可直接使用此命令。

步骤:

  1. 确认所有上下文都已加载:

    kubectl config get-contexts

    输出中,活跃上下文会显示星号*

  2. 切换到目标上下文:

    kubectl config use-context <your-context-name>

    例如:

    kubectl config use-context minikube
    kubectl config use-context arn:aws:eks:us-west-2:123456789012:cluster/my-eks-cluster

    切换后,后续kubectl命令将作用于新选择的集群。

5. 方案四:将所有配置合并到默认文件

手动将所有kubeconfig文件的内容合并到$HOME/.kube/config中。

步骤:

  1. 备份现有配置:
    cp ~/.kube/config ~/.kube/config.backup
  2. 合并文件 (Linux/macOS):
    KUBECONFIG=~/.kube/config:/path/to/your/config1.yaml:/path/to/your/config2.yaml kubectl config view --flatten > ~/.kube/config.new
    mv ~/.kube/config.new ~/.kube/config
    该命令将指定文件内容合并并输出为单一文件,再保存到~/.kube/config

优点: 合并后,无需频繁设置KUBECONFIG环境变量,直接使用kubectl config use-context即可。

推荐工作流

为了高效管理和切换本地Kubernetes集群,建议采用以下工作流:

  1. 组织您的 kubeconfig 文件: 将它们集中存放于一个易于管理的目录,例如 ~/.kube/configs/

    • ~/.kube/configs/cluster1.yaml
    • ~/.kube/configs/cluster2.yaml
    • ~/.kube/configs/dev-cluster.yaml
  2. 设置 KUBECONFIG 环境变量至您的 shell 配置文件: 如果经常需要访问所有集群,可将KUBECONFIG环境变量的设置添加到您的~/.bashrc~/.zshrc~/.profile文件。

    # 在 ~/.bashrc 或 ~/.zshrc 中添加:
    export KUBECONFIG=~/.kube/config:~/.kube/configs/cluster1.yaml:~/.kube/configs/cluster2.yaml:~/.kube/configs/dev-cluster.yaml

    这样,每次打开新的终端会话时,kubectl都会自动加载所有这些配置。

  3. 使用 kubectl config get-contextskubectl config use-context 进行切换: 当需要切换集群时,先使用get-contexts查看所有可用上下文,然后使用use-context进行切换。

通过以上方法,您可以灵活且高效地管理本地的多个Kubernetes集群,提升日常运维效率。请记住,kubeconfig文件包含集群访问凭证,其安全性至关重要,务必妥善保管。