目次
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
.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
NodeImageIdは以下のページで確認します。
その他はスキップします。
作成が完了したら、OutputsでNodeInstanceRoleを確認し、aws-auth-cm.yamlファイルのrolearnをNodeInstanceRoleに変更します。※ページ下部補足参照。
PS C:\kubern> kubectl apply -f .\aws-auth-cm.yaml
configmap
/aws-auth
created
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 | 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
.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
- カテゴリー
- タグ