2023年2月5日日曜日

EKS(fargate)でargocdを試す環境をterraformで作ってみた

 

やりたかったこと

  • EKS(fargate)の環境でk8sを試したい。
  • 試したいk8sパッケージ
    • eso
    • metric server
    • AWS Load Balancer Controller
    • argocd
    • kubernetes dashboard
  • argocd はBitbucketと連携させてnginxをdeploy
  • AWS SSM ParameterStoreに、Bitbuket接続に使用するSSH秘密鍵を登録し、esoでk8sのsecretとして参照できるようにしたい。
  • AWS Load Balancer Controllerを使って、ALBを構築し、argocd, dashboardのGUIを見たい。
  • metric serverのhpaでpodをスケールアウトしたい。
  • 個人の学習目的なので、セキュリティはゆるくていい。


私の環境

  • SparkyLinux6.5(Debian系)
    • ssh秘密鍵(レポジトリアクセス用)
  • k8s
    • kubectl1.25.4
    • helm3.10.2
  • aws
    • aws-cli2.9.4
    • ssh秘密鍵(EC2用キーペア)
  • terraform
    • tfenv3.0.0
    • tflint0.43.0
    • terraform1.3.7


主に、下記のサイトを参考にしました。


サンプルコード


https://github.com/blue21jp/aws-sample-terraform-eks


構成


.
├── Makefile
├── README.md
├── app/
│   ├── nginx/
│   │   ├── README.md
│   │   ├── deployment.yml
│   │   ├── hpa.yaml
│   │   └── service.yml
│   └── php/
│       ├── README.md
│       ├── deployment.yml
│       ├── hpa.yaml
│       └── service.yml
├── demo_todo_k8s.org
├── global/
│   ├── backend.tf
│   ├── ip.sh
│   ├── ip_pub.sh
│   ├── locals.tf
│   ├── providers_aws.tf
│   ├── providers_localstack.tf
│   └── versions.tf
├── modules/
│   └── ec2-spot/
│       ├── main.tf
│       ├── outputs.tf
│       └── variables.tf
├── stacks_base/
│   ├── 00_check/
│   │   ├── Makefile
│   │   └── outputs.tf
│   ├── 01_network/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── main.tf
│   │   └── versions.tf
│   ├── 02_ec2_nat/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── locals.tf
│   │   └── main.tf
│   ├── Makefile
│   ├── locals_all.tf
│   ├── locals_dev.tf
│   └── locals_prd.tf
├── stacks_eks/
│   ├── 00_check/
│   │   ├── Makefile
│   │   └── outputs.tf
│   ├── 01_vpc/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   └── main.tf
│   ├── 02_ssm/
│   │   ├── Makefile
│   │   └── main.tf
│   ├── 10_eks_cluster/
│   │   ├── Makefile
│   │   ├── aws_fargate_profile_app.tf
│   │   ├── aws_fargate_profile_kube_system.tf
│   │   ├── aws_iam_oidc.tf
│   │   ├── datasources.tf
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── versions.tf
│   ├── 20_k8s_alb_controller/
│   │   ├── AWSLoadBalancerController.json
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── iam.tf
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── versions.tf
│   ├── 20_k8s_eso/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── external_secrets_policy.json
│   │   ├── iam.tf
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── versions.tf
│   ├── 20_k8s_metrics_server/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── versions.tf
│   ├── 21_k8s_argocd/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── ingress.tf
│   │   ├── k8s_external_secret.yaml
│   │   ├── k8s_repo.yaml
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   ├── repo.tf
│   │   └── versions.tf
│   ├── 21_k8s_dashboard/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── ingress.tf
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── versions.tf
│   ├── 40_app_argocd/
│   │   ├── Makefile
│   │   ├── datasources.tf
│   │   ├── ingress.tf
│   │   ├── k8s_argo_app.yaml
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── versions.tf
│   ├── Makefile
│   ├── README.md
│   ├── locals_all.tf
│   └── locals_prd.tf
└── stacks_template/
    ├── 00_check/
    │   ├── Makefile
    │   └── outputs.tf
    ├── Makefile
    ├── locals_all.tf
    ├── locals_dev.tf
    ├── locals_prd.tf
    └── locals_stg.tf

こんなイメージ


この構成の説明と基本操作方法は、下記の別記事を参照。
EKS環境は、前述の別記事(DockerDesktop版)と比較して、下記を変えてます。
  • app/には、deploymentとhpa,searviceのmanifestをおいてます。移動した理由は、argocdでの見え方の違いを試したかったから。
    ちなみに、ingressをapp/に移動しなかったのは、ALBを削除しないと、EKSを破棄できないから。(make destroy で一括破棄ができなくなる)
  • app/には、nginx, phpの2種類をおいてます。phpはhpaのスケールアウト確認用です。
  • ingress nginxのかわりにAWS Load Balancer Controllerを使ってます。
  • ALBは、自分のpublic ipのみ許可するようにSecurityGroupを設定しています。
    (public ipの取得は、global/ip_pub.sh で実施)


構築


準備


bitbucket
レポジトリアクセス用のSSH秘密鍵は下記のPATHを使用します。
~/.ssh/id_rsa

awscli 
AWS用のprofile名は "sandbox" を使用します。

ec2キーペア
NATインスタンスで使用するキーペアです。"sandbox"を使用します。
節約のためにNATゲートウェイでなくNATインスタンスを使ってます。

Terraform実行


下記コマンドを実行すると、terraform applyが実行されます。
これで、AWSのEKS環境にリソース一式(vpc, eks, ssm, argocd, dashbord, etc)が構築されます。
$ make opply ENV=prd OPT="-auto-approve" -C stacks_base
$ make apply ENV=prd OPT="-auto-approve" -C stacks_eks


確認


EKSへのkubectl接続

下記コマンドで config を更新

aws eks update-kubeconfig --name eks-main --alias eks-main

EKS作成者だけアクセスできます。

EKSへのアクアセス権限設定については下記URL参照


argocdのGUI
http://<ALBのDNS>
Userは、adminです。
Passwordは下記コマンドで調べます。
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=“{.data.password}” | base64 -d; echo

dashbordのGUI
http://<ALBのDNS>
認証を無効に設定しています。
認証画面で[スキップ]ボタンをクリックすると入れます。

app(nginx/php)のページ
http://<ALBのDNS>
nginx(welcome ページ), php(OK)が表示されます。


破棄


下記コマンドを実行するとterraform destroyが実行されます。
を実行し、リソースを全部、破棄します。
$ make destroy ENV=prd OPT="-auto^approve" -C stacks_eks
$ make destroy ENV=prd OPT="-auto-approve" -C stacks_base


おまけ


demo_todo_k8s.org に記載した手順で構築と動作確認を実施している様子を動画にしました。


この動画で実行しているコマンド(aws-cliのalias)については、下記の記事を参照