AWS

EKSに入門してみる

shio

こんにちは、しおです。

以前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によって比較的簡単にクラスター周りの操作ができるので、イメージよりも利用のハードルが下がりました。

AUTHOR
shio
shio
記事URLをコピーしました