Amazon EKSを使ってみました

この記事を書いたメンバー:

Anna

Amazon EKSを使ってみました

目次

Kubernetesについて学ぶために、EKSにアプリケーションをデプロイしてみました。

ECS, EKS, Fargateの比較

EKS, ECS, Fargateの違いを見てみます。
データプレーン:コンテナが稼働するサーバー(Fargate, EC2)
コントロールプレーン:Dockerコンテナを管理する機能(ECS, EKS)

〇ECSでは、コンテナを動かすところにFargate, EC2が採用できます。
●EKSではEC2のみ、Fargateは不可です。
〇ECSは、ロードバランサやストレージなどのリソースを自分から作成はせず、それらを割り当てます。
●EKSはロードバランサやストレージなどのリソースを作成する場合があります。

◇複数の多種多様なコンテナを運用するかどうかで、ECSかEKSどちらを採用するか判断します。

1タスクコスト/月ECSEKSFargate
Control Plane$0.00$144.00$0.00
Control Plane$70.28$70.28$0.00
タスク(0.5vCPU 1GB Mem)$0.00

$0.00

$27.36

合計$70.28$214.28$27.36

*$0.0506 vCPU/hr x 0.5 vCPU x 24hr x 30 Days + $0.0127GB/hr x 1GB x 24hr x 30 Days 

24タスクコスト/月ECSEKSFargate
Control Plane$0.00$144.00$0.00
EC2 ワーカーノード(m5.large x4)$421.68*$421.68*$0.00
EC2 ワーカーノード(m5.large x4)$0.00$0.00$656.64**
合計$421.68$565.68$565.68

*4 EC2 = $70.28 x 4    **$27.36 x 24

※価格は記事公開時のものです、最新の情報はAWSのWebサイトで確認してください。

EKSにアプリケーションをデプロイする

Kubernetesがコンテナ運用の事実標準にとのことから、今回は上記3つの中からEKSを取り上げます。

  • EKSクラスターのサービスロールの作成
  • EKSクラスターのVPCの作成
  • EKSクラスタの作成
  • kubeconfigファイルの作成
  • >EC2のキーペアの作成
  • EKSワーカーノードの起動と設定
  • アプリケーションをデプロイ
  • EKSクラスターのサービスロールの作成
IAMからIAMロールを作成します。
AWS service > EKSを選択 
Attached permissions policiesはスキップします。
Add tags(optional)はスキップします。
Role nameを入力し作成します。

EKSクラスターのVPCの作成

EKSクラスタ作成時にVPCを指定する必要があるのであらかじめ作成しておきます。

Amazon S3 URLの欄には、下記を入力します。 

 https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/amazon-eks-vpc-sample.yaml

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

その他スキップします。
確認画面で最終確認し、作成を完了します。
作成が完了したら、Outputsのところで、「セキュリティグループ」「サブネットID」「VPC ID」が表示されるので、メモに残しておくと後々確認のために便利かもしれません。

EKSクラスタの作成

EKSへ移動し、クラスタを作成します。クラスタ名を入力し、上記で作成したIAMロール, VPC, サブネット, セキュリティグループを選択します。その他はスキップします。 

KUBECONFIGファイルの作成

クラスターの Kubernetes バージョンに応じて、Amazon EKS 提供の kubectl バイナリを Amazon S3 からダウンロードします。 

 PS C:\> curl -o kubectl.exe https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/windows/amd64/kubectl.exe

kubectl をインストールしたら、以下のコマンドを使用してそのバージョンを確認できます。 

 PS C:\kubern> kubectl version --short --client

EC2のキーペアの作成

EKSワーカーノード作成時にキーペアを指定する必要があるのであらかじめ作成しておきます。 

EC2 > Key Pairs > Create Key Pair

EKSワーカーノードの起動と設定

 https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/amazon-eks-nodegroup.yaml

Amazon EKS ワーカーノードを起動して設定する 

NodeImageIdは以下のページで確認します。 

NodeImageId 

その他はスキップします。
作成が完了したら、OutputsでNodeInstanceRoleを確認し、aws-auth-cm.yamlファイルのrolearnをNodeInstanceRoleに変更します。※ページ下部補足参照。

 PS C:\kubern> kubectl apply -f .\aws-auth-cm.yaml

configmap/aws-authcreated 

 PS C:\kubern> kubectl get nodes

 

NAMESTATUSROLESAGEVERSION
ip-192-168-176-17.ec2.internal  Ready<none>21sv1.13.7-eks-c57ff8
ip-192-168-255-76.ec2.internal  Ready<none>24sv1.13.7-eks-c57ff8
ip-192-168-86-65.ec2.internal  Ready<none>22sv1.13.7-eks-c57ff8

podの作成をしていきます。  

 PS C:\kubern> kubectl create -f .\nginx.yaml

deployment.extensions/nginx created

 PS C:\kubern> kubectl create -f .\nginx-svc.yaml
   service/nginx created 
作成したServiceを確認します。
-o wide オプションで、各Podの実行ホストIPも表示できます。
 PS C:\kubern> kubectl get services -o wide
出力: 
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(s)AGESELECTOR
kubernetesClusterIP10.100.0.1<none>443/TCP35m<none>
nginxLoadBalancer10.100.222.152a92138707af7211e9a3730204c2c03ea-1248816560.us-east-1.elb.amazonaws.com443/TCP35srun=nginx
svcの詳細を確認します。 
 PS C:\kubern> kubectl describe svc ngi
出力:
Name:                     nginx
Namespace:                default
Labels:                   run=nginx
Annotations:              <none>
Selector:                 run=nginx
Type:                     LoadBalancer
IP:                       10.100.222.152
LoadBalancer Ingress:     a92138707af7211e9a3730204c2c03ea-1248816560.us-east-1.elb.amazonaws.com
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32319/TCP
Endpoints:                192.168.200.92:80,192.168.64.9:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  89s   service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   87s   service-controller  Ensured load balancer

80番ポートを指定しGoogleChromeに表示します。

a92138707af7211e9a3730204c2c03ea-1248816560.us-east-1.elb.amazonaws.com:80

アプリケーションをデプロイ

ここはゲストブックアプリケーションを起動すると手順は同じです。

 PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-master-controller.json

replicationcontroller/redis-master created 

 PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-master-service.json

service/redis-master created 

 PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-controller.json

replicationcontroller/redis-slave created 

 PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-service.json

service/redis-slave created 

 PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-service.json

service/redis-slave created 

 PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/guestbook-controller.json

replicationcontroller/guestbook created 

 PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/guestbook-service.json

service/guestbook created 

 PS C:\kubern> kubectl get services -o wide
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)          AGE   SELECTOR
guestbook      LoadBalancer   10.100.83.78     a75a31c7caf7411e9a3730204c2c03ea-2124490954.us-east-1.elb.amazonaws.com   3000:31260/TCP   5s    app=guestbook
kubernetes     ClusterIP      10.100.0.1       <none>                                                                    443/TCP          48m   <none>
nginx          LoadBalancer   10.100.222.152   a92138707af7211e9a3730204c2c03ea-1248816560.us-east-1.elb.amazonaws.com   80:32319/TCP     13m   run=nginx
redis-master   ClusterIP      10.100.5.118     <none>                                                                    6379/TCP         45s   app=redis,role=master
redis-slave    ClusterIP      10.100.4.139     <none> 

補足

# aws-auth-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: arn:aws:iam::1234567890:role/beex-worker-nodes-NodeInstanceRole-14L9IXMSZB654
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
# nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.11
        ports:
        - containerPort: 80
# nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    run: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: nginx
  type: LoadBalancer
カテゴリー
タグ

この記事を書いたメンバー

SAPシステムや基幹システムのクラウド移行・構築・保守、
DXに関して
お気軽にご相談ください

03-6260-6240 (受付時間 平日9:30〜18:00)