使用EKS轻松在AWS上设置Kubernetes集群
毫无疑问,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