使用EKS轻松在AWS上设置Kubernetes集群

时间:2020-02-23 14:30:22  来源:igfitidea点击:

毫无疑问,Kubernetes是最先进和采用的容器编排平台,可为生产环境中的数百万个应用程序提供支持。对于大多数新的Linux和Kubernetes用户而言,一大挑战是建立集群。尽管我们有许多关于Kubernetes集群安装和配置的教程,但这是我们关于使用Amazon EKS在AWS云环境中设置Kubernetes集群的第一本教程。

对于不熟悉Amazon EKS的用户,它是一项托管服务,使我们可以轻松地在AWS上运行Kubernetes,而无需安装,操作和维护自己的Kubernetes控制平面或者节点。它跨多个可用区运行Kubernetes控制平面实例,以确保高可用性。由于Amazon EKS与Community版本的Kubernetes完全兼容,因此我们可以轻松地将任何标准Kubernetes应用程序迁移到Amazon EKS,而无需进行任何代码修改。

Amazon EKS通过自动检测和替换不正常的控制平面实例,消除了围绕高可用性的麻烦。在自动化版本中执行升级也变得容易。 Amazon EKS与许多AWS服务集成在一起,以为应用程序提供可扩展性和安全性,其中包括:

用于容器镜像的Amazon ECR用于负载分配的弹性负载平衡用于身份验证的IAM适用于隔离的Amazon VPC

如何使用EKS在AWS上部署Kubernetes集群

下一节将更深入地介绍如何使用Amazon EKS托管服务在AWS上安装Kubernetes集群。设置图如下图所示。

安装和配置AWS CLI工具

我们需要安装AWS CLI工具,因为我们的安装将基于命令行。这是在本地工作站计算机上完成的。我们的安装适用于Linux和macOS。

--- Install AWS CLI on macOS --
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

--- Install AWS CLI on Linux --
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

然后,可以使用以下命令确定已安装的AWS CLI的版本。

$aws --version
aws-cli/2.0.38 Python/3.7.3 Linux/4.18.0-193.6.3.el8_2.x86_64 exe/x86_64.centos.8

配置AWS CLI凭证

安装后,我们需要配置我们的AWS CLI凭证。很好地使用aws configure命令设置AWS CLI安装以供一般使用。

$aws configure
AWS Access Key ID [None]: <ENTER-YOUR-ACCESS-KEY-ID>
AWS Secret Access Key [None]: <ENTER-YOUR-ACCESS-KEY>
Default region name [None]: <REGION-CODE>
Default output format [None]: json

AWS CLI详细信息将保存在~/.aws目录中:

$ls ~/.aws
config
credentials

在Linux上安装eksctl苹果系统

eksctl是用于在AWS上创建EKS集群的简单CLI工具。该工具使用Go语言编写,并使用CloudFormation。使用此工具,我们可以在数分钟内拥有一个正在运行的群集。

在撰写本文时,它具有以下功能:创建,获取,列出和删除群集创建,耗尽和删除节点组扩展节点组更新群集使用自定义AMI配置VPC网络配置对API端点的访问权限支持GPU节点组点实例和混合实例IAM管理和添加策略列表群集Cloudformation堆栈安装coredns为集群写入kubeconfig文件

使用以下命令在Linux或者macOS机器上安装eksctl工具。

--- Linux --
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

--- macOS --
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl
brew upgrade eksctl && brew link --overwrite eksctl # When upgrading

使用以下命令测试安装是否成功。

$eksctl version
0.25.0

启用Shell完成:

--- Bash --
echo ". <(eksctl completion bash)" >> ~/.bashrc

--- Zsh --
mkdir -p ~/.zsh/completion/
eksctl completion zsh > ~/.zsh/completion/_eksctl
# and put the following in ~/.zshrc:
fpath=($fpath ~/.zsh/completion)

# Note if you're not running a distribution like oh-my-zsh you Jan first have to enable autocompletion:
autoload -U compinit
compinit

在Linux上安装和配置kubectl |苹果系统

kubectl命令行工具用于从命令行界面控制Kubernetes集群。通过在终端中运行以下命令来安装该工具。

--- Linux --
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2017-07-08/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin

--- macOS --
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2017-07-08/bin/darwin/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin

安装kubectl之后,可以使用以下命令验证其版本:

$kubectl version --short --client
Client Version: v1.17.7-eks-bffbac

kubectl工具在$HOME/.kube目录中查找名为config的文件。我们还可以通过设置KUBECONFIG环境变量或者设置kubeconfig标志来指定其他kubeconfig文件。

创建Amazon EKS集群并计算

通过所有依赖项设置,我们现在可以创建带有计算选项的Amazon EKS集群,以运行我们的微服务应用程序。很好地执行Amazon EKS中提供的最新Kubernetes版本的安装,以便我们可以利用最新的EKS功能。

我们可以选择使用一个计算选项创建集群,然后在创建集群后添加其他任何选项。我们可以使用两种标准的计算选项。AWS Fargate:创建一个仅在AWS Fargate上运行Linux应用程序的集群。我们只能在某些区域将AWS Fargate与Amazon EKS结合使用受管节点:如果要在Amazon EC2实例上运行Linux应用程序。

在此设置中,可以很好地安装运行Kubernetes 1.17版并使用Managed EC2计算节点的EKS群集。这些是我的群集详细信息:地区:爱尔兰(eu-west-1)群集名称:cs-dev-eks-cluster版本:1.17查看所有可用的EKS版本节点类型:t3.medium查看所有可用的AWS节点类型总节点数(对于静态ASG):2个ASG中的最大节点:3个ASG中的最小节点:1个用于节点的SSH公钥(从本地路径导入,或者使用现有的EC2密钥对):~/.ssh/eks.pub使节点组网络私有让eksctl管理群集凭据在~/.kube/eksctl/clusters目录下,

eksctl create cluster \
--version 1.17 \
--name prod-eks-cluster \
--region eu-west-1 \
--nodegroup-name eks-ec2-linux-nodes \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 3 \
--ssh-access \
--ssh-public-key ~/.ssh/eks.pub \
--managed \
--auto-kubeconfig \
--node-private-networking \
--verbose 3

我们也可以使用配置文件代替标志来创建集群。阅读配置模式文档,了解如何创建配置文件。

$vim eks-cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: prod-eks-cluster
  region: eu-west-1
  version: 1.17

managedNodeGroups:
  - name: eks-ec2-linux-nodes
    instanceType: t3.medium
    desiredCapacity: 2
    minSize: 1
    maxSize: 3
    volumeSize: 80
    ssh:
      allow: true # will use ~/.ssh/id_rsa.pub as the default ssh key
      publicKeyPath: ~/.ssh/eks.pub
    privateNetworking: true

$eksctl create cluster -f eks-cluster.yaml

eksctl安装程序将为我们自动创建和配置VPC,Internet网关,nat网关和路由表。

子网:

请耐心等待,因为安装可能需要一些时间。

[ℹ]  eksctl version 0.25.0
[ℹ]  using region eu-west-1
[ℹ]  setting availability zones to [eu-west-1a eu-west-1c eu-west-1b]
[ℹ]  subnets for eu-west-1a - public:192.168.0.0/19 private:192.168.96.0/19
[ℹ]  subnets for eu-west-1c - public:192.168.32.0/19 private:192.168.128.0/19
[ℹ]  subnets for eu-west-1b - public:192.168.64.0/19 private:192.168.160.0/19
[ℹ]  using SSH public key "/Users/jkmutai/.cheat/.ssh/eks.pub" as "eksctl-prod-eks-cluster-nodegroup-eks-ec2-linux-nodes-52:ad:b5:4f:a6:01:10:b6:c1:6b:ba:eb:5a:fb:0c:b2"
[ℹ]  using Kubernetes version 1.17
[ℹ]  creating EKS cluster "prod-eks-cluster" in "eu-west-1" region with managed nodes
[ℹ]  will create 2 separate CloudFormation stacks for cluster itself and the initial managed nodegroup
[ℹ]  if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=eu-west-1 --cluster=prod-eks-cluster'
[ℹ]  CloudWatch logging will not be enabled for cluster "prod-eks-cluster" in "eu-west-1"
[ℹ]  you can enable it with 'eksctl utils update-cluster-logging --region=eu-west-1 --cluster=prod-eks-cluster'
[ℹ]  Kubernetes API endpoint access will use default of {publicAccess=true, privateAccess=false} for cluster "prod-eks-cluster" in "eu-west-1"
[ℹ]  2 sequential tasks: { create cluster control plane "prod-eks-cluster", 2 sequential sub-tasks: { no tasks, create managed nodegroup "eks-ec2-linux-nodes" } }
[ℹ]  building cluster stack "eksctl-prod-eks-cluster-cluster"
[ℹ]  deploying stack "eksctl-prod-eks-cluster-cluster"
[ℹ]  building managed nodegroup stack "eksctl-prod-eks-cluster-nodegroup-eks-ec2-linux-nodes"
[ℹ]  deploying stack "eksctl-prod-eks-cluster-nodegroup-eks-ec2-linux-nodes"
[ℹ]  waiting for the control plane availability...
[✔]  saved kubeconfig as "/Users/jkmutai/.kube/eksctl/clusters/prod-eks-cluster"
[ℹ]  no tasks
[✔]  all EKS cluster resources for "prod-eks-cluster" have been created
[ℹ]  nodegroup "eks-ec2-linux-nodes" has 4 node(s)
[ℹ]  node "ip-192-168-21-191.eu-west-1.compute.internal" is ready
[ℹ]  node "ip-192-168-35-129.eu-west-1.compute.internal" is ready
[ℹ]  node "ip-192-168-49-234.eu-west-1.compute.internal" is ready
[ℹ]  node "ip-192-168-78-146.eu-west-1.compute.internal" is ready
[ℹ]  waiting for at least 1 node(s) to become ready in "eks-ec2-linux-nodes"
[ℹ]  nodegroup "eks-ec2-linux-nodes" has 4 node(s)
[ℹ]  node "ip-192-168-21-191.eu-west-1.compute.internal" is ready
[ℹ]  node "ip-192-168-35-129.eu-west-1.compute.internal" is ready
[ℹ]  node "ip-192-168-49-234.eu-west-1.compute.internal" is ready
[ℹ]  node "ip-192-168-78-146.eu-west-1.compute.internal" is ready
[ℹ]  kubectl command should work with "/Users/jkmutai/.kube/eksctl/clusters/prod-eks-cluster", try 'kubectl --kubeconfig=/Users/jkmutai/.kube/eksctl/clusters/prod-eks-cluster get nodes'
[✔]  EKS cluster "prod-eks-cluster" in "eu-west-1" region is ready

要列出可用的群集,请使用以下命令:

$eksctl get cluster
NAME			REGION
prod-eks-cluster	eu-west-1

使用生成的kubeconfig文件确认安装是否成功。

$kubectl --kubeconfig=/Users/jkmutai/.kube/eksctl/clusters/prod-eks-cluster get nodes
NAME                                           STATUS   ROLES    AGE   VERSION
ip-192-168-21-191.eu-west-1.compute.internal   Ready    <none>   18m   v1.17.9-eks-4c6976
ip-192-168-35-129.eu-west-1.compute.internal   Ready    <none>   14m   v1.17.9-eks-4c6976
ip-192-168-78-146.eu-west-1.compute.internal   Ready    <none>   14m   v1.17.9-eks-4c6976

$kubectl --kubeconfig=/Users/jkmutai/.kube/eksctl/clusters/prod-eks-cluster get pods -A
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   aws-node-254fk             1/1     Running   0          19m
kube-system   aws-node-nmjwd             1/1     Running   0          14m
kube-system   aws-node-z47mq             1/1     Running   0          15m
kube-system   coredns-6987776bbd-8s5ct   1/1     Running   0          14m
kube-system   coredns-6987776bbd-bn5js   1/1     Running   0          14m
kube-system   kube-proxy-79bcs           1/1     Running   0          14m
kube-system   kube-proxy-bpznt           1/1     Running   0          15m
kube-system   kube-proxy-xchxs           1/1     Running   0          19m

获取有关已使用节点组的信息:

$eksctl get nodegroup --cluster prod-eks-cluster
CLUSTER			NODEGROUP		CREATED			MIN SIZE	MAX SIZE	DESIRED CAPACITY	INSTANCE TYPE	IMAGE ID
prod-eks-cluster	eks-ec2-linux-nodes	2017-08-11T19:21:46Z	1		4		3			t3.medium

列出创建的堆栈:

$eksctl utils describe-stacks  --cluster prod-eks-cluster

要随时从通过eksctl部署的EKS群集中获取群集凭据,请运行:

$eksctl utils write-kubeconfig --cluster=<name> [--kubeconfig=<path>][--set-kubeconfig-context=<bool>]

从现有的VPC创建集群:

使用现有的现有VPC时,请创建一个类似于以下所示的配置文件。

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: prod-eks-cluster
  region: eu-west-1
  version: "1.17"

cloudWatch:
  clusterLogging:
    enableTypes: ["*"]

vpc:
  clusterEndpoints:
    publicAccess: false # True if you want to enable
    privateAccess: true
  subnets:
    private:
      eu-west-1a: { id: subnet-03b817aa79a015507 }
      eu-west-1b: { id: subnet-099fb0be9b96334d7 }

managedNodeGroups:
  - name: node-group-01
    labels: { role: workers }
    instanceType: t3.medium
    privateNetworking: true
    desiredCapacity: 2
    minSize: 1
    maxSize: 3
    volumeSize: 80
    ssh:
      allow: true # will use ~/.ssh/id_rsa.pub as the default ssh key
      publicKeyPath: ~/.ssh/eks.pub

安装Kubernetes Metrics Server

Kubernetes Metrics Server是Kubernetes内置自动缩放管道的可扩展,高效的容器资源指标来源。关于如何在EKS Kubernetes群集中安装Metrics Server,我们有单独的教程。

在Amazon EKS集群上安装Kubernetes Metrics Server

启用控制平面日志记录(可选)

Amazon EKS控制平面日志记录直接从Amazon EKS控制平面向我们帐户中的CloudWatch Logs提供审计和诊断日志,从而轻松保护和运行集群。

请按照下面的教程进行设置。

在EKS Kubernetes集群中启用CloudWatch日志记录

配置CloudWatch Container见解(可选)

请按照以下教程在EKS群集中配置Container Insights。

在EKS上安装CloudWatch Container Insights | Kubernetes

使用EFS的永久存储(可选)

如果我们有状态的应用程序并需要使用PV进行持久存储,请查看以下教程。

使用EFS存储服务的EKS Kubernetes持久存储

步骤9:授予用户对EKS群集的访问权限

请遵循以下链接中的教程。

向开发人员授予对EKS Kubernetes集群的访问权限

0:启用群集自动缩放器

我们提供了有关配置群集自动缩放器的完整教程。

在EKS Kubernetes群集中启用群集自动缩放器

删除EKS集群

如果群集中有与负载均衡器关联的活动服务,则必须在删除群集之前删除这些服务。这样就可以正确删除负载均衡器,并且最终不会在VPC中留下孤立的资源,从而使我们无法删除VPC。

列出集群中运行的所有服务:

$kubectl get svc -A
NAMESPACE     NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default       kubernetes       ClusterIP   10.100.0.1      <none>        443/TCP         33h
kube-system   kube-dns         ClusterIP   10.100.0.10     <none>        53/UDP,53/TCP   33h
kube-system   metrics-server   ClusterIP   10.100.221.28   <none>        443/TCP         18h

删除所有具有相关" EXTERNAL-IP"值的服务。这些服务位于Elastic Load Balancing负载平衡器的前面,我们必须在Kubernetes中将其删除,以正确释放负载平衡器和关联的资源。

kubectl delete svc service-name

然后,我们可以删除具有关联节点的集群,并用正确的集群区域替换eu-west-1并使用集群名称替换prod-eks-cluster。

$eksctl delete cluster --region=eu-west-1 --name=prod-eks-cluster

删除过程的输出类似于以下所示。

[ℹ]  eksctl version 0.25.0
[ℹ]  using region eu-west-1
[ℹ]  deleting EKS cluster "prod-eks-cluster"
[ℹ]  deleted 0 Fargate profile(s)
[ℹ]  cleaning up AWS load balancers created by Kubernetes objects of Kind Service or Ingress
[ℹ]  2 sequential tasks: { delete nodegroup "eks-ec2-linux-nodes", delete cluster control plane "prod-eks-cluster" [async] }
[ℹ]  will delete stack "eksctl-prod-eks-cluster-nodegroup-eks-ec2-linux-nodes"
[ℹ]  waiting for stack "eksctl-prod-eks-cluster-nodegroup-eks-ec2-linux-nodes" to get deleted
[ℹ]  will delete stack "eksctl-prod-eks-cluster-cluster"
[✔]  all cluster resources were deleted