为 Amazon EKS 创建 kubeconfig - Amazon EKS

为 Amazon EKS 创建 kubeconfig

在本节中,将为集群创建一个 kubeconfig 文件(或更新现有文件)。

本节提供两个用于创建或更新 kubeconfig 的过程。您可以使用 AWS CLI 通过 update-kubeconfig AWS CLI 命令快速自动创建或更新 kubeconfig,或者您可以使用 AWS CLI 或 aws-iam-authenticator 手动创建 kubeconfig。

Amazon EKS 使用 AWS CLI 的版本 1.16.156 或更高版本中提供的 aws eks get-token 命令或者适用于 Kubernetes 的 AWS IAM 身份验证器借助 kubectl 进行集群身份验证。如果您的系统上已安装 AWS CLI,则预设情况下,适用于 Kubernetes 的 AWS IAM 身份验证器将使用随以下命令返回的相同凭证:

aws sts get-caller-identity

有关更多信息,请参阅 AWS CLI 用户指南 中的配置 AWS Command Line Interface

自动创建 kubeconfig

使用 kubeconfig 创建 AWS CLI

  1. 确保您已安装 AWS CLI 的版本 1.16.156 或更高版本。要安装或升级 AWS CLI,请参阅 AWS Command Line Interface 用户指南中的安装 AWS CLI

    注意

    系统的 Python 版本必须为 2.7.9 或更高版本。否则,在 AWS CLI 调用 Amazon EKS 时会收到 hostname doesn't match 错误。

    可以使用以下命令来查看您的 AWS CLI 版本:

    aws --version
    重要

    软件包管理器(例如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 AWS CLI 落后几个版本。要确保您使用的是最新版本,请参阅 AWS Command Line Interface 用户指南中的安装 AWS CLI

  2. 使用 AWS CLI update-kubeconfig 命令创建或更新集群的 kubeconfig。

    • 默认情况下,生成的配置文件会在主目录的默认 kubeconfig 路径 (.kube/config) 中创建,或与该位置的现有 kubeconfig 合并。您可以使用 --kubeconfig 选项指定其他路径。

    • 发出 kubectl 命令时,可以使用 --role-arn 选项指定 IAM 角色 ARN 供身份验证使用。否则,将使用默认 AWS CLI 或开发工具包凭证链中的 IAM 实体。通过运行 AWS CLI 命令可以查看默认 aws sts get-caller-identity 或开发工具包标识。

    • 有关更多信息,请使用 aws eks update-kubeconfig help 命令参阅帮助页面,或参阅 AWS CLI 命令参考中的 update-kubeconfig

    注意

    要运行以下命令,您必须具有对指定的集群使用 eks:DescribeCluster API 操作的权限。有关更多信息,请参阅Amazon EKS 基于身份的策略示例

    aws eks --region <region-code> update-kubeconfig --name <cluster_name>
  3. 测试配置。

    kubectl get svc
    注意

    如果您收到任何授权或资源类型错误,请参阅故障排除部分中的未经授权或访问被拒绝 (kubectl)

    输出:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 1m

手动创建 kubeconfig

手动创建 kubeconfig 文件

  1. 如果默认 ~/.kube 目录尚不存在,请创建它。

    mkdir -p ~/.kube
  2. 打开您常用的文本编辑器并将以下 kubeconfig 代码块之一复制到其中,具体取决于您的首选客户端令牌方法。

    • 要使用 AWS CLI aws eks get-token 命令(需要 AWS CLI 版本 1.16.156 或更高版本),请执行以下操作:

      apiVersion: v1 clusters: - cluster: server: <endpoint-url> certificate-authority-data: <base64-encoded-ca-cert> name: kubernetes contexts: - context: cluster: kubernetes user: aws name: aws current-context: aws kind: Config preferences: {} users: - name: aws user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 command: aws args: - "eks" - "get-token" - "--cluster-name" - "<cluster-name>" # - "--role-arn" # - "<role-arn>" # env: # - name: AWS_PROFILE # value: "<aws-profile>"
    • 要使用适用于 Kubernetes 的 AWS IAM 身份验证器,请执行以下操作:

      apiVersion: v1 clusters: - cluster: server: <endpoint-url> certificate-authority-data: <base64-encoded-ca-cert> name: kubernetes contexts: - context: cluster: kubernetes user: aws name: aws current-context: aws kind: Config preferences: {} users: - name: aws user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 command: aws-iam-authenticator args: - "token" - "-i" - "<cluster-name>" # - "-r" # - "<role-arn>" # env: # - name: AWS_PROFILE # value: "<aws-profile>"
  3. 用为集群创建的端点 URL 替换 <endpoint-url>

  4. 用为集群创建的 certificateAuthority.data 替换 <base64-encoded-ca-cert>

  5. <cluster-name> 替换为您的集群名称。

  6. (可选)要代入 IAM 角色以执行集群操作(而不是默认AWS凭证提供程序链),请取消注释 -r--role<role-arn> 行,并替换 IAM 角色 ARN 以将其用于您的用户。

  7. (可选)要始终使用特别指定的 AWS 凭证配置文件(而不是默认AWS凭证提供程序链),请取消注释 env 行并将 <aws-profile> 替换为要使用的配置文件名称。

  8. 使用您的集群名称作为文件名将该文件保存到默认 kubectl 文件夹。例如,如果集群名称为 <devel>,则将该文件保存到 ~/.kube/config-<devel>

  9. 将该文件路径添加到 KUBECONFIG 环境变量,以便 kubectl 了解在哪里查找集群配置。

    • 对于 macOS 或 Linux 上的 Bash shell:

      export KUBECONFIG=$KUBECONFIG:~/.kube/config-<devel>
    • 对于 Windows 上的 PowerShell:

      $ENV:KUBECONFIG="{0};{1}" -f $ENV:KUBECONFIG, "$ENV:userprofile\.kube\config-<devel>"
  10. (可选) 将配置添加到您的 shell 初始化文件,以便在打开 shell 时对其进行配置。

    • 对于 macOS 上的 Bash shell:

      echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-<devel>' >> ~/.bash_profile
    • 对于 Linux 上的 Bash shell:

      echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-<devel>' >> ~/.bashrc
    • 对于 Windows 上的 PowerShell:

      [System.Environment]::SetEnvironmentVariable('KUBECONFIG', $ENV:KUBECONFIG, 'Machine')
  11. 测试配置。

    kubectl get svc
    注意

    如果您收到任何授权或资源类型错误,请参阅故障排除部分中的未经授权或访问被拒绝 (kubectl)

    输出:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 1m