使用 kubectl 或 eksctl 连接到现有 EKS 集群

Connecting to existing EKS cluster using kubectl or eksctl

我已经在EKS 上创建了一个kubernetes 集群。我使用 eksctl create cluster 来创建集群。我可以访问所有很棒的东西。

但是,我的同事创建了另一个集群,我想知道如何生成/获取 Kubeconfigs,以便我可以指向我同事创建的集群。

仅访问私有 API 服务器

如果您已禁用 public 访问集群的 Kubernetes API 服务器端点,则只能从 VPC 或 connected network 中访问 API 服务器。以下是访问 Kubernetes API 服务器端点的几种可能方法:

  • 已连接网络 – 使用AWS transit gateway or other connectivity选项将您的网络连接到VPC,然后使用已连接网络中的计算机。您必须确保您的 Amazon EKS 控制平面安全组包含允许来自连接网络的端口 443 上的入口流量的规则。

  • Amazon EC2 堡垒主机 – 您可以在集群 VPC 的 public 子网中启动 Amazon EC2 实例,然后通过 SSH 登录进入该实例以 运行 kubectl 命令。有关详细信息,请参阅 Linux bastion hosts on AWS. You must ensure that your Amazon EKS control plane security group contains rules to allow ingress traffic on port 443 from your bastion host. For more information, see Amazon EKS security group considerations

    当您为堡垒主机配置 kubectl 时,请务必使用已映射到集群 RBAC 配置的 AWS 凭证,或者将您的堡垒将使用的 IAM 用户或角色添加到 RBAC 配置在删除端点 public 访问权限之前。有关详细信息,请参阅 Managing users or IAM roles for your cluster and Unauthorized or access denied (kubectl).

  • AWS Cloud9 IDE – AWS Cloud9 是一个基于云的集成开发环境 (IDE),可让您编写, 运行,并仅使用浏览器调试您的代码。您可以在集群的 VPC 中创建一个 AWS Cloud9 IDE 并使用 IDE 与您的集群进行通信。有关详细信息,请参阅 Creating an environment in AWS Cloud9. You must ensure that your Amazon EKS control plane security group contains rules to allow ingress traffic on port 443 from your IDE security group. For more information, see Amazon EKS security group considerations

    当您为您的 AWS Cloud9 IDE 配置 kubectl 时,请务必使用已映射到集群 RBAC 配置的 AWS 凭证,或添加您的 IDE 将在您删除端点 public 访问权限之前用于 RBAC 配置。有关详细信息,请参阅 Managing users or IAM roles for your cluster and Unauthorized or access denied (kubectl)。 看这里:eks-endpoints-access.

通过多个集群隔离

一种可能的替代方法是使用多个单租户 Amazon EKS 集群。通过这种策略,每个租户都可以在共享的 AWS 账户中使用自己的 Kubernetes 集群,或者在大型企业的组织内使用专用账户。 部署集群后,您可能希望了解所有已部署集群的概况以监控每个租户,确保我们 运行 使用最新版本的 EKS 控制平面并大规模运行。 Rancher 是一种流行的开源工具,用于管理多个 Kubernetes 集群,请务必查看 this article on the Open Source blog 以了解有关如何部署和使用它的详细信息。

同一个VPC中的集群

如果你同事的集群在同一个VPC I advice you to use AWS App Mesh。 App Mesh 是一种服务网格,可让您控制和监控跨部署在同一 VPC 中的两个集群的服务。

架构:

先决条件

为顺利进行基地部署:

  • 确保安装了最新的 AWS CLI,即 1.16.268 或更高版本。
  • 确保有 kubectl installed,至少版本 1.11 或以上。
  • 确保 jq installed.
  • 确保有 aws-iam-authenticator installed,eksctl
  • 需要
  • 安装 eksctl,例如,在带有 brew tap weaveworks/tapbrew install weaveworks/tap/eksctl 的 macOS 上,并确保它至少在 0.1.26.
  • 版本上

请注意,本演练假定始终在 us-east-1 区域中运行。

假设两个集群都在工作并且

根据eksctl输出分别更新每个集群上的KUBECONFIG环境变量:
运行 各个选项卡中的以下内容。

export KUBECONFIG=~/.kube/eksctl/clusters/first-cluster 

export KUBECONFIG=~/.kube/eksctl/clusters/second-cluster

您现在已经设置了两个集群并将 kubectl 指向各自的集群。

现在是时候部署 App Mesh 自定义组件了

要在 pod 创建时自动注入 App Mesh 组件和代理,您需要在集群上创建一些自定义资源。为此使用 helm。在 两个集群上安装 tiller,然后使用 helm 运行 在两个集群上执行以下命令。

下载 App Mesh 存储库

>> git clone https://github.com/aws/aws-app-mesh-examples (https://github.com/aws/aws-app-mesh-examples).git
>> cd aws-app-mesh-examples/walkthroughs/howto-k8s-cross-cluster

安装 Helm

>>brew install kubernetes-helm

安装舵机

使用 helm 需要在集群上安装一个名为 tiller 的服务器端组件。按照 documentation 中的说明在两个集群上安装 tiller。

验证舵机安装

>>kubectl get po -n kube-system | grep -i tiller
tiller-deploy-6d65d78679-whwzn 1/1 Running 0 5h35m

安装 App Mesh 组件

运行 以下一组命令用于安装 App Mesh 控制器和注入器组件。

helm repo add eks https://aws.github.io/eks-charts
kubectl create ns appmesh-system
kubectl apply -f https://raw.githubusercontent.com/aws/eks-charts/master/stable/appmesh-controller/crds/crds.yaml
helm upgrade -i appmesh-controller eks/appmesh-controller --namespace appmesh-system
helm upgrade -i appmesh-inject eks/appmesh-inject --namespace appmesh-system --set mesh.create=true --set mesh.name=global

您现在可以将示例 front 和 colorapp 应用程序与 App Mesh 一起部署到各自的集群,这将跨越两个集群。

部署服务和网格结构

  1. 您应该在 walkthrough/howto-k8s-cross-cluster 文件夹中,所有命令都将从该位置 运行。

  2. 您的账号:

export AWS_ACCOUNT_ID=<your_account_id>
  1. 区域,例如 us-east-1
export AWS_DEFAULT_REGION=us-east-1
  1. ENVOY_IMAGE 环境变量设置为 App Mesh Envoy,参见 Envoy
export ENVOY_IMAGE=...
  1. VPC_ID 环境变量设置为启动 Kubernetes pods 的 VPC。 VPC将用于设置
    AWS 中的私有 DNS 命名空间使用 create-private-dns-namespace API。查询EKS集群的VPC,可以
    使用 aws eks describe-cluster。请参阅下文了解需要 AWS Cloud Map PrivateDnsNamespace 的原因。
export VPC_ID=...
  1. 用于导出 kube 配置的 CLUSTER 环境变量
export CLUSTER1=first-cluster
export CLUSTER2=second-cluster

部署

./deploy.sh

最后记得验证部署。 您可以在此处找到更多信息:app-mesh-eks.

您可以为集群获取有权访问集群的aws IAM访问密钥和id,并设置两个aws配置文件并使用以下命令访问集群:

aws eks update-kubeconfig --name cluster-name --profile aws-profilename

以上命令将在 kubeconfig 文件中添加访问详细信息,并设置当前上下文。 之后你可以使用 kubectl 命令切换上下文:

kubectl 配置使用上下文 arn-nameofeks-cluster

先决条件:

  • 已安装 aws-cli
  • 已安装 kubectl

您可以通过两种方式获取 kubeconfig。

  1. aws eks update-kubeconfig --name <clustername> --region <region>
  2. eksctl utils write-kubeconfig --cluster=<clustername>

前提是您在同一帐户上拥有 EKS 并且对您可见。

获得 kubeconfig 后,如果您有访问权限,则可以开始使用 kubectl。

如果您没有访问权限,则需要请求所有者将您的用户 ID 授予集群的权限。

列出了完整的详细信息here