kubernetes（OKE）に触ってみたかった

ただ触ることも難解だったkubernetes（OKE)
とりあえずapplyまで進めたので、これに至るまでに詰まったポイントをまとめる

## コンテナレジストリ（OCIR）にイメージアップすると、rootコンパートメントに作られる
[OralceCloudのチュートリアル](https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-beginners/#2ocir%E3%81%B8%E3%81%AE%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A8oke%E3%81%B8%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)中にハマった出来事
OCIRのリポジトリ名はコンパートメントによる垣根は無く、テナンシの中で一意である必要があるっぽい
そんな仕様が影響してなのか、OCIRにDockerイメージをアップロードするとなぜかrootコンパートメントに作られてしまう。

特定コンパートメントのOCIRにイメージをアップロードしたい場合は、事前にアップ予定のイメージ名を使ったリポジトリを作成しておくことで解決！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/3c23d5bc-6478-c2f7-33e2-feabc4bbcfe0.png)

アップ後にOCIR側でリポジトリを削除してしまうと
アップした側のイメージが消せなくなるので注意
```
Error response from daemon: conflict: unable to delete c6098c195dd0 (must be forced) - image is referenced in multiple repositories
```
やってしまったら`-f`オプションを使って強制的に削除することで解決！

## kubectlの設定
チュートリアルを進めるにあたって`kubectl`コマンドを扱う必要がある
cloudshellで進めない場合は、自前で環境を整える必要があった
チュートリアルをしっかり読めば書いてあるので、忘れずに。。。
kubectl導入公式ドキュメント
https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable

大体下記を実施すればOK
```
/// config用ディレクトリ作成
mkdir -p $HOME/.kube

/// 変数を設定
export KUBECONFIG=$HOME/.kube/config

/// 公式からkubectlを取得
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"

/// 実行権限を付与
chmod +x ./kubectl

/// bin配下に移動
sudo mv ./kubectl /usr/local/bin/kubectl
```
.kube/configは、「ローカルアクセス」を選択したあとに実行する諸々のコマンドを実行すると設定できる
　※パブリックな通信が必要な場合は`server:`を「APIパブリック・エンドポイント」に書き換える必要があるので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/028834c2-72f2-4e57-b711-6468ff566b74.png)

## ワーカーノードが永遠に「準備未完了」「NotReady」
これに関してはいまだに謎。解決できず
ノード内のkubeletは起動していた、ノードのリソースも潤沢、ネットワークはALL-PASS...
もっと知識があれば。。。
今後参考になりそうなサイト様
　※今回の事象とは違うけど、pendingではあったので

https://www.opensourcetech.tokyo/entry/20211207/1638884508


```
[root@03fd79ec479c ~]# kubectl get nodes
NAME            STATUS     ROLES   AGE    VERSION
10.130.25.133   NotReady   node    168m   v1.25.4
10.130.25.170   NotReady   node    169m   v1.25.4
10.130.25.87    NotReady   node    125m   v1.25.4
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/26d197e4-78d3-6363-1db5-d4a158c79721.png)

同じ設定でクラスタ（OKEごと）を作り直したら正常に作成できたので運が悪かったと思うしかない
（誤字ってクラスタ名に「^」を入れてたから変な挙動になっちゃった説が濃厚だけど、だったら作成時に弾いてほしい。。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/8ca5d252-b774-9863-ecb3-8f70b75398ee.png)

診断シェルを実行してみた結果
```
[opc@oke-cq5lxkakytq-nizduohamxa-sgp6iembhoa-0 ~]$ sudo /usr/local/bin/node-doctor.sh --check
/usr/local/bin/oke-node-doctor.tar.gz does not exist.
Verified OK
pip requires Python '>=3.7' but the running Python is 3.6.8
INFO: Successfully downloaded node doctor.
pip requires Python '>=3.7' but the running Python is 3.6.8
Running node doctor...
PASS node health...
PASS DNS lookup...
SKIP kubelet cert rotation flag...
FAIL kubelet logs...
PASS iscsi health...
PASS service health...
PASS instance metadata...
WARN cloud-init version...
SKIP cloud-init status...
SKIP chef onboard status...
PASS image and instance info...
Command line error: one of the following arguments is required: --save --add-repo --dump --dump-variables --set-enabled --enable --set-disabled --disable
SKIP yum status...
FAIL flannel status...
FAIL coredns status...
FAIL proxymux-client status...
PASS kube-proxy status...
PASS pods in ImagePullBackOff...
PASS pods failed mounting volume...
SKIP proxymux client registration status...
PASS runc version...
PASS pod usage...
PASS br_netfilter module availability...

Signal 1: COREDNS_NOT_RUNNING
Description:
A coredns pod in the kube-system namespace was found, but was not running

Signal 2: FLANNEL_NOT_RUNNING
Description:
A flannel pod in the kube-system namespace was found, but was not running

Signal 3: PROXYMUX_CLIENT_NOT_RUNNING
Description:
A proxymux pod in the kube-system namespace was found, but was not running

Signal 4: KUBELET_FAILURES
Description:
There were error messages detected in the kubelet logs

Signal 5: CLOUD_INIT_CUSTOMIZED
Description:
Instance user_data is different from OKE native cloud init

Node doctor scan is complete. Report has been saved at /var/log/oke-node-doctor/oke-node-doctor-12712.log
```


## CrashLoopBackOffが発生
新しく作ったクラスタに対してやっとapplyしてみたら、今度はポッドにエラーが発生
```
[root@98a19bcec3db ~]# kubectl get pods
NAME               READY   STATUS             RESTARTS       AGE
7656bdd5c7-8zfxj   0/1     CrashLoopBackOff   6 (110s ago)   7m32s
7656bdd5c7-vz6cl   0/1     CrashLoopBackOff   6 (98s ago)    7m32s
```

ログを確認すると、フォーマットエラーと表記
```
kubectl logs 7656bdd5c7-8zfxj -c ＊＊＊
exec /usr/local/bin/httpd-foreground: exec format error
```


ChatGPTにエラーを貼ってみたら、互換性が無いと言われる
* 実行しようとしたバイナリファイルが、コンテナのOSと互換性がないことを示しています。つまり、otsuka-world コンテナのイメージに含まれている httpd-foreground が、コンテナが実行されている環境と互換性がないために失敗している可能性があります。

もしや　ArmCPU環境で作ったDockerイメージが悪いのか？
```
[opc@docker docker]$ uname -a
Linux docker 5.4.17-2136.314.6.3.el8uek.aarch64 #2 SMP Tue Dec 13 20:02:15 PST 2022 aarch64 aarch64 aarch64 GNU/Linux
```
と思って、別環境で同じDockerfileを使ってイメージを再ビルド
再ビルドしたイメージをOCIRに上げ直し、もう一度applyしてみると
正常に起動することを確認
```
[root@98a19bcec3db ~]# kubectl get pods
NAME              READY   STATUS    RESTARTS   AGE
77d995c9b9-jlsrl   1/1     Running   0          35s
77d995c9b9-qzq7v   1/1     Running   0          28s
```

結果
OKEはx64ベースのCPUでイメージをビルドしたものじゃないと正常に動かないことがわかった（もしかしたら、やり方があるのかも）
今後は、M1,M2MacやArm製CPUでの作業はこの点の注意が必要
もしくはマルチCPU対応したイメージを作っておくと良いのかもしれない

https://qiita.com/SuyamaDaichi/items/cadc31df50fd42689661

## まとめ
チュートリアル進めたら何かわかるかなぁと思いながら始めたけど
何もわからないままエラーに揉まれて時間だけが過ぎていきました。
もっと深掘りしたい、yamlを思うがままに書きたい