Kubernetes歴1週間の初心者から見た景色

機械学習のKubeflowというものに興味があってKubernetesの勉強を始めた。1週間くらい触ってみた感想をまとめてみる。

コメントや補足あれば遠慮せずどうぞ。Kubernetes歴〇年の先輩方お待ちしております。

## 1. 読み方がよくわからん

Kubernetesで最初に躓くポイントはおそらく読み方だろう。
**Kubernetes**そのものはGoogleの人が下記の通りTweetしているので統一されているはず。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/imdsm?ref_src=twsrc%5Etfw">@imdsm</a> <a href="https://twitter.com/gregde?ref_src=twsrc%5Etfw">@gregde</a> <a href="https://twitter.com/francesc?ref_src=twsrc%5Etfw">@francesc</a> <a href="https://twitter.com/jbeda?ref_src=twsrc%5Etfw">@jbeda</a> <a href="https://twitter.com/developerluke?ref_src=twsrc%5Etfw">@developerluke</a> most people on the team say: koo-ber-net-ees, or just &#39;k8s&#39; or k-eights</p>&mdash; brendandburns (@brendandburns) <a href="https://twitter.com/brendandburns/status/585479466648018944?ref_src=twsrc%5Etfw">April 7, 2015</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

問題はそのほかのKube◯◯◯ファミリーだ。ここは海外でも色々議論がされているが、決定打になりそうなTweetがいくつかある。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">kubectl is pronounced &quot;kube control&quot; not &quot;cube control&quot;. It&#39;s Kubernetes not Cube-rnetes. Regardless of whatever Brian Grant says. Don&#39;t @ me</p>&mdash; Ian Lewis (@IanMLewis) <a href="https://twitter.com/IanMLewis/status/1047648717329723392?ref_src=twsrc%5Etfw">October 4, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Canonical pronunciation of “kubectl” is kube-control, not kube-cuttle ... <a href="https://twitter.com/bgrant0607?ref_src=twsrc%5Etfw">@bgrant0607</a> keeping us honest as <a href="https://twitter.com/hashtag/KubeCon?src=hash&amp;ref_src=twsrc%5Etfw">#KubeCon</a> last keynote speaker. Reminds of Bill Shannon for JEE va <a href="https://twitter.com/hashtag/JavaEE?src=hash&amp;ref_src=twsrc%5Etfw">#JavaEE</a> ;) <a href="https://t.co/dAo5gc5pMj">pic.twitter.com/dAo5gc5pMj</a></p>&mdash; Arun Gupta (@arungupta) <a href="https://twitter.com/arungupta/status/939168964411838464?ref_src=twsrc%5Etfw">December 8, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

結局のところあまり統一されていないようだ。ただYoutubeの動画を見ると、キューブ〇〇と発音している人が多い気がする。

僕は考えた結果、Kubernetesは明確に”ク”、それ以外は気持ちcuっぽく"クュ"[^1]と発音することにした。

[^1]: 九州の”キュ”ではなく、FuckYouの"キュ"。気持ち喉の奥の方で「ュ」を絞り出す感じで。


代表的なものをまとめるとこうなる。

単語|読み方|補足
---|---|---
Kubernetes|クーバネテス| koo-ber-nay'-tace
Kubectl|クューブコントロール|koob-control
Kubelet|クューブレット|-
Kubeadm|クューブエーディーエム|-
KubeCon|クューブコン|-


## 2. 学習コスト、特に初期コストが高い
参考書やWeb上の入門記事を読むと最初はひたすら環境構築から始まる。
正直「Kubernetesって結構めんどくさいな」と思ってしまう人が多数だろう。
僕もその一人だった。

もし今その時の自分にアドバイスを送れるならこうだ。
**"kubectlが出来るようになるまで何とか頑張れ"**

kubectlが出来るようになればKubernetesの世界での可動域がぐっと広がる。極端なことを言ってしまうとkubectlでyamlファイルをゴニョゴニョするところからがスタートラインだと思う。

[Introduction · The Kubectl Book](https://kubectl.docs.kubernetes.io/)

Kubernetesを触る前はダッシュボード[^dashboard]とかでクールに操作できると思っていたが、現実はコマンドをいろいろ送信するという地味な作業だった。

[^dashboard]: 各メトリクスを確認するダッシュボードはあるみたいなんだけど


## 3. kubectl apply したときに成功したかどうかわからない
さぁ、ようやくkubectlというスキルを身につけたが、次の問題にぶつかる。

```shell
▶kubectl apply -f xxxxxx.yml
pod "xxxxxx" created!
```

やったー！成功だ！どれどれ確認してみよう。

```shell
$kubectl get pod
NAME                         READY   STATUS         RESTARTS   AGE
nginx-pod                    0/1     ErrImagePull   0          6s
```

**ErrImagePull！でうまく起動していない！！**

どうやらDockerイメージのpullが失敗しているようだ。

kubectlのapplyが成功したからといって本当に動いているかどうかは保証されない。結局`kubectl get xxx`して確認しないとダメらしい。

ついでに各リソースを消す時も

```shell
▶kubectl delete -f xxxxxx.yml
pod "xxxxxx" deleted
```

とだけ表示されるだけだ。
ホントに全ての関連リソースが消えたのか？依存関係で不具合が起きないか？自分で確認しないといけないのか…

## 4. yamlの書き方がわからない
yamlファイルを自分で書けば、コンテナの設定や構成を自由に制御できるのはわかったぞ。早速書いてみよう。
とりあえずサンプルコードを確認…

```yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

```

コンテナ３つで…
LBをつけて…
あとはコンテナイメージも自分の作ったやつにしないとなぁ…

**んー…どこをどう直せば良いんだ？**

Githubかどこかでyamlファイルが配布されていればサルでも環境構築できる。
だが、自分で書こうとするとまずどこにどう手をつければいいのか途端にわからなくなる。

この書き方で大丈夫？
矛盾とかないか？
こんな簡単で大丈夫？

そもそも宣言型管理に慣れていないから、初手が指せないんだよなぁ。

特にapiversionはそもそもそれが何なのかわかっていないので、一行目からどうすればいいのかわからなかった。

結論としては
`kubectl api-resources `
で自分の作りたいリソースに応じて確認すると言うことらしい。[^2]

[^2]: [Kubernetesの apiVersion に何を書けばいいか - Qiita](https://qiita.com/soymsk/items/69aeaa7945fe1f875822)この記事が参考になりました。感謝。

色々探しているうちに[Kubernetes YAML Validation](https://kubeyaml.com/)というサイトを発見した。めちゃ便利。

![kubeyaml.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166931/b3ed983e-ebba-bcee-e926-04bfe669b639.png)


## 5. 具体的なデモが少な過ぎる

yamlファイルの作法はわかったし、頑張れば色々自分でカスタマイズできそうだというのはわかった。だが、自分の描く構成をyamlファイルに落とし込むにはどうすればいいか、まだまだ具体的なイメージがわかない。

**なんか良さげなデモはないのか？**

企業での導入事例はたくさんあるけど、具体的にどういう設定or構成でやればいいのかは謎に包まれている。
初心者的に見たいのはyamlファイルの書き方とかdockerファイルの中身の方だ。コンテナのポートの開け方とか。kindの指定とか。

Nginxをデプロイしてデモ画面を表示する。ほうほう、それで終わり？
それだけではkubernetesの凄さがわからない。
自動ヒーリングやスケーリングをさせるデモとかないかね。


## 6. クラウドマネージドサービスとの連携が難しい

Kubernetesはオープンソースなのでいろんなクラウドでサービス化されている。

今回はAWSのEKSというマネージドサービスを触ってみたが、Route53やVPCの設定はめんどくさかった。CloudFormationで環境構築は自動化出来るとはいえ、Kubernetes初心者はどんなリソースが何のために作成されるのかを理解しなければならないので結局時間がかかる。

**あと認証周りは本当にめんどくさい。**オープンソースを持ってきてそのままくっつけた合体ロボ状態だ。ドキュメントも未整備で体系的にまとまっていない気がする。ここらへんはやっぱりGCPの方がスマートに使えるのだろうか…？


下記のワークショップで一通りの作業は紹介されているが、AWSの基礎知識がある程度身についている人向け。

[Amazon EKS Workshop :: Amazon EKS Workshop](https://eksworkshop.com/)

![eksworkshop.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166931/8d49e84e-2916-c898-5455-c74b10ee7427.png)

ALBの設定とか未だによくわからないので要勉強。


## 7. コスト感覚が掴みにくい
これまたEKSで申し訳ないが、Kubernetesを使うとEC2やらCloudWatchやらいろんなリソースが複合的に生成される。

**それ一体いくらくらいかかるんだ？**

EBSとか一緒に消えるの？自動ヒーリングとか言ってゾンビみたいに復活しないよね？

yamlファイル一撃でいろんなリソースが生成されるので、コスト感覚が把握しづらい。
おそらくここはGCPだろうがAzureだろうがIBMだろうがAlibabaだろうが変わらないところだと思う。

yamlファイルでリソースに自動でタグ付け出来ればコストの追跡もしやすいが…

ここも今後調査しないといけないところか。


## 8. 情報の陳腐化が速い
色々勉強してきて最終的に思ったのがこれだ。

**この知識いつまで通用するの？**

Kubernetes自体の開発サイクルが速いため、ウェブ上の入門記事や参考書はトコロドコロ古い部分がある。
毎月のようにミートアップがあるし、Slackの投稿も鬼のように溜まる。正直ついていくの結構キツい…

頑張って身につけた知識が一年後には「あ、それもう使えませんよ。こっち使ってください。」となってしまいそうだ。

これはkubernetesに限ったことではないと思うが、Qiitaの記事や個人のブログを盲目的に信頼するのは良くないと実感した。[^3]

きっとこの記事自体もすぐに陳腐化してしまうのだろう。

当たり前だが、一番信頼できるのは公式ドキュメントだ。

公式ドキュメントを読もう。
[Kubernetesドキュメント - Kubernetes](https://kubernetes.io/ja/docs/home/)



[^3]: Qiitaではしっかりと「上部に出てくるこの記事は〇〇年前のものです」と出てくるから素晴らしい。