いまさらAmazon EKSを使ってみる (普通のk8sとの違いなど )


今更ながら、k8sは使ってるがAmazon EKSはちゃんと使ったことないので気になったポイントまとめ
※2021年1月時点

[1] Amazon EKSとは

  • AWSが提供するマネージドKubernetesサービス(2018 GA)
  • Masterにあたるコントロールプレーン(etcd含む)がサーバレス的に提供され、Worker部分は統合されたEC2(NodeGroup)Fargateでクラスタを構成する
  • re:Invent 2020にてEKS Anywhereという新サービスが発表され、オンプレミス環境のKubernetesの管理拡張も可能になる予定(GCPのAnthos的な感じ)

Kubernetesバージョンについて

可用性/耐障害性とSLAについて

価格について

  • 基本はクラスタごとに毎時課金 0.10USDと、ワーカーノード(EC2 or Fargate)の利用料
  • その他暗号化のKMSやCloudWatch、S3、ECR(コンテナレジストリ)利用料など関連サービスを利用した料金

Amazon EKS利用のメリット

  • マネージドかつHA構成のコントロールプレーン(etcd含む)が容易に構築できる
  • WorkerノードのAuto Scalingが利用できる(PodではなくNodeレベルのCluster Autoscaler
  • 使った分だけの従量課金
  • 認証認可をKubernetesのRBACAWS IAMを統合できる(AWSユーザ向けの利点)
  • その他のAWSサービスとの統合(例:KMS、Cloud Watch、EFS、などなど)

[2] クラスタ構築関連

実際にクラスタを作成する際に気になったポイント
※所感としてはGKEより複雑な印象

クラスタ作成手段

  • クラスタ作成方法は3種類の方法がある
    • ①AWSコンソールからGUIポチポチ
    • ②AWS標準CLIツール「aws cli」を利用
    • ③公式のEKSクラスタ構築用CLIツール「eksctl」を利用

eksctlとは?

https://eksctl.io/
  • 標準的なAWSサービスはAWSコンソールかaws cliで操作するが、EKSのk8sクラスタ構築は煩雑なためか、EKS k8sクラスタ作成用のCLIが別途提供されている
  • 普通にコンソールからEKS k8sクラスタを作成する場合、Master要素(コントロールプレーン)の他にもVPC/Subnet/SGやIAM、Workerノードの作成など多くの操作手順が必要だが、eksctlはコマンド1つでそれらを自動的に生成し、クラスタ構築してくれる
  • もともとWeaveworks社がGo言語ベースで開発し、OSSとして公開されている
  • 裏でCloud Formationが連携していて、各種必要なAWSリソース生成を行っている
  • GCP GKEでいうとgcloudコマンド相当

eksctlインストール

$ 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

eksctlでEKS k8sクラスタ作成

  • 極論でいえば、eksctl create clusterコマンドだけで作成できる
  • 実際は色々なオプションを付ける
  • eksctl create cluster --helpでオプションは参照可能

クラスタ作成例)

eksctl create cluster  \
  --name=test-cluster \      #クラスタ名
  --region=ap-northeast-1 \  #リージョン
  --version=1.18 \           #バージョン
  --node-type=t3.medium \    #Workerインスタンスタイプ
  --nodes=2 \                #Workerノード数
  --nodes-min=2 \            #Workerオートスケール最小
  --nodes-max=2 \            #Workerオートスケール最大
  --node-volume-size=20      #Workerディスクサイズ

※参考:2020/12にリリースされたAWS CloudShellから、kubectlとeksctlをセットアップすればクラスタ作成(CLIコマンド実行)がすぐに試せます
https://aws.amazon.com/jp/blogs/news/aws-cloudshell-command-line-access-to-aws-resources/

  • eksctlで上記コマンドで自動生成された主なAWSリソース
    • Cloud Formationスタック(KSクラスタとWorker(NodeGroup)の2つ)
    • EKSクラスタ
    • VPC 
    • サブネット
    • SG
    • InternetGWとNAT-GW
    • IAM ROLE
    • EC2(NodeGroup)
    • etc.

eksctlでEKS k8sクラスタ削除

eksctl delete cluster --name クラスタ名

Kubernetesバージョン

  • k8sバージョンは2021/1時点でアップストリーム最新版は1.20だが、EKSでは1.18

アーキテクチャ

  • 基本的に①パブリック、②プライベート、③パブリック&プライベート の3パターンがある
  • Master(コントロールプレーン)~Worker間は、サブネット内のENIを経由する(ENIは自動生成される)
  • Master(コントロールプレーン)のAPIエンドポイントは、パブリックかプライベートか選択できる
  • 下記は標準的なパブリック&プライベートの例


https://aws.amazon.com/jp/blogs/news/de-mystifying-cluster-networking-for-amazon-eks-worker-nodes/

  • VPC

    • クラスタ全体では基本2つ
        1. Master/コントロールプレーンは「Amazon EKS管理VPC」と呼ばれるユーザが意識しない領域に作成される(サーバーレス)
        1. Workerノードは指定したVPCに作成できる
  • サブネット

    • Workerノード用に2つ以上のアベイラビリティーゾーンでサブネット作成が必要
    • パターンは3つ
      • パブリックのみ
      • プライベートのみ
      • パブリックとプライベートの併用(上の図)
  • SG

  • IAM ROLE

CNIプラグイン

ワーカーノードのイメージ

  • EC2 起動テンプレートが利用でき、ベースイメージ(AMI)やインスタンスタイプなどを規定できる

コンテナイメージの利用

  • ECRを利用する場合は、ワーカーノードのIAM ROLEにECR利用のための以下の権限を付与しておく必要あり
    • "ecr:BatchCheckLayerAvailability"
    • "ecr:BatchGetImage"
    • "ecr:GetDownloadUrlForLayer"
    • "ecr:GetAuthorizationToken"

[3] クラスタ接続設定

###1. kubectlインストール

例)

curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.18.9/2020-11-02/bin/linux/amd64/kubectl

chmod +x ./kubectl

mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin

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

###2. kubeconfigファイルの更新

例)

aws eks --region リージョン update-kubeconfig --name クラスタ名

[4] おまけ

モニタリング

EKSコンソール上からのワークロードのモニタリングができる