クラウドネイティブ技術実践ハンズオンのための環境をローカルで作成した話

# はじめに
技術書典で「クラウドネイティブ技術実践ハンズオン」を購入しました。

https://techbookfest.org/product/6AuEZp2fRmZeYzDbQ2qub0?productVariantID=g8RAwBkSCiGYzFkHVZwskN

書籍では、ハンズオン環境はAWSのEC2で構築する例が紹介されていました。
私は、自前PCのローカル環境でハンズオン環境を構築しました！

私はハンズオンを以下のポイントでやりたいと思っています。
1. 自由気ままに好きな時間に自分勝手に実験したい
1. ハンズオン環境構築はじっくり取り組みたい
1. 環境設定の一部を変更してみて挙動を確認して、理解を深めたい

このポイントだとクラウド環境はまずい場合があると思っています。
特に、設定誤り（変更し過ぎてしまう）が発生しやすく、セキュリティリスクが高まる:fearful:。
時間を掛けると、稼働時間が増えて課金が増える・・・:sob:。

まあ、単純にローカルでハンズオンするのが、不安もなく思う存分（環境を壊す勢い）できるということだけですが（笑）

# 構築したハンズオン環境
## マシン環境
Ubuntu Desktop 24.04 LTS上にVirtualBoxを入れてVM上にUbuntu server 24.04をインストールしてハンズオン環境を作りました。
書籍で紹介されている構成が仮想マシン上にKubernetesを稼働させてホストのブラウザからアクセスする構成であったので、近い環境にするためにVirtualBoxを使うことにしました。

実は、かなり環境構築に手こずりました:sweat_smile:
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Ingressをデプロイしてもホストのブラウザから通信が通らない・・・<br>Ingressの情報を見ると、Addressが空欄になっている。<br>これが原因だと思うんだけな🤔<a href="https://t.co/8Kl7xlmJTj">https://t.co/8Kl7xlmJTj</a></p>&mdash; LittleBear🐻 (@littlebear_6w6) <a href="https://twitter.com/littlebear_6w6/status/1838341421436407875?ref_src=twsrc%5Etfw">September 23, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">この3日、仕事終わった深夜に自宅で試行錯誤しているけど、うまく行かない。<br>悪化していて、Ingress NGINX Controllerがデプロイできなくなかった（笑） <a href="https://t.co/O4yeyGSp8P">https://t.co/O4yeyGSp8P</a></p>&mdash; LittleBear🐻 (@littlebear_6w6) <a href="https://twitter.com/littlebear_6w6/status/1838958726977638568?ref_src=twsrc%5Etfw">September 25, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

試行錯誤の過程を記事するというよりかは、最終的な結果を記録のために残します！

:desktop:**構築したハンズオン環境**
|No.|項目|バージョン|
|---|---|---|
|1|ホストOS|Ubuntu Desktop 24.04LTS|
|2|仮想化ソフト|VirtualBox 7.0.20|
|3|ゲストマシンOS|Ubuntu Server 24.04LTS|

:gear:**ゲストマシンのリソース**
|No.|項目|設定値|
|---|---|---|
|1|OS|Ubuntu Server 24.04LTS|
|2|CPUコア|3vCPU|
|3|メモリ|8GB|
|4|ストレージ|24GB|

:warning:ストレージは、小さく設定し過ぎてしまったと思います。
　Cluster構築して最初のデモアプリをデプロイしただけで、残容量が8GBになってしまいました・・・。50GBくらい？に設定した方が良かったかなとちょっと後悔してます。

:globe_with_meridians:ゲストマシンのNIC設定
|No.|設定値|用途|
|---|---|---|
|1|ホストオンリーアダプタ|ホストマシンとゲストマシン間の通信で利用。<br>ホストのブラウザからゲストマシンのアプリケーション on Kubernetesにアクセスするために使用。|
|2|NAT|ゲストマシンがインターネット通信するために利用。<br>ツール等をダウンロードするために使用。|

## ゲストマシンのIP固定化
ゲストマシンを起動するたびにIPアドレスが変動するのは、ゲストマシン内に構築したアプリケーションへアクセスする際に手間なのでIPを固定化した。
これにより、ゲストマシンに構築したアプリケーションへもアクセスしやすくなるとともに、VSCode等でSSH接続してハンズオンしやすくなりました。

```/etc/netplan```に```99-cloud-init.yaml```ファイルを作成し、以下の内容を書き込むことでホストオンリーアダプタに割り当てるIPアドレスを固定化しました。

```yaml:IPアドレス固定化
network:
    ethernets:
        〔ホストオンリーアダプタのネットワークインターフェース〕:
            dhcp4: false
            addresses: [xxx.xxx.xxx.xxx/yy]
        〔NATのネットワークインターフェース〕:
            dhcp4: true
    version: 2
```
:warning:〔ホストオンリーアダプタのネットワークインターフェース〕及び〔NATのネットワークインターフェース〕は実際の環境に合わせて、書き換える必要あります。
　`ip addr`コマンドでネットワークインターフェース名を確認できます。

 :warning:[xxx.xxx.xxx.xxx/yy]は、固定で割り当てるIPアドレス値を設定します。
 　VirtualBoxで設定したゲートウェイのIPアドレス体系と合わせる必要あります。

  ## Firewallの設定
  Ubuntu ServerはデフォルトではFirewallが起動していないため、`sudo ufw enbale`で有効化しました。Firewallを起動すると、外部からの通信は遮断して、外部への通信は可能という状態になります。
  ハンズオンを進める上では不要な設定かもしれないが、セキュリティを意識した環境を構築することは大事ということでFirewallをActiveにしてみました。
  ハンズオン内で使用する以下のポートへの通信を許可します。
  ```bash:ハンズオンで使用するPortへのアクセス許可設定
  sudo ufw allow from 〔ホストマシンのIPアドレス〕 to any port 22,80,443,8080,8443,18080,18443 proto tcp
```

## Kuberntesクラスタの構築
書籍では、[Cloud-native-one-day-learning](https://github.com/cloudnativedaysjp/cloud-native-one-day-learning)のリポジトリが紹介されていますが、[cnd-handson](https://github.com/cloudnativedaysjp/cnd-handson/tree/cndw2024)のリポジトリの「Chapter_cluster-creater」章を参考にkubernetesクラスタ環境を構築しました。
こちらのリポジトリの方がIssueやCommitが直近で入っていてActiveだと思います。

https://github.com/cloudnativedaysjp/cnd-handson/tree/cndw2024/chapter_cluster-create

**Gateway API以外のコンポーネントをhelmfileコマンドで利用する際に、リソースアクセスで権限エラーとなったため、以下のように`sudo`コマンドを付けて実行してデプロイしました。**
```bash:Gateway API以外のコンポーネントをデプロイ
sudo helmfile sync -f helm/helmfile.yaml
```

それ以外のところは、[Cloud-native-one-day-learning](https://github.com/cloudnativedaysjp/cloud-native-one-day-learning)のリポジトリ通りに実行するとデモアプリを無事にデプロイしてホストマシンのブラウザからアプリへアクセスが可能となります。

![cloudnativehandson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/e4797f73-dd0a-c6a5-2cc0-fdf9e8dfab76.png)


# 番外編
途中、エラーや想定通りの動きにならなかった事象を紹介します。
明確な解決策は、見いだせていないですが、参考までにご紹介します。
**明確な解決策をお持ちの方は、コメント欄に記載いただけますと幸いです。**

## デモアプリのデプロイで権限エラー
デモアプリを`kube applay`した際に以下のようなエラーが出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/c49187d8-b8b9-aa75-a759-3d8b7e743eb6.png)

以下の記事を参考に`ingress-nginx-adminssion`を削除することで、デモアプリをデプロイできるようになりました！

https://qiita.com/magisystem0408/items/48bca4496962fd508556

## ホストのブラウザからアプリにアクセスできない
Ingress NGINX Controllerをデプロイしたけど、`ADDRESS`が割り当てられていないからアクセスできないのだと思いましたが、対処方法が分かっていません。

![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/4ad1d580-950d-ccd8-71bd-ceba69e75806.png)


ただ、ゲストマシンのリソース（ストレージサイズ）を大きくして上記方法で再度Kubernetes Clusterを再作成したら`ADDRESS`が割り当てられました。

# 最後に
ハンズオン環境がやっと構築できたので、少しずつ「クラウドネイティブ技術実践ハンズオン」を読み進めてクラウドネイティブ技術を習得していきたいなと思います。
ただストレージサイズが24GBでどこまで行けるか怪しいですが（笑）。
足りなくなったら、拡張しようかなと思います。

# 参考サイト
## Ubuntuの日本ダウンロードサイト
https://www.ubuntulinux.jp/ubuntu/mirrors

## UFWの設定について
https://qiita.com/teyama3/items/6bfe1db6328d3678fcf4

https://qiita.com/siida36/items/be21d361cf80d664859c

https://qiita.com/010Ri/items/f37f7f5fb35265823c7c

## ボリュームの拡張
https://qiita.com/mcyang/items/a32b914db073f308a3cb