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 |
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タスクコスト/月 | ECS | EKS | Fargate |
---|---|---|---|
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
その他スキップします。 確認画面で最終確認し、作成を完了します。 作成が完了したら、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
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
参考: