目次
Kubernetesについて学ぶために、EKSにアプリケーションをデプロイしてみました。
ECS, EKS, Fargateの比較
EKS, ECS, Fargateの違いを見てみます。
データプレーン:コンテナが稼働するサーバー(Fargate, EC2)
コントロールプレーン:Dockerコンテナを管理する機能(ECS, EKS)
〇ECSでは、コンテナを動かすところにFargate, EC2が採用できます。
●EKSではEC2のみ、Fargateは不可です。
〇ECSは、ロードバランサやストレージなどのリソースを自分から作成はせず、それらを割り当てます。
●EKSはロードバランサやストレージなどのリソースを作成する場合があります。
◇複数の多種多様なコンテナを運用するかどうかで、ECSかEKSどちらを採用するか判断します。
| 1タスクコスト/月 | ECS | EKS | Fargate |
|---|---|---|---|
| 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タスクコスト/月 | ECS | EKS | Fargate |
|---|---|---|---|
| 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その他スキップします。確認画面で最終確認し、作成を完了します。作成が完了したら、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.exekubectl をインストールしたら、以下のコマンドを使用してそのバージョンを確認できます。
PS C:\kubern> kubectl version --short --clientEC2のキーペアの作成
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
NodeImageIdは以下のページで確認します。

その他はスキップします。作成が完了したら、OutputsでNodeInstanceRoleを確認し、aws-auth-cm.yamlファイルのrolearnをNodeInstanceRoleに変更します。※ページ下部補足参照。
PS C:\kubern> kubectl apply -f .\aws-auth-cm.yamlconfigmap/aws-authcreated
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.yamldeployment.extensions/nginx created
PS C:\kubern> kubectl create -f .\nginx-svc.yamlservice/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 | 443/TCP | 35s | run=nginx |
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.jsonreplicationcontroller/redis-master created
PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-master-service.jsonservice/redis-master created
PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-controller.jsonreplicationcontroller/redis-slave created
PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-service.jsonservice/redis-slave created
PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-service.jsonservice/redis-slave created
PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/guestbook-controller.jsonreplicationcontroller/guestbook created
PS C:\kubern> kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/guestbook-service.jsonservice/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.yamlapiVersion: v1kind: ConfigMapmetadata: name: aws-auth namespace: kube-systemdata: mapRoles: | - rolearn: arn:aws:iam::1234567890:role/beex-worker-nodes-NodeInstanceRole-14L9IXMSZB654 username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes# nginx.yamlapiVersion: extensions/v1beta1kind: Deploymentmetadata: name: nginxspec: replicas: 2 template: metadata: labels: run: nginx spec: containers: - name: nginx image: nginx:1.11 ports: - containerPort: 80# nginx-svc.yamlapiVersion: v1kind: Servicemetadata: name: nginx labels: run: nginxspec: ports: - port: 80 protocol: TCP selector: run: nginx type: LoadBalancer
- カテゴリー
- タグ