ちょっと話題の記事

【まずは触って体験】リリース直後のAmazon EKSでサンプルアプリケーションを動かしてみた

待望のGAが発表されたAmazon EKSのチュートリアルを早速実施してみました。Kubernetes未経験の人でも特に難易度高くなく体験できるのでオススメです。
2018.06.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンテナオーケストレーションのデファクトスタンダード、Production-Grade Container Orchestration - KubernetesのAWSマネージド実装である、Amazon EKSがついに、GA(一般リリース)の運びとなりました!

Amazon Elastic Container Service for Kubernetes (EKS) が一般公開 (GA) されました!

早速、WEBコンソールとともにGetting Startedドキュメントが公開されていたので、まずは触ってみた様子をお届けいたします。

自分、dockerやECSは最近触ってますが、Kubernetesは一切触ったことありません(ドヤ)。なんですが、チュートリアルにそって作業していけば、ほぼつまるところなしに、Kubernetesのクラスターやワーカーノードの作成、サンプルアプリケーションのデプロイができました。

Kubernetes未経験の方でも、このチュートリアルでEKSのコンポーネントとやクラスターの設定方法などが一通り体験できるので、ぜひ一度手を動かしてみることをオススメします。

 __
(祭) ∧ ∧
 Y  ( ゚Д゚)
 Φ[_ソ__y_l〉     EKSダワッショイ
    |_|_|
    し'´J

Amazon EKSとは?

What Is Amazon EKS? - Amazon EKS

Amazon Elastic Container Service for Kubernetes(以下、Amazon EKS)は、Kubernetesのマネージド実装で、AWS上でKubernetes control planeの管理を必要としません。Kubernetesには、自動デプロイ、スケーリング、コンテナ管理のアプリケーションも含まれています。

Amazon EKSはAZをまたいだ高可用性システムの提供、unhealthyなcontrol planeの自動置換、自動アップグレード機能などを持ちます。

Amazon EKSは最新版のオープンソースKubernetes上で動作し、Kubernetesコミュニティの全てのツールを利用することができます。Amazon EKSで可動するアプリケーションは、他のKubernetes環境でも完全に動作可能で、例えばオンプレミスデータセンターでも、他のパブリッククラウド上でもOK。これは、他のKubernetes環境からAmazon EKSへアプリケーション改修なしで移行可能ということです!

チュートリアルの手順

こちらのドキュメントを元に進めていきます。

Getting Started with Amazon EKS - Amazon EKS

手順の大まかな流れは以下の通り

  1. マネジメントコンソールでのEKSクラスターの作成
  2. CloudFormationによるworker nodeの起動
  3. Kubernetesツールの導入(例:kubectl)
  4. クラスターへのアプリケーションの導入

ほな、気軽にいってみましょ。

チュートリアルの前提条件

EKSやその他コンポーネントにアクセスするのに必要なIAMを用意しておきましょう。今回の検証ではAdministratorAccess権限をもつユーザーを利用しています。また、2018年6月6日現在、Amazon EKSは、以下のリージョンのみ対応しているので、リージョンはこれらを利用ください。

  • US West (Oregon) (us-west-2)
  • US East (N. Virginia) (us-east-1)

クラスター環境用VPCの作成

最初にクラスター環境用VPCを作成していきます。

CloudFormationの画面に移動し、EKS対応リージョン(今回はバージニア北部)を選択します。

スタック作成から、S3テンプレートのURLを指定し、以下のURLを入力します。

https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-vpc-sample.yaml

スタック名にeks-vpcを設定。その他は特にこだわりなければ、デフォルトで。

オプションは特に指定せずに、スタック作成し、完了したら「出力」タブを確認。下記3つの値はあとで必要となるので、メモっておきます。

  • SecurityGroups
  • VpcId
  • SubnetIds

Amazon EKS用kubectlのインストールと設定

Amazon EKS クラスターには、kubectlとkubeletバイナリと、IAM認証のためのHeptio Authenticatorが必要となります。

Amazon EKSのためのkubectlのインストール

クライアントOSにkubectlをインストールします。Amazon EKS-vendedのkubectlバイナリは、S3からダウンロードします。自分はMacなので、MacOS用のバイナリをダウンロード。本手順はMac用の物となっておりますので、別OSをご利用の方は、元のドキュメントを参照ください。

$curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/kubectl

実行権限を付与します。

$chmod +x ./kubectl

kubectlのバイナリを$PATHが通るディレクトリに格納します(このパスが推奨らしいです)。

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

必要に応じて、シェル起動時にパスを通します。

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

ターミナルに再ログインして、PATHとバージョンの確認をしておきましょう。

$kubectl version --short --client
Client Version: v1.10.3

Amazon EKS用heptio-autenticator-awsのインストール

Mac用バイナリのダウンロード。

$curl -o heptio-authenticator-aws https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/heptio-authenticator-aws

実行権限付与。

$chmod +x ./heptio-authenticator-aws

PATHの通ったディレクトリへの格納。

$cp ./heptio-authenticator-aws $HOME/bin/heptio-authenticator-aws && export PATH=$HOME/bin:$PATH

こちらもターミナルに再ログインしてPATHの確認とヘルプを表示しておきましょう。

$ heptio-authenticator-aws help
A tool to authenticate to Kubernetes using AWS IAM credentials

Usage:
  heptio-authenticator-aws [command]

Available Commands:
  help        Help about any command
  init        Pre-generate certificate, private key, and kubeconfig files for the server.
  server      Run a webhook validation server suitable that validates tokens using AWS IAM
  token       Authenticate using AWS IAM and get token for Kubernetes
  verify      Verify a token for debugging purpose

Flags:
  -i, --cluster-id ID     Specify the cluster ID, a unique-per-cluster identifier for your heptio-authenticator-aws installation.
  -c, --config filename   Load configuration from filename
  -h, --help              help for heptio-authenticator-aws

Use "heptio-authenticator-aws [command] --help" for more information about a command.

EKSクラスターの作成

ここまでで、クライアント側の設定が完了したら、いよいよEKSクラスターを作成していきます。まずは、EKSコンソールにアクセス

https://console.aws.amazon.com/eks/home#/clusters

クラスターを作成します。

以下設定していきます。

  • Cluster name:sample-eks-cluster
  • Kubernets version:デフォルトで入力したもの
  • Role ARN:Create your Amazon EKS Service Roleを参考に作成したRoleを設定
  • VPC:先述したCloudFormationで作成したVPCを設定
  • Subnet:上でVPCを選択すると、自動的に入力
  • Security Groups:CloudFormationでスタック作成後に出力されたSecurity Groupを設定

作成ボタンを押すと、クラスターの作成が開始されます。

しばらく待つと(10分ほど)、ステータスがActiveになり、クラスターの詳細情報を確認できます。

kubectlの設定

クラスターのためのkubeconfigファイルを設定していきます。最初にkubectl格納に必要なディレクトリを作成します。

$mkdir -p ~/.kube

下記テンプレートを参考に、先程AWSコンソールで作成した情報を埋めていきます。

  • endpoint-url
  • base64-encoded-ca-cert
  • cluster-name
  • role-arn
apiVersion: v1
clusters:
- cluster:
    server: <endpoint-url>
    certificate-authority-data: <base64-encoded-ca-cert>
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: aws
  name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: heptio-authenticator-aws
      args:
        - "token"
        - "-i"
        - "<cluster-name>"
        # - "-r"
        # - "<role-arn>"

ファイル名はconfig-<cluster-name>として、上で作成した~/.kubeフォルダに格納します。

作成したファイルへのパスをKUBECONFIG環境変数に登録します。

$export KUBECONFIG=$KUBECONFIG:~/.kube/config-<cluster-name>

起動時に環境変数を読み込むように設定します。

echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-<cluster-name>' >> ~/.bash_profile

設定ファイルのテストをして、無事クラスター情報が返ってきましたでしょうか?

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

EKSワーカーノードの起動

ここまででEKSクラスターの設定が完了しました。ここではEKSのワーカーノードを作成します。ワーカーノード起動のためのCloudFormationを利用します。

Webコンソールからスタックの作成で、下記S3URLを指定。

https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-nodegroup.yaml

パラメータを設定していきます。

  • Stack name:<cluster-name>-worker-nodes
  • ClusterName:作成したクラスターの名前
  • ClusterControlPlaneSecurityGroup:CloudFormationで作成したセキュリティグループ
  • NodeGroupName:<cluster-name>-worker-nodes
  • NodeAutoScalingGroupMinSize:スケーリンググループの最小数。デフォルトの1を設定
  • NodeAutoScalingGroupMaxSize:スケーリンググループの最大数。デフォルトの3を設定
  • NodeInstanceType:デフォルトのt2.medium
  • NodeImageId:EKSワーカーノードで利用するAMIIDの指定
  • US West (Oregon) (us-west-2):ami-73a6e20b
  • US East (N. Virginia) (us-east-1):ami-dea4d5a1
  • KeyName:EC2アクセス用のキーペア。SSHアクセスが必要であれば、別途作成しておき、ここで入力
  • VpcId:CloudFormationで作成したVPCのID
  • Subnets: CloudFormationで作成したSubnet

任意のオプションを指定し、スタックの作成を実行します。これもそれなりの時間かかります。えんやこらー。

イベントが全て完了したら、出力タブのNodeInstanceRoleのarnをメモって置きましょう!

クラスターのワーカーノードへの有効化

AWS認証用設定ファイルをダウンロードして、修正します。

curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/aws-auth-cm.yaml

ファイルを開いて、中のARN部分を、先程CloudFormationで設定したワーカーノードのARNを設定します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: <ARN of instance role (not instance profile)>
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

設定ファイルをクラスターに適用します。

$ kubectl apply -f aws-auth-cm.yaml
configmap "aws-auth" created

クラスターの状態を確認します。きちんと状態が取得できていますでしょうか?

$ kubectl get nodes --watch
NAME                              STATUS    ROLES     AGE       VERSION
ip-192-168-137-228.ec2.internal   Ready     <none>    1m        v1.10.3
ip-192-168-199-36.ec2.internal    Ready     <none>    1m        v1.10.3
ip-192-168-77-28.ec2.internal     Ready     <none>    1m        v1.10.3
ip-192-168-137-228.ec2.internal   Ready     <none>    1m        v1.10.3
ip-192-168-199-36.ec2.internal   Ready     <none>    1m        v1.10.3
ip-192-168-77-28.ec2.internal   Ready     <none>    1m        v1.10.3

ここまで来たら、あともうひと踏ん張りやで。

サンプルアプリケーションの起動

サンプルアプリケーションをクラスターに導入し、起動します。全部で6回流すので、順次実行していきます。

$kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-controller.json
replicationcontroller "redis-master" created

$kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-service.json
service "redis-master" created

$kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-controller.json
replicationcontroller "redis-slave" created

$kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-service.json
service "redis-slave" created

$kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-controller.json
replicationcontroller "guestbook" created

$kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-service.json
service "guestbook" created

サンプルアプリケーションの登録が完了したら、最後に、外部公開されたIPアドレスを確認します。

$ kubectl get services -o wide
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)          AGE       SELECTOR
guestbook      LoadBalancer   10.100.115.63    ad804527f692b1XXXXXXXXXXXXXXXX-1487281215.us-east-1.elb.amazonaws.com   3000:31601/TCP   3m        app=guestbook
kubernetes     ClusterIP      10.100.0.1       <none>                                                                    443/TCP          1h        <none>
redis-master   ClusterIP      10.100.223.16    <none>                                                                    6379/TCP         4m        app=redis,role=master
redis-slave    ClusterIP      10.100.247.112   <none>                                                                    6379/TCP         45s       app=redis,role=slave

LoadBalancerに割り当てられたEXTERNAL-IPエンドポイントに対して、ポート3000でアクセスします。無事、Guestbookサンプルアプリケーションが表示されたらOkです!

お疲れさまでしたー。なんとか順調にいけましたでしょうか?

最後に、アプリケーションのお掃除方法はこちら。

$kubectl delete rc/redis-master rc/redis-slave rc/guestbook svc/redis-master svc/redis-slave svc/guestbook

まとめ「まずは触って構成を体感してみましょ」

ここまで、ガガーっとチュートリアルやってみて、おぼろげながらEKSの構成とKubernetesの基本的なところがわかってきた気がします。kubectlをクライアントに導入してコントロールするというのも、ECSとはだいぶやり方が異なっていて新鮮でした。

何か最初に学習しようとしたときに、抽象的な概念を最初に読み込むよりも、まずは手を動かしてみることで、全体構成を具体的にイメージできるメリットがあります。今回のチュートリアルの中でも、クラスターやワーカーノードの作成を通じて、実際のアプリケーションのデプロイ方法などが体験できました。

これからは、Kubernetesそのものの理解を深めながら、既存ECSからの移行方法や、CI/CD周辺の自動化あたりを追求しつつ、わっせわっせとブログに書いていきますので、ご期待くださいませ。東京リージョンも熱望しておりますよ!

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

参考資料

弊社千葉が執筆していたこちらのシリーズでは、Amazon EKS以前のKubernetesそのものの理解を深めることができます。合わせてやってみることをオススメ致します。

Kubernetesの公式チュートリアルをやって基本を抑える | シリーズ | Developers.IO