目次
大友(@yomon8)です。
タイトルの件ですが、実際の環境へのデプロイをしていってみようと思います。
概要を書いた前回の記事はこちらです。
コードはこちらです。
前提環境
作業環境は以下の通りです。
- 自宅WiFiルーター
- 特に特殊な設定は無いです普通に使っています
- Global IPが固定されていると良いです(変わってしまうとデプロイやり直しです)
- Raspberry Pi 4
- 試しては無いですがRaspberry Pi 3や5でも問題無いと思いますZeroとかだと流石に重くて動かないかも・・
- 開発環境
- VSCode + DevContainerで作業しています
- 必要なツール諸々はDevContainerに入っているのでこちらを前提とします
- Linux環境で動かしていますので、他のOSだとdevcontainer.jsonファイルに微調整必要かもしれません
手順概要
手順は以下の通りです。ほぼコードに落としてあるので、手順自体は複雑ではないです。ただ、個別要件である自宅環境が絡む関係で場合によっては上手く動かない場合はあると思いますが、ご容赦いただければと思います。
VSCodeでのDevContainerの実行手順は省略させていただきます。
- Raspberry PiへUbuntuのインストール
- TerraformでのAWS環境プロビジョニング
- Raspberry Pi設定・Site-to-Site VPN確率
- TerraformでのCalicoをEKSにデプロイ
- サンプルアプリをRaspberry Piにデプロイ
Raspberry PiへUbuntuのインストール
EKS Hybrid NodesのOS前提条件に以下の記載があったので、Ubuntuを利用しています。
Raspberry Pi Imagerから以下の「Ubuntu Server 24.0.1 LTS(64-bit)」を選択しました。
以下のように書き込みます。
この時点で認証設定やWiFi接続設定を行なってしまいます。
後はRaspberry Piを起動して設定した認証情報でsshできるの確認して、Raspberry Pi自身のPrivate IPを確認したら準備は終わりです。(このPrivate IPを後で設定で使います)
TerraformでのAWS環境プロビジョニング
リポジトリをCloneしてVSCodeで開いてDevContainerを立ち上げます。
以下二つのTerraformの設定ファイルを.sampleファイルを参考に編集します。
vars/backend.tfvars.sample -> vars/backend.tfvarsにコピーして編集
# AWS Region
region = "ap-northeast-1"
# Terraform Stateファイルの保存用のバケット
bucket = "your-terraform-state-tmp"
vars/env.tfvars.sample -> vars/env.tfvarsにコピーして編集
# AWS Profile
profile = "yourprofile"
# 自宅のWiFiのグローバルIP
home_global_ip = "123.123.123.123"
# Raspbeery Piに振ったプライベートIP
home_pi_private_ip = "192.168.2.123"
# 自宅のWiFiのネットワークCIDR
node_network_cidr = "192.168.2.0/24"
# Pod用の仮想ネットワークCIDR
# WiFiネットワークの隣に設定してみています
pod_network_cidr = "192.168.3.0/24"
# Pod用とNode用(Wifi)のネットワークを両方含むCIDR
home_network_cidr = "192.168.2.0/23"
これでTerraform実行の準備完了です。処理はmakefileにまとめてあるので、以下のコマンドを実行します。
$ make tf-apply-aws
この処理の中でEKSの作成やAWS側のVPNの接続準備などが実施されます。
Raspberry Pi設定・Site-to-Site VPN確率
Terraform実行が完了すると output/setup.sh というスクリプトが生成されます。このスクリプトはRaspberry Piの設定スクリプトとなります。
以下のような設定がされます。
- libreswan(VPNソフトウェア)のインストール・設定
- VPN確率処理
- AppArmor無効化(今回は検証のため無効化してしまっています)
- nodeadmインストール・設定・初期化
コマンドとしては以下の通りです。スクリプト流し込むことで設定完了します。ユーザやIPは自身の環境に合わせてください。※スクリプトがエラーになった場合は何度か流してみてください。
$ ssh user@192.168.2.123 'sudo bash -s' < ./output/setup.sh
全部の処理が完了すると以下のようなメッセージが表示されるはずです。
スクリプトの中身見たい場合は terraform/aws/main.tfのファイルを参照してください。
また、Terraformの最後に出力される、aws ec2 describe-vpn-connectionsのコマンドを実行してみるとVPNが確率されたことを確認できます。(Status: UPの部分です)
TerraformでのCalicoをEKSにデプロイ
このままではPodが立ち上がらないのでCalicoを導入します。こちらもTerraformになっているので以下のコマンド実行するだけです。
$ make tf-apply-k8s
正常に完了するとEKSの画面やk9sで確認すれば、CalicoのPodが立ち上がっているはずです。
サンプルアプリをRaspberry Piにデプロイ
リポジトリ内にいサンプルアプリのManifestとしてsample-app.yamlを準備してありますので、こちらをデプロイします。
$ kubectl apply -f sample-app.yaml
yamlの中に以下の記述がありますが、こちらでALBがデプロイされます。従来のEKSではこの役目はAWS Load Balancer Controllerが担っていて自分で導入、管理する必要がありました。EKS Auto Modeによりこちらの機能はマネージドとなり、特に何も意識しなくても利用できるようになりました。
#省略...
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
namespace: sample
labels:
app.kubernetes.io/name: LoadBalancerController
name: alb
spec:
controller: eks.amazonaws.com/alb
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: sample
name: echo
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: echo-svc
port:
name: svc-port
DevContainerのk9sの画面から見ると、ALBが構築されています。
ちょっとわかりにくいかもしれませんが、赤枠が対象としているPodのIDで、青枠がRaspberry Piで実行中のPodのIPです。curlでALB経由と、Raspberry Piローカルから実行してどちらもPodの名前を返しているのがわかります。
これが最初に以下の図で示した緑の経路の通信になります。
今回のAuto ModeとHybrid Nodesを使いたかったという衝動で書いた記事なので、EKS使い慣れている人でないとわかりにくい記事になってしまったかもしれませんが、もしどこかの誰かの役に立てば幸いです。
- カテゴリー
- タグ