Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用

EKS简介

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

在AWS上,亚马逊推出了Amazon Elastic Kubernetes Service (Amazon EKS) ,这是一项完全托管的 Kubernetes 服务。

Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第1张图片

创建EKS集群后,EKS会自动创建k8s的master节点,我们只需要添加 worker节点即可,就可以进行连接部署应用了。

在Amazon EKS产品发布之前,要运行具有高可用性的Kubernetes集群,需要专业知识,客户要跨多个可用区(AZ)设置Kubernetes管理基础架构。

Amazon EKS消除了这种复杂性,并交付了可供生产环境使用的架构,该架构可跨多个可用区自动运行Kubernetes管理基础架构,消除单点故障。Amazon EKS自动检测并替换不正常的节点,为管理基础架构打补丁,并且按需执行版本升级。这使得由Amazon EKS管理的Kubernetes基础架构具有弹性,即使丢失整个可用区也能正常运行。

Amazon EKS已通过Kubernetes认证,客户可以使用现有的Kubernetes工具运行其现有Kubernetes应用程序,无需进行任何代码更改。

目前Amazon EKS已在由北京光环新网科技股份有限公司(简称“光环新网”)运营的AWS中国(北京)区域和宁夏西部云数据技术有限公司(简称“西云数据”)运营的AWS中国(宁夏)区域及正式商用。

官方介绍和定价等

官方详细文档

特点和优势

高可用和自动处理可用区规划问题

EKS可跨多个可用区自动运行Kubernetes管理基础架构,消除单点故障。Amazon EKS自动检测并替换不正常的节点,为管理基础架构打补丁,并且按需执行版本升级。这使得由Amazon EKS管理的Kubernetes基础架构具有弹性,即使丢失整个可用区也能正常运行。

Amazon EKS的服务帮助你能够更好的运行托管的Kubernetes的平台。Amazon EKS上,用户可以建立一个横跨三个AZ可用区的kubernetes集群,运行你的master nodes(控制平面),提供高可用的API服务。

三个master nodes上又有不同的etcd 能够做同步,也提供了API的功能,Scheduler的功能,controller的功能,让你横跨三个AZ,稳定的运行。

利用EKS全授管的特性,你只需要自己去搭建你所需要的worker nodes工作群组即可。你不需要自建master nodes,也不再去需要关心master nodes如何解决高可用的问题。

企业级工作负载

EKS是为了更好的运行企业级工作负载而设计的。你可以把最核心的业务运行在AWS上,而不需要关心每日备份、管理等复杂的工作。

与AWS服务无缝集成

EKS 与诸如 Amazon CloudWatch、Auto Scaling 组、AWS Identity and Access Management (IAM) 和 Amazon Virtual Private Cloud (VPC) 之类的服务深度集成,为您带来监控、扩展和负载平衡应用程序的无缝体验。

原生Kubernetes体验

EKS跟上游kubernetes社区保持同步,上游kubernetes的功能完整的继承在Amazon EKS里面,为您提供kubernetes原生体验。所有在EKS里做出的功能和优化,AWS团队都会将这些内容完整的贡献到上游kubernetes社区,成为开源项目的一部分,让所有社区成员都能共享这一功能。

易迁移

所有标准 Kubernetes 环境上运行的应用程序均完全兼容,并可轻松迁移到 Amazon EKS。

适用场景

混合部署:您可以使用 EKS on AWS Outposts 运行对本地系统的延迟要求低的容器化应用程序。

机器学习:您可以结合使用 Kubeflow 与 EKS 来为您的机器学习工作流程建模,并使用最新的采用 EC2 GPU 的实例类型有效地运行分布式培训作业。

批处理:使用 EKS,您可以通过全系列的 AWS 计算服务和功能(如 Amazon EC2、Fargate 和 Spot 实例)计划、安排和执行批量计算工作负载。

Web应用程序:您可以构建自动扩展和缩减并跨多个可用区在高度可用的配置中运行的 Web 应用程序。您的 Web 应用程序在 EKS 上运行,可以从 AWS 的性能、可扩展性、可靠性和可用性中获益。

3月13日消息,AWS 宣布,Amazon Elastic Kubernetes Service(Amazon EKS)现已在由宁夏西部云数据技术有限公司(简称“西云数据”)运营的AWS中国(宁夏)区域及北京光环新网科技股份有限公司(简称“光环新网”)运营的AWS中国(北京)区域正式商用。

据了解,Intel、Snap以及如猎豹移动、晶泰科技、汇量科技、茄子快传等已经在使用Amazon EKS。

EKS 工作原理

http://aws.amazon.bokecc.com/news/show-1092.html?refid=ptrdonadodaws2019van

视频版 https://www.bilibili.com/video/av66611022/

安装和部署EKS的详细步骤

EKS有两种方式可以搭建部署集群,一种是界面化的控制台,一种是使用命令行工具eksctl。

使用命令行工具eksctl安装

eksctl命令行工具安装 原理是:通过 aws cli 调用 CloudFormation 的相关 API,启动一个创建 EKS Cluster 的 Stack 和一个创建 EKS nodes 的 Stack 去创建集群所需的各种资源(包括网关、IP、VPC、EC2 等等)

环境准备

在使用eksctl命令工具安装之前,需要先安装三个相关的工具
1、aws cli命令工具 (如果使用pip命令安装aws cli命令则还需要python环境,或者下载使用压缩包进行安装)
2、eksctl 命令工具
3、kubectl命令工具

python安装

版本要求:>= 2.7.9
用途:安装 aws cli

mac使用homebrew安装
如未安装homebrew,先安装homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

安装完homebrew后 使用命令

brew  install python3

配置环境变量,命令:open .bash_profile 在打开的文件窗口粘贴以下内容:

PATH=/usr/local/Cellar/python/3.6.5/bin:${PATH} 

export PATH

保存关闭文件,就完成整个python3的安装

windows系统参考
windows安装python3.7

linux系统参考
ubuntu16.04安装python3.7

安装完成后使用命令校验版本

python3 -V
pip3 -V

aws cli安装

用途:操作 aws 资源

确保您已安装 AWS CLI 的版本 1.16.156 或更高版本 否则后续部分eks的命令无法使用

使用命令

pip3 install awscli --upgrade --user

安装完成后使用命令检查版本

aws --version

如果老版本的awscli命令导致新版本的无法安装可以先卸载再安装,使用命令如下:

$sudo rm -rf /usr/local/aws
$sudo rm /usr/local/bin/aws
$pip3 install awscli --upgrade --force-reinstall  --user
$export PATH=/Users/joe/Library/Python/3.7/bin/:$PATH

/Users/joe/Library/Python/3.7/bin/与自己的目录对应。

eksctl安装

用途:操作 aws eks 资源

mac系统

如未安装homebrew,先安装homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

使用命令

brew tap weaveworks/tap

brew install weaveworks/tap/eksctl

如果已安装过eksctl,升级eksctl使用命令

brew upgrade eksctl && brew link --overwrite 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

windows系统

需要安装Chocolatey

然后使用命令

chocolatey install -y eksctl 

如果已经安装过eksctl,升级eksctl使用命令

chocolatey upgrade -y eksctl 

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

eksctl version

kubectl安装

版本要求:最新版本或不低于 Kubernetes 版本 1 个小版本号。
用途:操作 Kubernetes 集群

mac系统 使用命令

curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/darwin/amd64/kubectl

chmod +x ./kubectl


sudo mv ./kubectl /usr/local/bin


linux系统 使用命令

curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/linux/amd64/kubectl


chmod +x ./kubectl


sudo mv ./kubectl /usr/local/bin/kubectl

windows系统 使用命令

curl -o kubectl.exe https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/windows/amd64/kubectl.exe

将二进制文件复制到您的 PATH 中的文件夹。如果 PATH 中有现有目录可用于命令行实用程序,请将二进制文件复制到该目录。否则,请完成以下步骤。

为命令行二进制文件创建一个新目录,例如 C:\bin。

将 kubectl.exe 二进制文件复制到新目录中。

编辑用户或系统 PATH 环境变量,将新目录添加到 PATH 中。

关闭 PowerShell 终端并打开一个新的来选取新的 PATH 变量。

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

kubectl version

创建IAM角色和配置AWS CLI凭证–IAM角色

eksctl 和 AWS CLI 均要求您在环境中配置 AWS 凭证。

这个凭证需要在控制台中创建IAM角色后可以获取。

创建IAM角色参考下图:
Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第2张图片

对于一般用途,aws configure 命令是设置 AWS CLI 安装的最快方法。

$ aws configure
AWS Access Key ID [None]: AKIAIOSFOxxxxxx
AWS Secret Access Key [None]: wJalrxxxxxxxxxx
Default region name [None]: region-code
Default output format [None]: json

键入该命令时,AWS CLI 会提示您输入四条信息:access key、secret access key、AWS Region 和 output format。此信息存储在名为 default 的配置文件(一个设置集合)中。除非您指定另一个命令,否则在运行命令时使用此配置文件。

有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的配置 AWS CLI

IAM的权限设置

我们在上一步已经配置了一个IAM的角色 在aws cli的命令行工具中。

默认情况下,这个IAM 用户和角色没有创建或修改 Amazon EKS 资源的权限。它还无法使用 AWS 管理控制台、AWS CLI 或 AWS API 执行任务。IAM 管理员必须创建 IAM 策略,为用户和角色授予权限,以便对他们所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户或组。

等我们设置好权限之后,当我们创建 Amazon EKS 集群时,会在集群的 RBAC 配置中自动为创建集群的 IAM 实体用户或角色(例如,联合身份用户)授予 system:masters 权限。

默认只有这个IAM角色可以与我们创建的EKS集群进行交互,如果我们要授予其他 AWS 用户或角色与您的集群进行交互的能力,必须编辑 Kubernetes 内的 aws-auth ConfigMap。

因为权限策略 最好授予最低权限,才足够安全,所以我们需要知道设置哪些权限可以保证 eks集群能够创建成功,而又没有给多余的权限。
gitlab中已经有用户测试出来了最小的权限设置配置json,我们可以拿来直接使用,json如下:

CloudFormation权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "eksCtlCloudFormation",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": "*"
        }
    ]
}

EKS读写权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "eks:*",
            "Resource": "*"
        }
    ]
}

注意 如果限定资源,中国区的 resource

  "Resource": "arn:aws:eks:*:*:cluster/*"

需要替换为

  "Resource": "arn:aws-cn:eks:*:*:cluster/*"

EC2相关权限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateInternetGateway",
        "ec2:CreateVpc",
        "ec2:Describe*",
		"ec2:createTags",
		"ec2:ModifyVpcAttribute",
		"ec2:ModifySubnetAttribute",
        "ec2:ModifyVpcEndpoint",
        "ec2:ModifyVpcEndpointConnectionNotification",
        "ec2:ModifyVpcEndpointServiceConfiguration",
        "ec2:ModifyVpcEndpointServicePermissions",
        "ec2:ModifyVpcPeeringConnectionOptions",
        "ec2:ModifyVpcTenancy",
        "ec2:AcceptVpcPeeringConnection",
        "ec2:AcceptVpcEndpointConnections",
        "ec2:CreateVpcEndpoint",
        "ec2:CreateVpcEndpointConnectionNotification",
        "ec2:CreateVpcEndpointServiceConfiguration",
        "ec2:DescribeVpcEndpointConnectionNotifications",
        "ec2:DescribeVpcEndpointConnections",
        "ec2:DescribeVpcEndpoints",
        "ec2:DescribeVpcEndpointServiceConfigurations",
        "ec2:DescribeVpcEndpointServicePermissions",
        "ec2:DescribeVpcEndpointServices",
		"ec2:CreateSubnet",
		"ec2:CreateSubnet",
		"ec2:CreateRouteTable",
		"ec2:CreateSecurityGroup",
		"ec2:DeleteSecurityGroup",
		"ec2:AttachInternetGateway",
		"ec2:CreateRoute",
		"ec2:AuthorizeSecurityGroupIngress",
		"ec2:AuthorizeSecurityGroupEgress",
		"ec2:RevokeSecurityGroupEgress",
		"ec2:RevokeSecurityGroupIngress",
		"ec2:AssociateRouteTable",
		"ec2:CreateNatGateway",
		"ec2:AllocateAddress",
		"ec2:DeleteInternetGateway",
		"ec2:DeleteNatGateway",
		"ec2:DeleteRoute",
		"ec2:DeleteRouteTable",
		"ec2:DeleteSubnet",
		"ec2:DeleteTags",
		"ec2:DeleteVpc",
		"ec2:DescribeInternetGateways",
		"ec2:DescribeNatGateways",
		"ec2:DescribeRouteTables",
		"ec2:DescribeSecurityGroups",
		"ec2:DescribeSubnets",
		"ec2:DescribeTags",
		"ec2:DescribeVpcAttribute",
		"ec2:DetachInternetGateway",
		"ec2:DisassociateRouteTable",
		"ec2:RunInstances",
		"ec2:ReleaseAddress"
      ],
      "Resource": "*"
    }
  ]
}

CloudWatch 相关权限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:ListMetrics",
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:Describe*"
      ],
      "Resource": "*"
    }
  ]
}

autoscaling 相关权限

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
				"autoscaling:CreateAutoScalingGroup",
				"autoscaling:DescribeTags",
				"autoscaling:DeleteAutoScalingGroup",
				"autoscaling:DescribeAutoScalingInstances",
				"autoscaling:DeleteLaunchConfiguration",
				"autoscaling:DescribeAutoScalingGroups",
				"autoscaling:DescribeLaunchConfigurations",
				"autoscaling:DescribeScalingActivities",
				"autoscaling:SetDesiredCapacity",
				"ec2:DescribeLaunchTemplateVersions",
				"autoscaling:TerminateInstanceInAutoScalingGroup",
				"autoscaling:UpdateAutoScalingGroup"
			],
          "Resource": "*"
      }
  ]
}

elasticloadbalancing 相关权限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "elasticloadbalancing:Describe*",
      "Resource": "*"
    }
  ]
}

iam 相关权限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "iam:CreateRole",
        "iam:AttachRolePolicy",
		"iam:DetachRolePolicy",
		"iam:GetRole",
		"iam:PassRole",
		"iam:DeleteRole",
		"iam:CreateInstanceProfile",
		"iam:AddRoleToInstanceProfile",
		"iam:DeleteInstanceProfile",
		"iam:RemoveRoleFromInstanceProfile",
		"iam:GetInstanceProfile",
		"iam:PutRolePolicy",
		"iam:DeleteRolePolicy",
		"iam:GetRolePolicy",
		"iam:ListInstanceProfiles",
		"iam:CreateServiceLinkedRole",
		"iam:ListInstanceProfilesForRole",
		"iam:GetOpenIDConnectProvider"
      ],
      "Resource": "*"
    }
  ]
}

LaunchTemplate 相关权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "autoscaling:CreateLaunchConfiguration",
                "ec2:CreateLaunchTemplate",
                "ec2:DeleteLaunchTemplate",
                "ec2:ModifyLaunchTemplate",
                "ec2:DeleteLaunchTemplateVersions",
                "ec2:CreateLaunchTemplateVersion",
                "ec2:GetLaunchTemplateData",
                "ec2:DescribeLaunchTemplates",
                "ec2:DescribeLaunchTemplateVersions"
            ],
            "Resource": [
                "arn:aws-cn:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/*",
                "arn:aws-cn:ec2:*:*:launch-template/*"
            ]
        }
    ]
}

ssm相关权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:*"
            ],
            "Resource": "*"
        }
   ]
}

要了解如何使用这些示例 JSON 策略文档创建 IAM 基于身份的策略,请参阅 IAM 用户指南 中的在 JSON 选项卡上创建策略。

如果已经有公司层面原有的相关策略,可以直接把控制台把策略关联到 创建eks集群使用的IAM中。

如下图:
Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第3张图片

更多iam权限设置相关资料可参考:

Amazon EKS 基于身份的策略示例

iam控制ec2权限以及自动伸缩的原理

安装 aws-iam-authenticator

aws-iam-authenticator是负责使用AWS IAM 证书 来对k8s集群进行 权限认证和沟通交互的服务。

原理如图:
Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第4张图片

aws-iam-authenticator git地址

aws-iam-authenticator安装文档

使用命令

curl -o aws-iam-authenticator https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/darwin/amd64/aws-iam-authenticator


chmod +x ./aws-iam-authenticator

mkdir -p $HOME/bin && cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH


echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

安装完成后可使用命令

// 获取 token
aws-iam-authenticator token -i 

// 查看调用者
aws sts get-caller-identity

可能遇到的问题—bash: /Users/joe/bin/aws-iam-authenticator: cannot execute binary file

这是由于 安装的aws-iam-authenticator 平台版本不对应的原因,请按照官网的最新命令进行安装,详情参考:

aws-iam-authenticator安装文档

命令版本安装更多参考:

命令版本 英文官方文档

命令版本 中文官方文档

命令版本 用户实践

创建集群

使用命令

eksctl create cluster \
--name prod \
--version 1.13 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4 \
--node-ami auto

这里可以指定集群使用的 相关的节点类型和 数量。

如果使用默认命令

eksctl create nodegroup --cluster=yourClusterName --name=yourNodeGroupName --region yourRegionName

默认参数为:

Instance type = m5.large
AMI : lastest AWS EKS AMI
Nodes-desired capacity = 2
Nodes-min capacity =2 
Nodes-max capacity=2

注意:默认情况下,新节点组会继承从控制层安装的 Kubernetes 版本 (–version=auto),当然您也可以指定其他版本的 Kubernetes(例如 version=1.13)。要使用最新版本的 Kubernetes,请运行 –version=latest 命令。

注意:如果选择 P2 或 P3 实例类型和 Amazon EKS 优化的 AMI(具有 GPU 支持),则必须使用以下命令在集群上将适用于 Kubernetes 的 NVIDIA 设备插件用作守护程序集。

kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml

eksctl命令也支持使用配置文件进行集群的创建,方便我们进行复杂的参数配置和留存可视化。

例如 创建集群配置文件eks.yaml内容如下:

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
    name: eksdemo
    region: ap-northeast-1

nodeGroups:
    - name: ng-1
      minSize: 4
      maxSize: 8
      instancesDistribution:
        instanceTypes: ["t3.small", "t3.medium", "t3.large"] 
        onDemandBaseCapacity: 2
        onDemandPercentageAboveBaseCapacity: 0
        spotInstancePools: 2

通过以上配置清单利用 eksctl 就可以在 ap-northeast-1 region 创建一个名为 eksdemo 的 EKS 集群,同时建立起一个名为 ng-1的nodegroup ,当中由多种 instance types 组成,其中 OnDemand 基线(baseline)为 2,意味着保证会有两台 on-demand 实例,而其他的实例则由 ondemand+spot 组成,但由于我们定义了 onDemandPercentageAboveBaseCapacity 为 0, 意味着额外需要的两台实例(minSize-onDemandBaseCapacity)全部由 spot 来满足。关于 Auto Scaling Groups更多参数可以参考该 链接,更多的 cluster YAML 配置示例可以参考 weaveworks 的 github

使用命令创建eks集群如下:

eksctl create cluster  --config-file=yourConfigFileName


eksctl create cluster  --config-file=eks.yaml

使用命令更新eks集群如下:

eksctl create nodegroup --config-file=yourConfigFileName


eksctl create nodegroup --config-file=eks.yaml

创建时输出如下:
Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第5张图片

整个过程大约10到15分钟,如果集群定义复杂可能会更长时间。

当我们遇到报错,可以在CloudFormation界面中查看原因或者使用命令查看原因

eksctl utils describe-stacks --region=cn-northwest-1 --cluster=eks-beta

成功创建输出如下:

[ℹ]  waiting for the control plane availability...
[✔]  saved kubeconfig as "/Users/joe/.kube/config"
[ℹ]  no tasks
[✔]  all EKS cluster resources for "eks-beta" have been created
[ℹ]  adding identity "arn:aws-cn:iam::xxx:role/eksctl-eks-beta-nodegroup-eks-bet-NodeInstanceRole-xxxx" to auth ConfigMap
[ℹ]  nodegroup "eks-beta-workers" has 0 node(s)
[ℹ]  waiting for at least 1 node(s) to become ready in "eks-beta-workers"
[ℹ]  nodegroup "eks-beta-workers" has 2 node(s)
[ℹ]  node "ip-192-168-2-xxx.cn-northwest-1.compute.internal" is not ready
[ℹ]  node "ip-192-168-xx-x.cn-northwest-1.compute.internal" is ready
[ℹ]  kubectl command should work with "/Users/joe/.kube/config", try 'kubectl get nodes'
[✔]  EKS cluster "eks-beta" in "cn-northwest-1" region is ready
zhangxiaofans-MacBook-Pro:Downloads joe$ 

注意 指定ami有可能的导致创建节点超时

[ℹ]  waiting for at least 1 node(s) to become ready in "eks-beta-workers"


Error: timed out (after 25m0s) waiting for at least 1 nodes to join the cluster and become ready in "eks-beta-workers"

需要找到适合ami镜像,我这里使用的是默认镜像。

关于针对eks优化过后的ami镜像可以参考:

宁夏区北京区优化后的ami

根据可用区生产优化后的ami

注意
经 Amazon EKS 优化的加速 AMI 仅支持基于 GPU 和 Inferentia 的实例类型。务必在节点 AWS CloudFormation 模板中指定这些实例类型。使用经 Amazon EKS 优化的加速 AMI,即表明您同意 NVIDIA 的最终用户许可协议 (EULA)。

经 Amazon EKS 优化的加速 AMI 以前称为带 GPU 支持的 Amazon EKS 优化 AMI。

所以我们只选用 针对eks优化过的即可,不需要选 已加速的。

可能遇到的问题–Error: timed out (after 25m0s) waiting for at least 1 nodes to join the cluster and become ready in

在进行到 创建集群的最后步骤时 需要等待节点启动,但是 可能会遇到超时的情况,除了 ami镜像的问题,也可能是我们的configfile里面的配置格式错误导致的。

建议 在编写configfile时参考 eksctl的schema格式。

如果遇到超时的情况, 需要知道详细的原因,步骤如下:
1、在aws的控制台ec2栏目中创建密钥对,如图:
Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第6张图片

创建完毕后 我们会自动下载到一个 pem文件

2、在configfile中配置 允许ssh链接:

kind: ClusterConfig
apiVersion: eksctl.io/v1alpha5
metadata:
    name: eks-beta
    region: cn-northwest-1
    version: "1.17"



nodeGroups:
 - name: nodes
   minSize: 1
   maxSize: 3
   instanceType: c5.large
   taints:
     feaster: "123=:NoSchedule"
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh

3、创建集群
使用命令

eksctl create cluster --config-file=eks.txt

4、当遇到超时或者很久都等不到集群ready状态,可以登录到集群中

首先在ec2的管理界面中找到 eks-beta(cluster name)的node如图
Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第7张图片

找到它的公有dns,例如:

ec2-123-123-159-211.cn-northwest-1.compute.amazonaws.com.cn

使用命令:

sudo chmod 600 key.pem 

ssh -i key.pem ec2-user@IP

例如:

ssh -i key.pem ec2-user@ec2-123-123-159-211.cn-northwest-1.compute.amazonaws.com.cn

ec2-user为固定值

ec2-123-123-159-211.cn-northwest-1.compute.amazonaws.com.cn与 自己的公有dns对应

5、查看/var/log/messages文件,搜索kubelet相关的信息

使用命令

sudo su

cat /var/log/messages |grep "kubelet" | grep "invalid"

输出如下:

[ec2-user@ip-192-168-12-100 ~]$ sudo su
[root@ip-192-168-12-100 ec2-user]# 
[root@ip-192-168-12-100 ec2-user]# 
[root@ip-192-168-12-100 ec2-user]# cat /var/log/messages |grep "kubelet"  | grep "invalid"

Aug 23 12:49:28 ip-192-168-12-100 kubelet: F0823 12:49:28.934605   29289 server.go:156] invalid argument "feaster=proj=:NoSchedule" for "--register-with-taints" flag: invalid taint spec: feaster=proj=:NoSchedule
Aug 23 12:49:34 ip-192-168-12-100 kubelet: F0823 12:49:34.150519   29347 server.go:156] invalid argument "feaster=proj=:NoSchedule" for "--register-with-taints" flag: invalid taint spec: feaster=proj=:NoSchedule
Aug 23 12:49:39 ip-192-168-12-100 kubelet: F0823 12:49:39.434994   29408 server.go:156] invalid argument "feaster=proj=:NoSchedule" for "--register-with-taints" flag: invalid taint spec: feaster=proj=:NoSchedule

说明 taint 属性设置错误

或者使用以下命令查看 最后200行 kubelet相关日志

tail -n 200   /var/log/messages |grep "kubelet"

实例未成功启动的排查

如果我们的实例都没有起来,就已经报错了,需要在CloudFormation中查看相关的错误信息。

如果CloudFormation中没有相关的错误信息,还有一种debug的方法就是 在使用eksctl命令时加上 -v 4 参数,会打印出比较详细的日志,方便排查,使用命令如下:

eksctl create cluster --config-file=eks.txt -v 4

捕捉到的错误信息 例如:

2020-08-26T20:15:49+08:00 [▶]  failed task: 2 sequential sub-tasks: { update cluster VPC endpoint access configuration, create nodegroup "nodes" } (will not run other sequential tasks)
2020-08-26T20:15:49+08:00 [!]  1 error(s) occurred and cluster hasn't been created properly, you may wish to check CloudFormation console
2020-08-26T20:15:49+08:00 [ℹ]  to cleanup resources, run 'eksctl delete cluster --region=cn-northwest-1 --name=eks-beta'
2020-08-26T20:15:49+08:00 [✖]  AccessDeniedException: 
	status code: 403, request id: 12345-2ecd-4cd3-8a07-af8ba20136da
Error: failed to create cluster "eks-beta"
zhangxiaofans-MacBook-Pro:Downloads joe$ 

界面化的控制台安装

参考:
控制台版本 http://lizhe.name/node/375
控制台版本 https://zhuanlan.zhihu.com/p/110791869

节点组规划和管理

我们在上面的步骤已经新建了一个EKS集群名字为 --name prod 。默认已经有一个节点组根据我们的参数创建名为–nodegroup-name standard-workers。

但是实际生产环境中,我们可能需要多个节点组,才能更好的适应不同类型的应用以及降低成本,比如我们需要新建一个常驻的应用组,一个批处理的应用组使用竞价实力spot组。

所以 需要记录一下 如何为 Amazon EKS 集群创建多个节点组。

使用eksctl创建多个节点组

首先查看当前的节点组,使用命令

$ Kubectl get nodes


$ eksctl get nodegroups --cluster yourClusterName //类似于kops get ig

eksctl可以使用配置文件的方式进行 节点组的创建。

例如配置如下:

kind: ClusterConfig
apiVersion: eksctl.io/v1alpha5
metadata:
    name: yourClusterName
    region: yourRegionName
nodeGroups:
 - name: ng1-Workers
   availabilityZones: ["az-name"]
   desiredCapacity: 3
   instanceType: m5.large
    desiredCapacity: 3
    iam:
      instanceProfileARN: "arn:aws:iam::11111:instance-profile/eks-nodes-base-role" #Attaching IAM role
      instanceRoleARN: "arn:aws:iam::1111:role/eks-nodes-base-role"
    privateNetworking: true
    securityGroups:
      withShared: true
      withLocal: true
      attachIDs: ['sg-11111', 'sg-11112']
    ssh:
      publicKeyName: 'my-instance-key'
    kubeletExtraConfig:
        kubeReserved:
            cpu: "300m"
            memory: "300Mi"
            ephemeral-storage: "1Gi"
        kubeReservedCgroup: "/kube-reserved"
        systemReserved:
            cpu: "300m"
            memory: "300Mi"
            ephemeral-storage: "1Gi"
    tags:
      'environment': 'development'
      
 - name: ng-2-builders  #example of a nodegroup that uses 50% spot instances and 50% on demand instances:
   minSize: 2
   maxSize: 5
   instancesDistribution:
     maxPrice: 0.017
     instanceTypes: ["t3.small", "t3.medium"] # At least two instance types should be specified
     onDemandBaseCapacity: 0
     onDemandPercentageAboveBaseCapacity: 50
     spotInstancePools: 2
   tags:
   'environment':'production'

使用命令创建nodegroups

eksctl create nodegroup --config-file= yourConfigFileName

创建好nodegroup后需要把这个nodegroup与现有集群关联起来。需要在控制台中操作。

打开 AWS CloudFormation 控制台,选择与您创建的节点组关联的集群。然后选择事件选项卡,查看显示您的集群已部署的 AWS CloudFormation 事件。

要确认新的工作线程节点组是否已挂载到集群,并验证是否已应用节点组配置,请运行以下命令:

$ Kubectl get nodes

$ eksctl get nodegroups --cluster yourClusterName

您会看到您的工作线程节点已经加入集群。这两个节点组应会通过 eksctl 可见。

使用eks-refarch 模板创建多个节点组

除了使用 eksctl 之外,也可以透过 aws-samples/amazon-eks-refarch-cloudformation 来创建这样的混合集群,amazon-eks-refarch-cloudformation 使用100%的 cloudformation 模版,并且提供丰富的特性。
node labels, taints and tolerations
通过 eks-templates 模版创建的混合集群,会自动将 ondemand 与 spot 实例都打上不同的 node labels,同时也会对 Spot 打上相应的 taints

更多节点组相关的资料:

如何使用 Eksctl 为 Amazon EKS 工作线程节点创建多个节点组

在 eksctl 中管理节点组(删除,扩展,和耗尽)

如何检查、扩展、删除或耗尽 Amazon EKS 中的工作线程节点

使用aws界面化控制台Managed Node Group进行新增节点组

详细步骤参考
通过AWS控制台来创建管理Managed Node Group

启用自动伸缩–部署 cluster-autoscaling (简称 CA)

当我们的eks集群安装成功运行后,我们需要安装cluster autoscaler才能实现节点的自动伸缩管理,cluster autoscaler是k8s用于处理节点自动伸缩的组件,可以参考cluster autoscaler的gitlab。

cluster autoscaler的安装参考
Cluster Autoscaler

部署方式:以deployment方式部署两个CA控制器副本到statefulset节点,放到kube-system命名空间中。

部署之前的准备

因为pod需要和aws的ASG通信,而pod运行在statefulset节点上的,所以需要确保statefulset节点的Role有如下IAM role:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeLaunchConfigurations",
                "autoscaling:DescribeTags",
                "autoscaling:SetDesiredCapacity",
                "autoscaling:TerminateInstanceInAutoScalingGroup",
                "ec2:DescribeLaunchTemplateVersions"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

注意,node节点的iam权限和 用于创建 eks集群的iam权限并不是一摸一样的,而是一个新的iam角色。

这里有两种方式一种是在 创建集群时就已经给集群附加有策略,第二种是等集群创建好后找到 用于部署ca的ec2节点,查看它的iam,然后把策略手动增加上去。

推荐使用方式一,定义集群时附加策略如下:

   iam:
     withAddonPolicies:
       autoScaler: true

节点组的标签设置

Cluster Autoscaler 要求您节点组上具有以下 Auto Scaling 标签,以便能够自动发现它们。

如果您使用上一个 eksctl 命令创建您的节点组,则这些标签会自动应用。如果没有,则必须使用以下标签手动标记您的 Auto Scaling 组。有关详细信息,请参阅 标记您的AmazonEC2资源 在 Amazon EC2 用户指南(适用于 Linux 实例).

Key Value
k8s.io/cluster-autoscaler/ owned
k8s.io/cluster-autoscaler/enabled true

部署

下载yaml到本地 https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml

下载后 重命名为 cluster-autoscale-eks.yaml

注意,yaml中有几个地方需要调整:

1、 - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/

修改为集群名称,例如eks-beta

2、 - --node-group-auto-discovery底下增加

        - --balance-similar-node-groups
        - --skip-nodes-with-system-pods=false
        - --aws-use-static-instance-list=true

3、增加nodeselector,让ca部署在非spot节点

      nodeSelector:
        usage: statefulset
      tolerations:
      - key: statefulset
        effect: NoSchedule

4、将原镜像k8s.gcr.io/autoscaling/cluster-autoscaler:v1.17.3下载到本地后,上传到公司仓库中,镜像地址修改为公司镜像地址

如果 k8s.gcr.io来源的镜像下载不下来,可以在dockerhub中查找第三方上传的镜像https://hub.docker.com/search?q=cluster-autoscaler&type=image

当前目录 clust er-autoscale-eks.yaml 存放的是修改好可以直接部署的yaml,这个yaml的作用:

  • 通过tolerations和nodeSelector让pod部署到statefulset节点上

  • 使用 node-group-auto-discovery 参数,让GA自动去找ASG的信息,避免硬编码

  • cluster-autoscaler 使用我们上传到自己的ECR里面的镜像,避免 k8s.gcr.io 上的镜像拉取失败

    执行

    kubectl apply -f cluster-autoscale-eks.yaml --validate=false

    使用以下命令将 cluster-autoscaler.kubernetes.io/safe-to-evict 注释添加到部署。

    kubectl -n kube-system annotate deployment.apps/cluster-autoscaler cluster-autoscaler.kubernetes.io/safe-to-evict="false"

    然后等待Pod运行起来之后,看下Pod的日志是否报错。

查看 Cluster Autoscaler 日志

部署 Cluster Autoscaler 之后,您可以查看日志并验证它在监控您的集群负载。

使用以下命令查看您的 Cluster Autoscaler 日志。

kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler

正常情况下,从pod调度到集群发现没资源满足pod的需求,到申请到新机器加入到集群并且分配给pod跑起来的时间为 5min

更多自动伸缩相关的资料 参考:

Auto Scaling

eksctl apply cluster changes after create

ca部署可能遇到的问题–Failed to generate AWS EC2 Instance Types: unable to load EC2 Instance Type list

详细报错如下:

I0903 08:47:22.088466       1 aws_util.go:68] fetching https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/cn-northwest-1/index.json
W0903 08:47:37.090556       1 aws_util.go:71] Error fetching https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/cn-northwest-1/index.json skipping...
F0903 08:47:37.090583       1 aws_cloud_provider.go:363] Failed to generate AWS EC2 Instance Types: unable to load EC2 Instance Type list

原因 中国区的node无法访问价格api

解决方案

需要在ca的yaml增加属性aws-use-static-instance-list=true

  • –node-group-auto-discovery底下增加
        - --aws-use-static-instance-list=true

详情参考

Cluster Autoscaler 1.15.6 AWS has problem with start in region cn-northwest-1

ca部署可能遇到的问题–Failed to create AWS Manager: cannot autodiscover ASGs: RequestError: send request failed

详细报错如下:

E0903 08:54:19.220007       1 aws_manager.go:261] Failed to regenerate ASG cache: cannot autodiscover ASGs: RequestError: send request failed
caused by: Post https://autoscaling.cn-northwest-1.amazonaws.com.cn/: dial tcp: lookup autoscaling.cn-northwest-1.amazonaws.com.cn on 172.20.0.10:53: read udp 10.30.24.178:48706->172.20.0.10:53: read: connection refused
F0903 08:54:19.220028       1 aws_cloud_provider.go:376] Failed to create AWS Manager: cannot autodiscover ASGs: RequestError: send request failed
caused by: Post https://autoscaling.cn-northwest-1.amazonaws.com.cn/: dial tcp: lookup autoscaling.cn-northwest-1.amazonaws.com.cn on 172.20.0.10:53: read udp 10.30.24.178:48706->172.20.0.10:53: read: connection refused

原因 网络问题或者dns问题

解决方案

检查网络设置和安全组 以及 保证 ca所在的node有访问公网的能力,以及 k8s的dns功能正常运行。

使用命令检查dns

kubectl get pods -n kube-system |grep dns

安装部署eks注意事项

参考:https://blog.csdn.net/Nicolege678/article/details/83147019

使用第三方框架Terraform进行eks安装

除了使用官方的安装方案和控制台界面进行安装,还可以使用第三方工具进行安装

参考资料:

Deploy Kubernetes in an Existing AWS VPC with Kops and Terraform

github terraform-aws-eks

使用eks集群

创建kubeconfig

aws eks 本地创建与更新kubeconfig方法

创建kubeconfig的前提是已经安装好eks集群,同时满足以下几个条件。

1、本机配置了aws 的iam key
2、已经安装aws-iam-aws-iam-authenticator
3、已经安装aws cli命令行工具
4、已经安装kubectl命令行工具

执行创建或更新 kubeconfig的命令 :

aws eks --region  区域 update-kubeconfig --name 集群名

测试是否创建kubeconfig成功使用以下命令进行测试

kubectl get nodes

创建成功的kubeconfig默认保存在本机的 ~/.kube/config 路径。可以复制进行分发给其他同事使用。

需要注意的是 同事的所在用的iam的aws key用户需要添加到k8s的 config auth map中。

使用命令如下:

kubectl edit -n kube-system configmap/aws-auth --validate=false

新增用户和权限在mapUser中如下:

  mapUsers: |
    - userarn: arn:aws-cn:iam::123:user/zzq
      username: zzq
      groups:
        - system:masters

创建与更新kubeconfig更多参考资料:
https://segmentfault.com/a/1190000017315098
https://zhuanlan.zhihu.com/p/126486177
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/add-user-role.html
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/create-kubeconfig.html
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/troubleshooting.html#unauthorized

查看集群状况

// 查看节点状态
kubectl get nodes
// 查看服务状态
kubectl get svc
// 查看事件
kubectl get events --all-namespaces

部署Dashboard

使用命令

// 将 Kubernetes 控制面板部署到集群
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

// 部署 heapster 以在集群上启用容器集群监控和性能分析
kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml


// 将 heapster 的 influxdb 后端部署到集群
kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml



// 为控制面板创建 heapster 集群角色绑定
kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml

创建文件eks-admin-service-account.yaml
使用命令

vi eks-admin-service-account.yaml

填入内容

apiVersion: v1
kind: ServiceAccount
metadata:
  name: eks-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: eks-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: eks-admin
  namespace: kube-system

使用命令

// 将此服务账户和集群角色绑定应用到您的集群
kubectl apply -f eks-admin-service-account.yaml



// 检索 eks-admin 服务账户的身份验证令牌。从输出中复制  值。您可以使用此令牌连接到控制面板
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')



// 将所有请求从您的 Amazon EC2 实例本地主机端口转发到 Kubernetes 控制面板端口
kubectl port-forward svc/kubernetes-dashboard -n kube-system 6443:443



// 从带 SSH 隧道的本地计算机访问端口
ssh -i EC2KeyPair.pem ec2-user@IP -L 6443:127.0.0.1:6443

访问 https://127.0.0.1:6443 输入 Token 即可访问 Dashboard

优化–确保节点上的Pod 能被及时重新调度到其他节点上运行

部署 eks-lambda-drainer

Spot 实例当面临资源回收,强迫被关机的时候,系统会提前两分钟收到通知,我们可以借由 CloudWatch Event 捕捉到这个通知信息出发一个外部调度的 Lambda function 对这个节点进行 node draining。eks-lambda-drainer 可以帮助我们部署一个完全 serverless 独立于 Kubernetes 集群之外的无服务器时间响应 handler,并且监听整个 VPC 内的 Spot实例关机信号,一旦提前两分钟获得关机信号就会对这个节点进行 kubectl drain 操作,确保节点上的Pod 能被及时重新调度到其他节点上运行。

关于 eks-lambda-drainer 的部署方式,可以参考这个 Github

参考资料: EKS 与 EC2 Spot 最佳实践

删除eks集群

使用命令

eksctl delete cluster --region= --name=

常用运维eksctl命令

#  创建新节点组--修正yaml文件,新增一个节点组

eksctl create nodegroup -f eks-beta.yaml

# 删除节点组---修改yaml文件,删除掉需要去掉的节点组

eksctl delete nodegroup -f eks-beta.yaml  --only-missing

然后 

eksctl delete nodegroup -f eks-beta.yaml  --only-missing --aprove

#  注意 eksctl 的update和upgrade 命令更新 组和集群的参数只针对 managed 类型的nodegroup生效,如果是自管理节点的nodegroup需要 先 新建 新的nodegroup,再删除老的nodegroup 实现 节点组的自动平滑迁移。

附录–复杂的集群定义yaml

kind: ClusterConfig
apiVersion: eksctl.io/v1alpha5
metadata:
    name: eks-beta
    region: cn-northwest-1
    version: "1.17"




vpc:
  id: "vpc-123"
  clusterEndpoints:
    publicAccess: true
    privateAccess: true
  cidr: "10.30.0.0/16"       
  subnets:
    private:
      cn-northwest-1a:
        id: "subnet-123"
        cidr: "10.30.0.0/20" 

      cn-northwest-1b:
        id: "subnet-123"
        cidr: "10.30.16.0/20"  

      cn-northwest-1c:
        id: "subnet-123"
        cidr: "10.30.32.0/20"




nodeGroups:
 - name: nodes
   minSize: 1
   maxSize: 10
   instanceType: c5.large
   privateNetworking: true
   availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
   VolumeSize: 40
   taints:
     proj: ":NoSchedule"
   labels: {"cluster": "v2.test.eks.local"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh




 - name: statefulset-cn-northwest-1a
   minSize: 1
   maxSize: 2
   instanceType: r5.large
   privateNetworking: true
   availabilityZones: ["cn-northwest-1a"]
   VolumeSize: 40
   taints:
     statefulset: ":NoSchedule"
   labels: {"cluster": "v2.test.eks.local","usage":"statefulset"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh
   iam:
     withAddonPolicies:
       autoScaler: true


 - name: statefulset-cn-northwest-1b
   minSize: 1
   maxSize: 2
   instanceType: r5.large
   privateNetworking: true
   availabilityZones: ["cn-northwest-1b"]
   VolumeSize: 40
   taints:
     statefulset: ":NoSchedule"
   labels: {"cluster": "v2.test.eks.local","usage":"statefulset"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh
   iam:
     withAddonPolicies:
       autoScaler: true


 - name: statefulset-cn-northwest-1c
   minSize: 1
   maxSize: 2
   instanceType: r5.large
   privateNetworking: true
   availabilityZones: ["cn-northwest-1c"]
   VolumeSize: 40
   taints:
     statefulset: ":NoSchedule"
   labels: {"cluster": "v2.test.eks.local","usage":"statefulset"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh
   iam:
     withAddonPolicies:
       autoScaler: true




 - name: jhub
   minSize: 0
   maxSize: 2
   instanceType: c5.2xlarge
   privateNetworking: true
   availabilityZones: ["cn-northwest-1c"]
   VolumeSize: 40
   taints:
     jhub: ":NoSchedule"
   labels: {"cluster": "v2.test.eks.local","usage":"jhub"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh


 - name: gitlab
   minSize: 0
   maxSize: 1
   instanceType: t2.medium
   privateNetworking: true
   availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
   VolumeSize: 40
   taints:
     gitlab: ":NoSchedule"
   labels: {"cluster": "v2.test.eks.local","usage":"gitlab"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh

 - name: c59xlarge-spot
   minSize: 0
   maxSize: 10
   privateNetworking: true
   availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
   VolumeSize: 40
   labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"c59xlarge-spot"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh
   instancesDistribution:
     maxPrice: 3.5
     instanceTypes: ["c5.9xlarge"]
     onDemandBaseCapacity: 0
     onDemandPercentageAboveBaseCapacity: 0
     spotInstancePools: 2

 - name: c518xlarge-spot
   minSize: 0
   maxSize: 10
   privateNetworking: true
   availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
   VolumeSize: 40
   labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"c518xlarge-spot"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh
   instancesDistribution:
     maxPrice: 7.0
     instanceTypes: ["c5.18xlarge"]
     onDemandBaseCapacity: 0
     onDemandPercentageAboveBaseCapacity: 0
     spotInstancePools: 2

 - name: r48xlarge-spot
   minSize: 0
   maxSize: 10
   privateNetworking: true
   availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
   VolumeSize: 40
   labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"r48xlarge-spot"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh
   instancesDistribution:
     maxPrice: 4
     instanceTypes: ["r4.8xlarge"]
     onDemandBaseCapacity: 0
     onDemandPercentageAboveBaseCapacity: 0
     spotInstancePools: 2
   



 - name: c54xlarge-spot
   minSize: 0
   maxSize: 10
   privateNetworking: true
   availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
   VolumeSize: 40
   labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"c54xlarge-spot","usage":"gene-relation"}
   tags:
     k8s.io/cluster-autoscaler/enabled: "true"
     k8s.io/cluster-autoscaler/eks-beta: "owned"
   ssh: 
     allow: true
     publicKeyName: eks-ssh
   instancesDistribution:
     maxPrice: 2
     instanceTypes: ["c5.4xlarge"]
     onDemandBaseCapacity: 0
     onDemandPercentageAboveBaseCapacity: 0
     spotInstancePools: 2



这里的iam的proflie以及role与控制台中的角色对应

Kubernetes--k8s---进阶--AWS托管式容器服务EKS--EKS全面介绍和安装使用_第8张图片

你可能感兴趣的:(云存储云计算,eks,aws,k8s,安装,使用)