EKSに入門してみる
こんにちは、しおです。
以前Kubernetesに入門してみるという記事を書いたのですが、
今回はそれをベースにして、AWSのk8sサービス・EKSに入門してみようと思います。
クラスターの準備
さっそくアプリケーションを動かすためのクラスターを作成しようと思います。
作成にはeksctlを利用します。
eksctlはEKSを利用するためのCLIです。
eksctlを使うと下記のようなコマンドでクラスターをサクッと作成できます。
今回はFargateを利用するようオプションを指定します。プロファイルは適宜設定します。
eksctl create cluster --fargate --profile {profile}
コマンドを走らせると裏側でCloudFormationのスタックが作成されるので、何が作成されるかはスタックを見ると詳細がわかります。
Deployment
クラスターが作成されたらアプリケーションをデプロイします。
以前の記事ではkubectl crate deployment
で作成しましたが、
今回はdeployment.ymlに定義をあらかじめ作成してkubectl apply
からデプロイします。
以前と同じアプリケーションのイメージを動かすようにします。
また、サービスアカウントも作成してしまいます。
各マニフェストファイルは以下です。
# service-acount.yml
apiVersion: apps/v1
kind: ServiceAccount
metadata:
name: sample-app
namespace: default
# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
labels:
app: sample-app
spec:
replicas: 2
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
serviceAccountName:
containers:
- name: sample-app
image: gcr.io/google-samples/kubernetes-bootcamp:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
kubectl apply
の前に、 kubectlの向き先をEKSのクラスターにするためkubeconfigファイルを設定します。
aws cliから下記のコマンドでkubeconfiを設定できます、クラスター名はeksctlから作成されたものにします。
aws eks update-kubeconfig --name cluster-name
これでkubectlからEKS上のクラスターに接続できるようになりました。
では改めてapplyします。
kubectl apply -f service-account.yml
kubectl apply -f deployment.yml
完了したら、無事に作成されているかどうか確認してみます。
kubectl get deployments
で作成したDeploymentsが確認できるはずです。
Service
デプロイができたら、今度はサービスを設定します。
こちらも同様にサービス用の定義を作成してkubectl apply
します。
# service.yml
apiVersion: v1
kind: Service
metadata:
name: sample-app
labels:
app: sample-app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: sample-app
type: LoadBalancer
kubectl apply -f service.yml
kubectl get services
で確認してみましょう。
問題なさそうです。
Ingress
作成したサービスを公開するために、Ingressも設定します。
EKSにはAWS Load Balancer Controllerというアドオンがあり、このアドオンを利用すると
Ingressの作成に応じてロードバランサー(ALB)を作成してくれます。
今回はこれを利用していきます。
詳細はこちら
ドキュメントを参考に、helmを利用して導入します。
まずはIAMロールをドキュメントに沿って作成します。
policy-documentに指定するファイルはドキュメントに従ってダウンロードしています。
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json \
--profile {profile}
また、途中でクラスターのOIDCプロバイダーがないというエラーに当たったので、ここで有効化しておきます。
eksctl utils associate-iam-oidc-provider --region=ap-northeast-1 --cluster={cluster-name} --approve --profile {profile}
必要なサービスアカウントを作成します。
eksctl create iamserviceaccount \
--cluster={cluster-name} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::{account-id}:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
ここでhelmを使ってLoad Balancer Controllerをインストールします。
クラスター名やvpcIdについては、kubectlで作成されたリソースを指定します。
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName={cluster-name}\
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=ap-northeast-1 --set vpcId={vpc-id}
これでクラスターにaws-load-balancer-controller
というdeploymentが作成されているはずです。
kubectl get deployment -n kube-system aws-load-balancer-controller
後はIngressの設定を作成するだけです。
ingress.ymlを下記のように作成します。
# ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample-ingress
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sample-app
port:
number: 80
kubectl apply -f ingress.yml
作成が完了するとロードバランサーが自動で作成されて、
コンソールなどから確認ができるはずです。
リクエストしてみる
ここまでで実際にリクエストしてみることができるはずです。
ロードバランサーが作成されていると思うので、該当のものを探してリクエストしてみます。
アドレスは実際のロードバランサーのものを指定してください。
curl ****.ap-northeast-1.elb.amazonaws.com
下記のようなレスポンスが返ってきたら成功です。
deploymentで指定したアプリからレスポンスが返ってきています。
うまく行きましたね。
終わりに
最後に作成したリソースは下記で削除することができます。
eksctl delete cluster -n {cluster-name} --profile {profile}
いかがでしたでしょうか、まだまだ色々なことが試せるかと思いますが、今回はここで切り上げます。
eksctlによって比較的簡単にクラスター周りの操作ができるので、イメージよりも利用のハードルが下がりました。