ちょっと話題の記事

EKS入門者向けに「今こそ振り返るEKSの基礎」というタイトルで登壇しました #jawsug_ct

EKS初心者の方向けに、EKS周辺のAWSリソースがどのように関連して動作しているのかをステップバイステップでEKSCTLが担っている役割を中心に説明しました。
2020.01.27

先日、「EKS祭り」をテーマにJAWS-UGコンテナ支部 #16を開催しました。

JAWS-UGコンテナ支部 #16〜EKS on Fargateローンチ記念!EKS祭りだワッショイ - connpass

EKS縛りというだいぶ濃いイベントの中で、自分はトップバッターで「今こそ振り返るEKSの基礎」と第して喋ってきたのでその内容をまとめます。基礎といえども普段隠れがちなEKSに関連するAWSリソースについてフォーカスを当てたある意味マニアックな内容だと思うので、EKS気になる方は是非ご覧ください。

(祭) ∧ ∧
 Y  ( ゚Д゚)
 Φ[_ソ__y_l〉     EKS タノシイヨ コレマジデ
    |_|_|
    し'´J

この記事の主旨

この記事では登壇当日に口頭で補足した部分や、各種資料へのアクセスをリンクにしてまとめています。スライドだけをみるよりこちらの記事のほうが情報量が多く内容としてもまとまっているため、この記事をベースに見ていただければと思います。

登壇概要:「今こそ振り返るEKSの基礎」

皆さん、EKS始めるときeksctl使ってますか?コマンド一発でAWS関連リソースやインフラ一式できあがる超便利ツールですが、逆に個別のAWSリソースがどのように作成されているか、クラスターに紐づくVPCやNodeにはどのような制約があるのか、IAM周辺がどのように処理されているのか、そのあたり隠蔽されて分かりづらい部分あるんじゃないでしょうか。

このセッションでは、改めてEKS周辺のAWSリソースがどのように関連して動作しているのかを振り返りつつ、今日のEKS祭りのためのベース知識を皆さんと共有できればと思います。

EKSの基礎とは?

まず一番最初にみなさんとEKSの基礎という単語について共有させてください。EKSはざっくりいうとkubernetesのAWSマネージド・サービスですが、EKS=kubernetesではありません。じゃ、EKSの基礎とは何でしょうか?

ここで、自分がKubernetesを始めようと思ったときの流れを紹介します。こんな流れでした。

  1. kubernetes触りたい
  2. どこでやろ。やっぱり慣れてるからAWSつかうか
  3. eksctl。便利。マジで神!
  4. kubectl applyでコンテナできたで!環境できたのでkubernetes本の内容試してみるで!
  5. kubernetesおもろいやん!ワッショイワッショイ

こんなイメージです。

でも、よくよく考えてみてください。eksctlって何やってると思います?

eksctl、みなさんご存知でしょうか。AWS公式のeksクラスター構築コマンドラインツールです。現在はWeaveworks社がホストしています。eksctlの公式ページはこちら。マニュアルなども一式あります。

eksctlの強力さを一番現しているコマンドがこちら。

$ eksctl create cluster

これにより、以下のAWSリソースが作成され、さらにkubeconfigまで自動的に更新されます。

  • EKS ControlPlane
  • VPC, InternetGateway, route table, subnet, EIP, NAT Gateway, security group
  • IAM Role, Policynode group, Worker node(EC2)
  • 〜/.kube/config

これだけのコマンドが、コマンド一発で即kubernetesの世界に足を踏み入れることができるんですね。ただ、これはこれで不安点はあります。

例えばこの状態で、EKS運用ででてくる以下のシチュエーションに対応できるでしょうか?

  • クラスターのアップデート、実際どないしよ
  • クラスター触れる人を増やしたい
  • 既存のクラスターVPCに別のクラスターを接続させたい
  • ノードグループを複数VPCに展開したい
  • NAT Gateway高いからInternetGatewayだけにしたい
  • コントロールプレーンとワーカーノードを別AWSアカウントで管理したい
  • 2AZのVPCを3AZに拡張したい。もちろんノードも使いたい

はい、わからんですよね。ので、今日の趣旨はこちらです。こちらを皆さんに共有していければと思います。

EKSの開始方法は2種類

公式ドキュメントにAmazon EKS の開始方法があるんですが、開始方法は大きく2つあります。

  1. eksctl の開始方法
  2. AWS マネジメントコンソール の開始方法

1は非常に簡単なのですが、今回はeksctlが実際に何をやっているのかを理解することが目的なので、「2 マネジメントコンソールの開始方法」を読みながら、ステップバイステップでポチポチと各AWSリソースを作ることをイメージしながら、解説していきます。

手順は大きく分けて5つ。

  1. Amazon EKSサービスロール作成
  2. EKSクラスターVPCの作成
  3. EKSクラスターの作成
  4. kubeconfigの設定
  5. マネージド型ノードグループの起動

これから、各手順のポイントを説明していきます。ぜひ、お手元で実際にAWS マネジメントコンソール の開始方法を動かしながら、理解を深めてもらえればと思います。

①Amazon EKS サービスロールの作成

一番最初にEKSクラスターが他のAWSリソースに対してアクセスするためのロールを作成する必要があります。必須のAWSマネージドポリシーは2つ。

AmazonEKSServicePolicy

  • EKSがKubernetesクラスタを作成〜運用するためのポリシー
  • 例)クラスターログの転送(logs:PutLogEvents)
  • 例)VPCに作成するENI(ec2:CreateNetworkInterface)

AmazonEKSClusterPolicy

  • KubernetesクラスタのコントロールプレーンがAWSリソースを操作するためのポリシー
  • 例)autoscaling,ec2,elasticloadbalancing

両方とも同じロール内に適用するので、それぞれのポリシーの違いを意識することはあまりないですが、EKSというサービスとkubernetesクラスターをごっちゃにしないためにも、ここの違いを意識しておくことは重要です。イメージとしてはこんな感じです。

下記公式ドキュメントに、それぞれのポリシーの詳細が記載されているので、合わせて参照ください。

また、toriさんによるtwitterリプ合戦も参考になりますYO!

②EKSクラスターVPCの作成

EKSクラスターの作成前に、事前にクラスターで利用するVPCを作成しておく必要があります。EKS CreateCluster APIの必須パラメータは下記3つ。VPCの情報が必要ですね。

  • name:クラスターの名前
  • role-arn:サービスロールのARN
  • resources-vpc-config:クラスターが利用するVPCの情報

というわけで、クラスターVPCを作成する必要があるのですが、このEKSクラスターで利用するVPCにはEKS用の要件が必要です。

この中に全て詳細に定義されているのですが、簡単に必要となる要件をまとめます。これが全て必須ではないですが、代表的なパターンです。

  • 2つ以上のAZ
  • パブリックサブネット:インターネットフェーシングのロードバランサーなどの設置
  • プライベートサブネット:ワーカーノード用
    • アウトバウンドインターネットアクセスが必要→NAT Gateway
  • VPC IP アドレス指定
  • VPCのタグ付要件
  • サブネットのタグ付要件
  • 内部ロードバランサー用のプライベートサブネットタグ付け要件
  • 外部ロードバランサー用のパブリックサブネットタグ付け要件

特にハマリポイントなのが、VPCの各種リソースに設定が必須なタグがあることです。これらのタグは、クラスターVPC作成用のCloudFormationを利用したときに勝手に付与されたりしますが、自分でVPCを作ったりあとからサブネットやAZを拡張したときにハマリポイントとなるので注意が必要です。

実際にVPCを作成するときには、公式のCloudFormationが提供されているので、構造が要件にあっていればそれを使うのも良いでしょう。

③EKSクラスターの作成

いよいよ、実際のEKSクラスターの作成です。ここは、マネジメントコンソールから指定するのがわかりやすいです。主な作成時のパラメーターは以下の通り。

  • 必須
    • Cluster name
    • Kubernetes version
    • Role:前で作成したEKSのサービスロール
    • VPC:前で作成したクラスターVPC
    • Subnets:上で指定したVPCのサブネットが全て表示されているので選択
  • 非必須
    • Endpoint private access
    • Endpoint Public access
    • ログ記録

これにより、以下が実行されます。

作成されるセキュリティグループにも要件があります。基本的に上記手順によりEKSが自動的に必要なセキュリティグループを作成してくれますが、ネットワーク構成を変更したりクラスター管理しないリソース追加時に混乱しないように、以下のドキュメントも目を通しておくと良いです。

EKSコントロールプレーンとVPCの関係

上記手順により、VPCとEKSコントロールプレーンが紐づくのですが、コントロールプレーンとVPCの関係は複数パターンあるので、それを整理するとこうなります。l

真ん中の複数コントロールプレーンから同一のVPCに接続するパターンですが、VPCの中にRDBがいる状態で、クラスターのバージョンアップをB/G方式で実行するときなどに使います。

④kubeconfigの設定

kubeconfigファイルとは、kubernetesを扱うためのCLIであるkubectlコマンドの接続先クラスターを管理する設定ファイルです。これが設定されていないと、先ほど作ったEKSクラスターに接続できません。

ただ、それを一瞬でやってくれるコマンドが存在します。

$ aws eks update-kubeconfig –name cluster-name

これにより、kubeconfigファイルにコンテキストが追加され、また認証情報取得用のコマンドも設定されます。本当に便利です。これ。

~/.kube/config

- context:
    cluster: arn:aws:eks:ap-northeast-1:629895769338:cluster/test-fargate
    user: arn:aws:eks:ap-northeast-1:629895769338:cluster/test-fargate
  name: arn:aws:eks:ap-northeast-1:629895769338:cluster/test-fargate
current-context: arn:aws:eks:ap-northeast-1:629895769338:cluster/handson-eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:ap-northeast-1:629895769338:cluster/test-fargate
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - --region
      - ap-northeast-1
      - eks
      - get-token
      - --cluster-name
      - test-fargate
      command: aws
      env: null

これにより、ようやくkubectlコマンドでクラスターに接続できます。

$ kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   10h

ただ、まだワーカーノード(EC2)はありません。

$ kubectl get nodes
No resources found.

⑤マネージド型ノードグループの起動

ワーカーノード用IAMロールの作成

いよいよ最後の手順、コンテナを動かすためのワーカーノード(EC2)を作っていきます。予めワーカーノードに設定するIAMロールを作成しておきます。このIAMロールには以下のポリシーが含まれます。

  • AmazonEC2ContainerRegistryReadOnly
    • ECR参照用
  • AmazonEKSWorkerNodePolicy
    • ワーカーノードからのEKSクラスターアクセス用
  • AmazonEKS_CNI_Policy
    • VPC CNI Plugin用ポリシー
    • ワーカーノードによるネットワーク設定変更用

この3つ目、CNIプラグインですが、ワーカーノードのVPC IPアドレスをポッドのIPアドレスに割り当てるための機構です。このプラグインによりAWSのネットワークとkubernetesのネットワークが紐づくわけです。あまり意識することは無いかもですが、裏でこのプラグインが動いているということは頭の片隅にいれておいてください。

マネージド型ノードグループの起動

これも、2019年11月のアップデートで非常に簡単になりました。Webコンソール上からポチポチすれば、ワーカーノードがグループとしてクラスターに認識され起動します。主なパラメータは以下の通り。

  • IAMロール
  • ワーカーノード展開対象のサブネット
  • リモートアクセス可否
  • コンピューティング構成設定(AMIタイプ、インスタンスタイプ、ディスクサイズ)
  • スケーリングポリシー

しばらく待って、ノードグループがACTIVEになったら、kubectl get nodeを叩いてみましょう。無事、ノードが認識されたら、めくるめくkubernetesの世界にたどり着いた証です!

$ kubectl get node
NAME                                                 STATUS    ROLES     AGE       VERSION
ip-192-168-148-252.ap-northeast-1.compute.internal   Ready     <none>    6m        v1.14.7-eks-1861c5
ip-192-168-213-27.ap-northeast-1.compute.internal    Ready     <none>    6m        v1.14.7-eks-1861c5

ハマコーオススメのEKS学習マテリアル

最後に、皆さんにオススメの学習マテリアルを紹介します。それがこちら。

Amazon EKS Advent Calendar 2019 - Qiita
Amazon EKS #2 Advent Calendar 2019 - Qiita

2019年12月の奇跡と思ってます。EKSの最新事情や現場でのツラミ、一歩深い知見を得るには最高の記事が凝縮しているので、一度教科書的な部分で知識を蓄えた後は、この記事をみて学ぶのをオススメします。

セッションまとめ

最後に、今日のセッションのまとめです。

  • EKSを長きに渡って運用するには、kubernetesの知識以前に、各AWSリソースがどのように連携して動作しているのか知ることが不可欠
  • 公式マニュアルの「コンソールでの開始」を元にじっくりポチポチ始めてみよう
  • Amazon EKS Advent Calendar 2019は宝の山

今日お集まりのみなさんは、EKSの関わり方や経験は千差万別だと思います。既にガンガンにEKS使っていてその酸いも甘いも知り尽くしている人から、これからEKSを始めようとして情報収集しにこられた方など。ただ、一点共通するのは「EKSに何かしらの思い入れがある」というところですね。

これから、EKSに長く関わっていく方も多いと思いますが、是非そんな方々に向けて自分の今日の発表内容が活きれば幸いです。以上、ご清聴ありがとうございました。

ハマコー登壇後日談

20分弱ぐらいの登壇時間でしたが、自分の伝えたいことは概ね伝えられたのかなと思います。正直自分の準備不足と消化不良の部分が残っている状態の登壇だったので、途中説明を中途半端に端折ったり喋りが上滑り感があったと自己反省しております。

ただ、今セッション内容を改めてまとめながら、このEKSの基礎を理解することのEKS運用における重要性やEKSとkubernetesの位置づけなど再度整理できたので良かったです。

EKSもkubernetesも学習しないといけないこと山のようにありますが、それだけエキサイティングで応用範囲も広い技術だと思うので、これからもこの界隈追っていこうと思います。

それでは、今日はこのへんで。濱田(@hamako9999)でした。