为 Amazon EKS 集群创建或更新 kubeconfig 文件 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

为 Amazon EKS 集群创建或更新 kubeconfig 文件

在本主题中,您将为您的集群创建 kubeconfig 文件(或更新现有文件)。

kubectl 命令行工具使用 kubeconfig 文件中的配置信息与集群的 API 服务器通信。有关更多信息,请参阅 Kubernetes 文档中的使用 kubeconfig 文件组织集群访问权限。本主题提供两种过程,用于为您的 Amazon EKS 集群创建或更新 kubeconfig 文件:

  • 使用 Amazon CLI update-kubeconfig 命令自动创建该文件。

  • 使用 Amazon CLI 或 aws-iam-authenticator 手动创建该文件。

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

aws sts get-caller-identity

先决条件

  • 现有 版 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS

  • 您的设备或 Amazon CloudShell 上安装了 kubectl 命令行工具。该版本可以与集群的 Kubernetes 版本相同,或者最多早于或晚于该版本一个次要版本。例如,如果您的集群版本为 1.22,则可以将 kubectl 版本 1.211.221.23 用于它。要安装或升级 kubectl,请参阅 安装或更新 kubectl

自动创建 kubeconfig 文件

先决条件

  • 您的设备或 Amazon CloudShell 上安装并配置了 2.8.0 版或更高版本,或 1.25.87 版或更高版本的 Amazon CLI。您可以使用 aws --version | cut -d / -f2 | cut -d ' ' -f1 检查您的当前版本。软件包管理器(如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 Amazon CLI 的最新版本落后几个版本。要安装最新版本,请参阅《Amazon Command Line Interface 用户指南》中的安装、更新和卸载 Amazon CLI使用 aws configure 进行快速配置。Amazon CloudShell 中安装的 Amazon CLI 版本也可能比最新版本落后几个版本。要对其进行更新,请参阅《Amazon CloudShell 用户指南》中的将 Amazon CLI 安装到您的主目录

  • eks:DescribeCluster API 操作用于您指定的集群的权限。有关更多信息,请参阅Amazon EKS 基于身份的策略示例

使用 Amazon CLI 创建 kubeconfig

  1. 为集群创建或更新 kubeconfig 文件。将 region-code 替换为您的集群所在的 Amazon Web Services 区域,并将 my-cluster 替换为您的集群的名称。

    aws eks update-kubeconfig --region region-code --name my-cluster

    预设情况下,在主目录的原定设置 kubeconfig 路径 (.kube) 中创建得到的配置文件,或者或与该位置的现有 config 合并。您可以使用 --kubeconfig 选项指定其他路径。

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

    对于所有可用选项,运行 aws eks update-kubeconfig help 命令,或请参阅《Amazon CLI 命令参考》中的 update-kubeconfig

  2. 测试配置。

    kubectl get svc

    输出示例如下。

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

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

手动创建 kubeconfig 文件

手动创建 kubeconfig 文件

  1. 通过将 example values 替换为您自己的值,然后运行修改后的命令来设置几个变量的值。

    export region_code=region-code export cluster_name=my-cluster export account_id=111122223333
  2. 检索集群的端点并将值存储在变量中。

    cluster_endpoint=$(aws eks describe-cluster \ --region $region_code \ --name $cluster_name \ --query "cluster.endpoint" \ --output text)
  3. 检索与集群通信所需的 Base64 编码证书数据,并将值存储在变量中。

    certificate_data=$(aws eks describe-cluster \ --region $region_code \ --name $cluster_name \ --query "cluster.certificateAuthority.data" \ --output text)
  4. 如果默认 ~/.kube 目录尚不存在,请创建它。

    mkdir -p ~/.kube
  5. 为您的首选客户端令牌方法运行以下命令之一(Amazon CLI 或适用于 Kubernetes 的 Amazon IAM 身份验证器),以在 ~/.kube 目录中创建 config 文件。在运行其中一个命令之前,可以通过修改命令以包含以下选项来指定以下内容:

    Amazon CLI

    先决条件

    您的设备或 Amazon CloudShell 上安装并配置了 2.8.0 版或更高版本,或 1.25.87 版或更高版本的 Amazon CLI。您可以使用 aws --version | cut -d / -f2 | cut -d ' ' -f1 检查您的当前版本。软件包管理器(如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 Amazon CLI 的最新版本落后几个版本。要安装最新版本,请参阅《Amazon Command Line Interface 用户指南》中的安装、更新和卸载 Amazon CLI使用 aws configure 进行快速配置。Amazon CloudShell 中安装的 Amazon CLI 版本也可能比最新版本落后几个版本。要对其进行更新,请参阅《Amazon CloudShell 用户指南》中的将 Amazon CLI 安装到您的主目录

    #!/bin/bash read -r -d '' KUBECONFIG <<EOF apiVersion: v1 clusters: - cluster: certificate-authority-data: $certificate_data server: $cluster_endpoint name: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name contexts: - context: cluster: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name user: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name name: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name current-context: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name kind: Config preferences: {} users: - name: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name user: exec: apiVersion: client.authentication.k8s.io/v1beta1 command: aws args: - --region - $region_code - eks - get-token - --cluster-name - $cluster_name # - "- --role" # - "arn:aws:iam::$account_id:role/my-role" # env: # - name: "Amazon_PROFILE" # value: "aws-profile" EOF echo "${KUBECONFIG}" > ~/.kube/config
    Amazon IAM Authenticator for Kubernetes

    先决条件

    版本 0.5.9 或更高版本的适用于 Kubernetes 的 Amazon IAM 身份验证器已安装在您的设备上。要进行安装,请参阅 安装 aws-iam-authenticator

    #!/bin/bash read -r -d '' KUBECONFIG <<EOF apiVersion: v1 clusters: - cluster: server: $cluster_endpoint certificate-authority-data: $certificate_data name: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name contexts: - context: cluster: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name user: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name name: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name current-context: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name kind: Config preferences: {} users: - name: arn:aws:eks:$region_code:$account_id:cluster/$cluster_name user: exec: apiVersion: client.authentication.k8s.io/v1beta1 command: aws-iam-authenticator args: - "token" - "-i" - "$cluster_name" # - "- --role" # - "arn:aws:iam::$account_id:role/my-role" # env: # - name: "Amazon_PROFILE" # value: "aws-profile" EOF echo "${KUBECONFIG}" > ~/.kube/config
  6. 将该文件路径添加到 KUBECONFIG 环境变量,以便 kubectl 了解在哪里查找集群配置。

    • 对于 macOS 或 Linux 上的 Bash shell:

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

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

    • 对于 macOS 上的 Bash shell:

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

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

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

    kubectl get svc

    输出示例如下。

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

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