为 Amazon EKS 创建 kubeconfig - Amazon EKS

为 Amazon EKS 创建 kubeconfig

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

本节提供两个用于创建或更新 kubeconfig 文件的过程。您可以使用 AWS CLI,通过 AWS CLI update-kubeconfig 命令快速自动创建或更新 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 Command Line Interface 用户指南》中的配置 AWS CLI

自动创建 kubeconfig 文件

使用 AWS CLI 创建 kubeconfig

  1. 确保您已安装版本 1.25.462.7.21 或更高版本。要安装或升级 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. 为集群创建或更新 kubeconfig 文件。将 example values 替换为您自己的值。

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

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

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

    注意

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

    aws eks update-kubeconfig --region region-code --name my-cluster
  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. 通过将 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. 为您的首选客户端令牌方法运行命令(AWS CLI 或适用于 Kubernetes 的 AWS IAM 身份验证器)以在 ~/.kube 目录中创建 config 文件。在运行其中一个命令之前,可以通过修改命令以包含以下选项来指定以下内容:

    AWS CLI

    先决条件

    必须在您的设备上安装版本 1.16.156 或更高版本的 AWS 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" # - "arn:aws:iam::$account_id:role/my-role" # env: # - name: "AWS_PROFILE" # value: "aws-profile" EOF echo "${KUBECONFIG}" > ~/.kube/config
    AWS IAM Authenticator for Kubernetes

    先决条件

    必须在您的设备上安装适用于 Kubernetes 的 AWS 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" # - "arn:aws:iam::$account_id:role/my-role" # env: # - name: "AWS_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
    注意

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

    输出示例如下。

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