前回の記事でAWSでDockerファイルを使うための方法をしらべた結果、私はEKSを使うことに決めました。
この記事では、Kubernetesの最大構成単位であるClusterの作成と削除を行おうと思います。
なお、EKSでのCluster利用には無料枠がありません。また、EKS以外にもいくつかの無料枠がないサービスを利用することにもなります。
私が昨日6時間ほどいろいろ作業した結果、以下のように$0.77ほど費用がかかりました。もし無料枠がないアカウントだと、更に経費がかかることになるはずなのでご注意を。
EKSの概要を整理する
実際にClusterを作る前に、簡単にですがEKSの概要を整理しましょう。
EKS(Elastic Kubernetes Service)はAWSのKubernetesマネージドサービスです。自分でKubernetesを1から構築するより、楽にKubernetesを利用できるサービスということになります。
今回作成する予定のClusterは、Kubernetesを構成する最も大きな単位です。Clusterの中にそのClusterを管理するコントロールパネルや各種ノードなどが格納されると思えば間違いではありません。
(ノードの中にGithub Actionsを使って自作のDockerコンテナをPodとしてデプロイするのが最終目標です。今回の記事ではそこまでは行いません)
Cloud9でEKSを使う環境を整える
この記事では環境の差分をなくすために、実行環境としてCloud9を利用します。
Cloud9はAWSが準備しているクラウドで利用可能なIDE(統合開発環境)です。ブラウザから利用可能な開発環境で、WindowsでもMacでも同じ環境でEKSの操作ができます。
Cloud9の環境を作成する
まずはCloud9の環境を作成します。
- AWSのWebコンソールにログイン
- 左上のサービスからCloud9を選択
- Create environmentを選択
上記の通りに作業すると、Name environment画面が出てきます。
Nameは何でもいいのですが、とりあえずEKS_envとでも入力してください。Nameを入れたらNext stepを押します。
次の画面はConfigure settingsです。
ここではほぼデフォルトのままで問題ありません。ひょっとしたらInstance typeがt3.smallになって居るかもしれないので、その場合はt2.microにしましょう。最小構成ですが無料対象ですし今回の作業ではスペック不足ということもありません。
最後にReview画面が出てくるので一応内容を確認したあと、Create environmentを押せば作成完了です。
環境作成に数分時間がかかります。
作成が終わると以下のような画面が出てくるので、画面上部の+マークを押して「New Terminal」ボタンを押し、ターミナルを表示しましょう。
ついでに使わないウインドウは削除してしまって問題ありません。
一度Cloud9のタブを閉じてもう一度使いたい場合は、AWSコンソールにログインしてCloud9を選択し、使いたい環境のOpen IDEボタンを押せば大丈夫です。
Cloud9にIAMロールを割り当てる
Cloud9からEKSを操作するためには、Cloud9にIAMロールを割り当てなくてはなりません。これをやらないと、後ほどインストールするkubectlコマンドで認証エラーが出ます。
ロールを作成する
まずは割り当てるIAMロールを作成しましょう。サービス一覧から「IAM>ロール>ロールを作成」と選択すると次の画面が表示されるはずです。
信頼されたエンティティタイプはAWSのサービス、ユースケースはEC2を選びます。次へを押すとこの画面が出てきます。
ここではAdministratorAccessで検索して、チェックもAdministratorAccessにだけに入れてください。次へを押します。
ロール名は何でもいいのですが、ここではEKS-adminとしました。画面下の方にあるロールを作成ボタンを押すとロールの作成は終わりです。
Cloud9にロールを割り当てる
Cloud9のIDE画面に戻り、右上のアイコンをクリックしてManage EC2 Instanceを押します。
すると次の画面が出るので、Cloud9のEC2インスタンスを選択してください。
「アクション>セキュリティ>IAMロールを選択」でロール選択画面が表示されます。
先程作ったロールを選択して保存を押せば完了です。
インスタンス詳細のセキュリティタブからIAM ロールが選択したものに変わっていることが確認できます。
必要なツールをインストールする
今回の作業に必要なツール類をインストールします。以下のコマンドラインをターミナルで順次実行してください。
# kubectlをインストールする
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.21.2/2021-07-05/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' >> ~/.bashrc
# 不要なファイルを削除
rm kubectl
# インストールが成功していることをバージョン表示で確認
kubectl version --short --client
# 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 version
# awscliをインストールする
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# 不要なファイルを削除
rm awscliv2.zip
rm -r aws
# インストールが成功していることをバージョン表示で確認
aws --version
インストールした各種コマンドの概要は以下の通りです。
kubectl | Kubernetes Clusterをコマンドラインで操作するためのツール |
eksctl | Kubernetes ClusterをEKS上に作成するのをサポートするツール |
aws | AWSサービスを管理するための統合ツール |
AWS managed temporary credentialsを無効化する
Cloud9では初期設定にAWS managed temporary credentialsという認証の設定があります。この設定が後でkubectlを使う際に邪魔になるようなので、無効化しましょう。
aws cloud9 update-environment --environment-id $C9_PID --managed-credentials-action DISABLE
rm -vf ${HOME}/.aws/credentials
awscliの設定をする
awscliのデフォルトリージョンを設定しておきます。これ以外の設定はCloud9では必要ないみたいです。
この記事では東京リージョンを使うことにします。
aws configure set default.region ap-northeast-1
EKSにClusterを作成する
いよいよEKSにClusterを作成します。
EKSのClusterには、デプロイしたコンテナを動かす方法が大きく分けて2つ存在します。1つがEC2を使う方法、もう一つがFargateを使う方法です。
どちらにもメリット・デメリットがあるようなのですが、今回は管理が簡単らしいFargateを使うことにしました。EC2を使うことにしました。当初はFargateを使う予定でしたが、デプロイしたコンテナを公開する際にFargateだとややこしすぎて挫折したためです。
以下はEC2を使うClusterを作成するコマンドです。
eksctl create cluster --name test --node-type=t2.micro --nodes=2
これだけでtestという名前のClusterの作成が作成できます。下準備の割に本番はとても簡単でした。もちろん実稼働するシステムを動かすならもう少しオプションは増えるはずですが、勉強レベルならこれで十分です。
nginxコンテナをデプロイする
Clusterを削除する前に、コンテナのデプロイをしてみましょう。Kubernetesの公式ページにnginxのコンテナをデプロイするための設定ファイルがあるので、それを利用します。
kubectl get deployments
# No resources found in default namespace.
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
# deployment.apps/nginx-deployment created
kubectl get deployments
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx-deployment 0/3 3 0 7s
最初にkubectl get deploymentsで確認した際は何もありませんでしたが、kubectl applyコマンドを実行したあとはnginx-deploymentという名前のPodがあることが確認できます。
今回は確認しただけなので、利用するyamlファイルの詳細は説明しません。ちょっとわかりにくいですがこのページなどが参考になると思います。
また、nginxはWebサーバなのでHTTPでアクセス可能なはずですが、外部からCluster内のPodにアクセスするためにはまた別の設定が必要なので今回は行いませんでした。
リソースを開放する
AWSではリソースを残したままにすると費用が発生するため、作業が終わったら開放しておきます。このままEKSやCloud9を使って色々試すなら後回しでも良いですが、いずれにせよ練習環境は削除するようにしましょう。
もし削除を忘れると、以下の画像のように大きな請求をされる羽目になります。1週間で気がついたからこれですみましたが、もし気づかずにいたらひどいことになっていたはずです。
EKSのCluster削除
Cluster作成と同じく削除も簡単です。削除でも数分かかります。
eksctl delete cluster --name=test
# 念のためClusterの一覧を表示、No clusters foundのはず
eksctl get cluster
Cloud9環境の削除
EKSのClusterほどは費用がかからず、今回利用した範囲なら無料枠に収まりますが、今後使わないなら同じく削除しましょう。
AWSのWebコンソールでサービスからCloud9を選択し、今回利用した環境を選んでDeleteボタンを押せば削除できます。
まとめ:まずはClusterを作ってみました
Cloud9を使ってEKSのClusterを作成し、既存のDockerコンテナをデプロイしてみました。
私がAWS自体に慣れていないこともあり、環境作成で非常に時間がかかった印象です。環境さえ整ってしまえば、Clusterの作成もデプロイも簡単でした。
引き続き目標であるGithub Actionsを使ったAWSへのDockerコンテナデプロイに向けた記事を作成していく予定です。
この記事でわからないところがあったら、Twitterやお問い合わせフォームから連絡をください。記事ごとのコメント欄も開放しているので、そちらでも大丈夫です。現在勉強中の内容なのでお答えできない可能性もありますが、できる限り調べてみます。
最後に、何度も繰り返しますがリソースはしっかり削除しましょう。
Cloud9でEKSに独自コンテナをデプロイして公開するに続きます。
コメント