EKS Auto ModeでHybrid NodesとしてRaspberry Piを動かしてみる(デプロイ編)

この記事を書いたメンバー:

大友 佑介

EKS Auto ModeでHybrid NodesとしてRaspberry Piを動かしてみる(デプロイ編)

目次

大友(@yomon8)です。

タイトルの件ですが、実際の環境へのデプロイをしていってみようと思います。

概要を書いた前回の記事はこちらです。


EKS Auto ModeでHybrid NodesとしてRaspberry Piを動かしてみる(概要編)|基幹システムのクラウド移行・構築・導入支援のBeeX

株式会社Beex(ビーエックス)のエンジニアが執筆するEKS Auto ModeでHybrid NodesとしてRaspberry Piを動かしてみる(概要編)のページです。SAPなど基幹システムを中心としたエンタープライズシステムのクラウドインテグレーションを専業としています。

beex-inc.com

og_img

コードはこちらです。


GitHub - yomon8/eks-hybrid-raspberrypi: A Sample Using Raspberry Pi as EKS Hybrid Nodes

A Sample Using Raspberry Pi as EKS Hybrid Nodes. Contribute to yomon8/eks-hybrid-raspberrypi development by creating an account on GitHub.

github.com

og_img


前提環境

作業環境は以下の通りです。

  • 自宅WiFiルーター
    • 特に特殊な設定は無いです普通に使っています
    • Global IPが固定されていると良いです(変わってしまうとデプロイやり直しです)
  • Raspberry Pi 4
    • 試しては無いですがRaspberry Pi 3や5でも問題無いと思いますZeroとかだと流石に重くて動かないかも・・
  • 開発環境
    • VSCode + DevContainerで作業しています
    • 必要なツール諸々はDevContainerに入っているのでこちらを前提とします
    • Linux環境で動かしていますので、他のOSだとdevcontainer.jsonファイルに微調整必要かもしれません


手順概要

手順は以下の通りです。ほぼコードに落としてあるので、手順自体は複雑ではないです。ただ、個別要件である自宅環境が絡む関係で場合によっては上手く動かない場合はあると思いますが、ご容赦いただければと思います。

VSCodeでのDevContainerの実行手順は省略させていただきます。

  1. Raspberry PiへUbuntuのインストール
  2. TerraformでのAWS環境プロビジョニング
  3. Raspberry Pi設定・Site-to-Site VPN確率
  4. TerraformでのCalicoをEKSにデプロイ
  5. サンプルアプリを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使い慣れている人でないとわかりにくい記事になってしまったかもしれませんが、もしどこかの誰かの役に立てば幸いです。

カテゴリー
タグ

SAPシステムや基幹システムのクラウド移行・構築・保守、
DXに関して
お気軽にご相談ください

03-6260-6240 (受付時間 平日9:30〜18:00)