BeeX Technical BlogAmazon 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
EC2 ワーカーノード(m5.large)$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
タスク(0.5vCPU 1GB Mem) $0.00$0.00$656.64**
合計$421.68$565.68 $656.64

*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
Client Version: v1.13.7-eks-fa4c70

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-auth created
クラスターへの接続を確認するには、 kubectl getコマンドを使用してクラスターノードの一覧を返します。
PS C:\kubern> kubectl get nodes
NAME                             STATUS   ROLES    AGE   VERSION
ip-192-168-176-17.ec2.internal   Ready    <none>   21s   v1.13.7-eks-c57ff8
ip-192-168-255-76.ec2.internal   Ready    <none>   24s   v1.13.7-eks-c57ff8
ip-192-168-86-65.ec2.internal    Ready    <none>   22s   v1.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
出力:
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)        AGE   SELECTOR
kubernetes   ClusterIP      10.100.0.1       <none>                                                                    443/TCP        35m   <none>
nginx        LoadBalancer   10.100.222.152   a92138707af7211e9a3730204c2c03ea-1248816560.us-east-1.elb.amazonaws.com   80:32319/TCP   35s   run=nginx
svcの詳細を確認します。
PS C:\kubern> kubectl describe svc nginx
出力:
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/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

参考:

Amazon EKS の開始方法

kubernetes : kubectlコマンド一覧

 

カテゴリ

タグ

BeeX Technical Blogについてのお問い合わせ

BeeX Technical Blogのエントリにご質問が御座いましたらお気軽にお問合せください。

お電話でのお問い合わせ

☎ 03-6214-2830

受付時間 平日9:30〜18:00

フォームでのお問い合わせ

お問い合わせフォーム