OCI（Always Free）上に、サービスメッシュ（Istio）の動作環境をまるっと一式構築する

# はじめに
年末のアドベントカレンダーは、途中で爆死しましたのぶこふです。
最近、サービスメッシュ関連に携わることが増えてきたので、環境を整えるところを整理していこうと思います。

「まるっと一式」とタイトルに書きましたが、コマンド一発で～とかの話ではないので、ご容赦願います。

# サービスメッシュとは？
とか、Istioとは？とか、OCIとは？とかは、Web上にたくさん情報があるので割愛します。

# 何をやるのさ？
* 対象読者
    * サービスメッシュ（Istio）を触りたいけど、環境構築とかどうすんねん？と言う人
* やること
    * 環境構築まで
    * ※ただし、OCIの申し込みなどは割愛します。動作環境はAWSのEC2とかでも良いと思います。そこらへんはお好みで、適宜読み替えてください。
* 構成
    * OCI上に、Minikube（K8s）を動かして、Isitoの動作を確認する

※お財布の都合上、Minikube を使用しています。
　本番環境とかでは、EKSとかGKEとか使うのが良いと思います。きっと。

### バージョンとか
|name|versionとか|
|---|---|
|Client|Windows11、Terminal（Ubuntu）からSSH|
|Server|OCI(Oracle Cloud Infrastructure) Always Free、Region：Osaka|
|OCI(Image)|Oracle-Linux-8.5-aarch64-2021.12.14-0※|
|OCI(Shape)|VM.Standard.A1.Flex|
|OCI(OCPU、Mem)|4core、24GB|
|minikube|1.25.1|
|Docker|20.10.12|
|Kubernetes|1.22.0|
|Istio|1.12.2|

※Armプロセッサのaarch64を使ってますが、Istioさんはどうやら非対応らしい。ので、少しハマりました。

# やるよ
## 対象サーバ（インスタンス）を起動する
OCIなら、「コンピュート＞インスタンス＞インスタンスの詳細」で「起動」を押せばOK。

## TerminalからSSH
```bash
ssh -i <secret-key-path> opc@<public-IP-address>
```
※そう言えば、OCIはPublicIPって固定されてるのかな？AWSだとElasticIPが必要だったりするけど・・・

## Docker
### インストール
Oracle Linuxなので、こちらを参照。
※Oracle Linux 6/7 をサポートって書いてあるんだが・・・8は対象外なのか
https://docs.docker.jp/engine/installation/linux/oracle.html

ということで、こちらを参照。（日本語に訳すと、URL等に全角文字が混ざるので、英語のママを推奨）
https://oracle-base.com/articles/linux/docker-install-docker-on-oracle-linux-ol8

```bash
sudo dnf install -y dnf-utils zip unzip
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

sudo dnf remove -y runc
sudo dnf install -y docker-ce --nobest
```

### Docker 有効化
```bash
systemctl enable docker.service
sudo systemctl start docker.service
```

### Docker 確認
```bash
$ sudo docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:44:33 2021
 OS/Arch:           linux/arm64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:14 2021
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

### 一般ユーザだけど、sudo無しでDockerコマンドを使う（オプション）
「毎回sudoつけても気にならないですよ」とか「そもそもRoot権限でやってるし」という方は、対応不要。

こちらを参照。
https://insilico-notebook.com/docker-run-without-sudo/

すでにDockerグループは出来ているので、作成は不要。
現在の実行ユーザをグループに追加するなら、下記コマンドでOK。

```bash
sudo usermod -aG docker $USER
newgrp docker

# 確認
docker info
```

## Minikube
### インストール
aarm64なので、ARM64です。
https://minikube.sigs.k8s.io/docs/start/

```bash
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64
sudo install minikube-linux-arm64 /usr/local/bin/minikube
```

### Minikubeの起動
ドライバーは「Docker」を設定しておきます
Istio v1.12 が対応している Kubernetesのバージョンは、1.19～1.22なので、指定しておきます。
https://istio.io/latest/docs/releases/supported-releases/#support-status-of-istio-releases

```bash
minikube start --driver=docker --kubernetes-version=v1.22.0
```

### 起動確認

```bash
$ minikube status
  minikube
  type: Control Plane
  host: Running
  kubelet: Running
  apiserver: Running
  kubeconfig: Configured
```

### Minikube のデフォルト値を設定
参考
https://qiita.com/loftkun/items/7400d5ae0e7b1fb7d26e

おっと、忘れちゃいけないことが一つありました。

Minikubeさんは、デフォルトのメモリ・CPUの割当てが貧弱（2core,2BG）なので、設定してあげます。
下記のコマンドでは、4core、20GBに設定しています。
なお、変更後は`minikube delete`が必要になります。
※起動時に、オプションで渡しても問題なしです（後述）

```bash
# 4core、20GBに設定
minikube config set cpus 4
minikube config set memory 20480

# 設定の確認
minikube config view
- driver: docker
- memory: 20480
- cpus: 4

# 削除します
minikube delete
# 起動します（ConfigでDriverの設定をしてあるので、オプションは不要）
minikube start　--kubernetes-version=v1.22.0
```

オプションで渡す場合

```bash
minikube start --memory=20480 --cpus=4 --kubernetes-version=v1.20.2
```

### エイリアスの設定（オプション）
これまでの流れを見ているならご存知だと思いますが、現在「kubectl」を入れてません。
じゃあ、どうやって触るのか？という話ですが、結論から書けば、下記のようにすればコマンドは打てます。

```bash
minikube kubectl -- #コマンド
# 例
minikube kubectl -- get po -A
```

ただでさえ、kubectlとぼちぼち長いコマンドを打っているのに、「minikube」とか「--」とか付けてらんないですよね。
ということで、エイリアスの設定。
「kubectl」に合わせて「kubectl」でも良いですし、OpenShiftに対抗して「k」とかでも良いと思います。
お好みで設定してください。とりあえず、本記事では無難に「kubectl」としておきます。

```bash
# alias一覧
alias

# aliasを設定する
alias kubectl="minikube kubectl --"

# aliasを解除する
unalias kubectl
```

### 動作確認（オプション）
動かしてみたい方は、Kubernetesのクイックスタートを参照
https://kubernetes.io/ja/docs/setup/learning-environment/minikube/#クイックスタート

## Istio
公式を参照・・・
https://istio.io/latest/docs/setup/getting-started/#download

と、思いましたが、Istioはarm64（=aarch64）環境では非対応なのですね・・・
下記サイトを参考にさせていただきました（本当に助かりました）。
https://zenn.dev/tkoyama/articles/c49b35c32e4923

:::note warn
Istioはarm64（=aarch64）環境では非対応のため、非公式のイメージを使用しています。
:::

### istioctlインストール
```bash
curl -L https://istio.io/downloadIstio | sh -
```

### istioインストール
```bash
# 通常版（arm64では失敗するので実施しません）
istioctl install --set profile=demo
```

インストール途中でScaleが必要になるので、別ターミナルを開いておく。

```bash
# arm64版
# Terminal-A
$ istioctl install --set hub=docker.io/querycapistio --set profile=demo -y
✔ Istio core installed                                                                 
✔ Istiod installed    
- Processing resources for Egress gateways, Ingress gateways. Waiting for Deployment...

# Terminal-B
$ kubectl scale deployment --replicas=0 istio-ingressgateway -n istio-system
$ kubectl scale deployment --replicas=0 istio-egressgateway -n istio-system

# Terminal-A
$ istioctl install --set hub=docker.io/querycapistio --set profile=demo -y
✔ Istio core installed
✔ Istiod installed # 下記が通った！！
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete
Making this installation the default for injection and validation.

Thank you for installing Istio 1.12.  Please take a few minutes to tell us about your install/upgrade experience! 
```

### ingressgatewayとegressgatewayのDeployment修正
```bash
# ingressgatewayのDeployment修正
kubectl edit deployment istio-ingressgateway -n istio-system

# egressgatewayのDeployment修正
kubectl edit deployment istio-egressgateway -n istio-system
```

### ingressgatewayとegressgatewayを再デプロイ
```bash
kubectl scale deployment --replicas=1 istio-ingressgateway -n istio-system
kubectl scale deployment --replicas=1 istio-egressgateway -n istio-system
```

### 確認
```bash
kubectl get pods -n istio-system
```

## おまけ
### Kialiインストール
```bash
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.12/samples/addons/kiali.yaml
```

# おわりに
ということで、Istioのインストールまで完了しました。
これで動かせる環境（しかも「無料！」）を手に入れたので、色々と触っていこうと思います。

Blockchainの時もそうでしたが、Oracleさんは太っ腹に提供してくれるので、とてもありがたいです。
→[Blockchainの時の記事](https://qiita.com/nobkovskii/items/e389c2f26fd186915fc1)

完全な余談ですが、`:::`で囲むと、InfoとかWarnとかの記載が出来るのですねー。
今回はWarnをつかってみました。
[Markdown記法 チートシートーNote 補足説明](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#note---%E8%A3%9C%E8%B6%B3%E8%AA%AC%E6%98%8E)

今回はここまでです。ありがとうございました。