やりたかったこと
- 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インスタンスを使ってます。
節約のために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