AWS EKSクラスタを簡単に構築できるeksctlに、「ノードグループ」機能を追加しようとしている話

这篇文章是2018年Kubernetes Advent Calendar第21天的文章。

简而言之者;

eksctl是什么?

这是由Weaveworks开发的一款开源软件,它是一个使用golang编写的命令行工具,可以创建、扩展和删除AWS EKS集群及其运行环境(VPC、子网、安全组、IAM角色等)和节点组。

EKSクラスタやその他のリソースは内部的にはCloudFormationスタックによって作成・管理されています。クラスタ(=マスタとVPCなどのインフラ)に1スタック、そしてノードグループ用に1スタックが作られます。

节点组是什么?

英語だとNode groupまたはNodegroupと書きます。正式な定義は見つけられなかった、というか、ツールやサービスによって呼び名が異なる(例えばGKEやkube-awsではnode poolと呼んでいる)のですが、「同じnode labels, taints, マシンスペック(machine-type, instance type)を持つノードの集まり」を意味します。

AWSの場合、例えばバッチジョブ用にCPUリソースの潤沢なC4系インスタンスタイプから構成されるノードグループと、Webアプリケーション用にメモリの潤沢なM4系インスタンスタイプから構成するノードグループを分けて、Node LabelsやTaint/TolerationでPodを希望のノードグループに振り分けたりして使います。

eksctl的节点组是固定为一个。

実はeksctlのノードグループは1つで固定でした。これだと、例えばマルチテナントにして、Kubernetes上で稼働っせるサービス毎にマシンスペックを変える、セキュリティ上の都合であるサービス2つを同じノードに同居させないようにする、などの要件が件並み満たせなくなります。

从技术角度来看,理论上可以通过类似CloudFormation的方式将节点组添加到由eksctl创建的集群中,但是操作步骤会变得繁琐。

根据我的经验,很少有只需要一个节点组的情况,所以我想在需要之前就先添加一个节点组,我立即进行了贡献。

这就是以下的公关声明。

複数Nodegroup対応のeksctlを試す

この記事を公開した時点ではまだマージされていないため、以下の手順で自分でeksctlをビルドする必要があります。

$ git clone git@github.com:mumoshu/eksctl.git ~/go/src/github.com/weaveworks/eksctl
$ cd $_
$ git checkout -b nodegroup-resource origin/nodegroup-resource
$ make build

ビルドが無事成功したら、プロジェクトルート直下に eksctl という実行可能ファイルが生成されているので、それを実行してください。

创建集群

首先,可以像以前那样使用”create cluster”命令来创建集群和第一个节点组。

$ ./eksctl create cluster --name testcluster

你可以使用 get cluster 命令来查看集群列表,使用 get nodegroup –cluster 命令来查看节点组列表。

$ ./eksctl get cluster
NAME        REGION
test-cluster    us-west-2

$ ./eksctl get nodegroup --cluster testcluster
CLUSTER     NODEGROUP   CREATED         MIN SIZE    MAX SIZE    DESIRED CAPACITY    INSTANCE TYPE   IMAGE ID
testcluster ng-0        2018-12-21T00:26:40Z    2       2       2           m5.large    ami-094fa4044a2a3cf52

创建节点组

$ ./eksctl create nodegroup --cluster testcluster --node-labels foo=bar ng-1 

通过这个操作,初始节点组ng-0 将被添加,并创建一个名为ng-1的节点组。
你可以像平常一样使用kubectl get no命令来确认所创建的节点组中所属的节点。

如果get no出现错误,可能是kubeconfig的内容出现了某种原因而不正确,因此请按照以下方式更新当前选定的kubeconfig(由KUBECONFIG环境变量指示)。

$ ./eksctl utils write-kubeconfig --cluster testcluster

※今回作成したノードグループに所属するノードには foo=bar というラベルが付与されるように、 –node-labels フラグを使用しました。ノードグループのデフォルトサイズは 2 なので、以下のように kubectl get no を実行すると、全4台のうち今回作成したノードグループに所属する2つのノードのみ、指定したラベル foo=bar がついています。

$ kubectl get no --show-labels
NAME                                                STATUS    ROLES     AGE       VERSION   LABELS
ip-192-168-31-112.ap-northeast-1.compute.internal   Ready     <none>    8m        v1.11.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=m5.large,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-northeast-1,failure-domain.beta.kubernetes.io/zone=ap-northeast-1c,foo=bar,kubernetes.io/hostname=ip-192-168-31-112.ap-northeast-1.compute.internal
ip-192-168-5-50.ap-northeast-1.compute.internal     Ready     <none>    31s       v1.11.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=m5.large,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-northeast-1,failure-domain.beta.kubernetes.io/zone=ap-northeast-1c,kubernetes.io/hostname=ip-192-168-5-50.ap-northeast-1.compute.internal
ip-192-168-58-165.ap-northeast-1.compute.internal   Ready     <none>    8m        v1.11.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=m5.large,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-northeast-1,failure-domain.beta.kubernetes.io/zone=ap-northeast-1d,foo=bar,kubernetes.io/hostname=ip-192-168-58-165.ap-northeast-1.compute.internal
ip-192-168-74-189.ap-northeast-1.compute.internal   Ready     <none>    34s       v1.11.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=m5.large,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-northeast-1,failure-domain.beta.kubernetes.io/zone=ap-northeast-1a,kubernetes.io/hostname=ip-192-168-74-189.ap-northeast-1.compute.internal

get nodegroup を実行すると、今回追加したものも含めて、すべてのノードグループの情報を得ることができます。

$ ./eksctl get nodegroup --cluster testcluster
CLUSTER     NODEGROUP   CREATED         MIN SIZE    MAX SIZE    DESIRED CAPACITY    INSTANCE TYPE   IMAGE ID
testcluster ng-0        2018-12-21T00:26:40Z    2       2       2           m5.large    ami-094fa4044a2a3cf52
testcluster ng-1        2018-12-21T00:38:40Z    2       2       2           m5.large    ami-094fa4044a2a3cf52

ノードグループのスケール

调整节点组大小(添加或删除节点)需要使用scale命令。

–cluster クラスタ名 のようにフラグでクラスタ名を指定し、–nodesでノードサイズを指定します。

$ ./eksctl scale nodegroup --cluster testcluster --nodes 1 ng-1`

删除节点组

与规模一样,删除节点组需要通过以下命令指定集群名和节点组名:scale nodegroup –cluster 集群名 –nodegroup 节点组名。

$ ./eksctl delete nodegroup --cluster testcluster ng-1

まとめ

使用eksctl,可以构建一个可以承受生产环境的EKS集群,而无需编写庞大的terraform tf文件或CloudFormation堆栈模板。

如果我们顺利地合并,我在这次提交的公关中,将会添加一个特别强调在多租户环境中必不可少的节点组功能,允许同时拥有多个节点组。

具有多个节点组的功能是一种常见功能,已经在Kops、kube-aws、GKE等现有的Kubernetes集群配置工具以及除AWS之外的托管服务中得到支持。

通过在eksctl中添加类似的功能,可以在EKS上采用适合多租户的节点配置,就像以前一样。

如果您能试用并给予反馈,那将令我非常高兴!

广告
将在 10 秒后关闭
bannerAds