Kubernetes(AKS)導入奮闘記〜その１〜

# 目次

 - **Kubernetes導入に至った経緯**
 - **参考にした書籍**
 - **学ばなければいけないことはたくさんある！**



# ◆Kubernetes導入に至った経緯
**[ドローンソリューションにおけるAzureサービスの活用](https://www.sensyn-robotics.com/news/microsoft-for-startups)**
このプレスリリースにより、サービスのインフラにkubernetesを採用したことが書かれているのですが、その詳細を公開できる範囲で説明したいと思います。

 - 元々Dockerコンテナで運用していた。  
 - docker-composeだったのでプログラムを更新するとサービス停止が避けられなかった。無停止で更新デプロイしたかった。  
 - サービスが５種類以上のコンポーネントに分かれていてそれぞれで負荷分散したかった。マイクロサービスっぽい構成にしたかった。  
 - 2018年6月にAzure Kubernetes Service(AKS)が日本リージョンで利用可能になった。  
    https://ascii.jp/elem/000/001/699/1699320/  
 - 2018年8月20日、Docker for MacがKubernetesを同梱した。  
    https://www.infoq.com/jp/news/2018/10/docker-desktop-kubernetes/  

## 元々Dockerコンテナで運用していた
自社サービス開発開始から１年くらいサービス本体の開発に関わっていなかったので、詳細はよく分かりませんが。。。

 - 最初はCentOSでdockerコンテナ運用していたらしい。(当時は他人事のように聞いていました)
 - CentOSだとイメージサイズも無駄に大きいし動作も遅いらしい。
 - Docker界隈では軽くてイメージサイズの小さい `Alpine Linux` をベースイメージに使うのが常識になりつつあるらしい。
 - 一部Ubuntu Linuxでなければならないコンポーネントがあったが、原則として `Alpine Linux` でコンテナイメージを作成し直していたらしい。

## docker-composeだったのでプログラムを更新するとサービス停止が避けられなかった

**「無停止で更新デプロイしたかった」** というのがkunbernetes導入に一番の目的だったと思います。
それまでのdocker-composeでの運用は、更新デプロイするのにいちいち、

```
$ docker-compose down
$ docker-compose up
```
しなければならないので、ダウンタイムが発生してしまっていました。
これではどんな会社でもサービス運用できませんね。kubernetesのようなまともなコンテナオーケストレーションツールの登場が待たれてたことは理解できます。

## マイクロサービスっぽい構成にしたかった
この要望はヒアリングから漏れていまして、、、焦りましたが、kubernetesはマイクロサービス化が非常に簡単で、その威力に驚かされました。後ほど詳述したいと思います。  

## Azure Kubernetes Service(AKS)が日本で利用可能になった
2018年6月にAzure Kubernetes Service(AKS)が日本リージョンで利用可能になり( https://ascii.jp/elem/000/001/699/1699320/ )、Azureクラウドを使用してサービス開発している会社だったので、この事実がkubernetesへの置き換えを後押したことは否めません。   

## 2018年8月20日、Docker for MacがKubernetesを同梱した
kubernetesらしきものがDockerに標準で同梱されて、なんとなくスイッチオンしたら自分のMacbookの動作が重くなって。。。
なんて、当時全然知らなかったのでいろいろ触って驚いていた記憶があります。まさかこのk8sを自分が導入することになるなんて思ってもみませんでした。
Dockerにおいてもkubernetesが標準オーケストレーションサービスになるのは確実になったので、いよいよ会社でも採用する可能性が高くなりました。

## 導入検討開始
以上のような経緯で、2018年の年末くらいに、なんとなく「kubernetesやりたいです」と安易に発言してしまったばかりに、後ほど大変な目に遇うことになります。



# ◆参考にした書籍
今回参考にした書籍は主に以下の4冊です。
2019年4月にkubernetesへのシステム切り替えを行った関係で、これ以降の出版物はあまり読んでいません。
書籍はあくまで技術の基本的な理解と全体把握が目的で、導入した後の詳細は実際にコマンドを打って作業した方がスキルアップにつながります。
要するに、実際に導入して日々運用している人間は書籍の知識を超えたところにいます。実務はお勉強ではありません。

 - 『Docker/Kubernetes 実践コンテナ開発入門』  
    https://www.amazon.co.jp/dp/B07GP1Q3VT  
    出版社: 技術評論社 (2018/8/25)   
 - 『Kubernetes完全ガイド impress top gearシリーズ』  
    https://www.amazon.co.jp/dp/B07HFS7TDT  
    出版社: インプレス (2018/9/21)  
 - 『しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識』  
    https://www.amazon.co.jp/dp/B07L94XGPY  
    出版社: 翔泳社; 1版 (2019/1/23)  
 - 『Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方 Software Design plus』  
    https://www.amazon.co.jp/dp/B07P8S2KQ4  
    出版社: 技術評論社 (2019/3/2)  

## 『Docker/Kubernetes 実践コンテナ開発入門』 
最初に買って読んだkubernetes関連本です。
とにかく「kubernetesは既に本番環境での運用に耐えうる技術だ！」というアピールが満載です。

 - Dockerの基礎から解説。
 - docker-compose/swarmの説明もある。なかなかkubernetesの説明がはじまらない。
 - docker-compose/swarmでMySQL Master/Slave構築など高度すぎるサンプルで初心者お断り。
 - クラウドサービスはGKE(Google Kubernetes Engine)。
 - 小さなdockerイメージの作成方法など、Alpine Linuxの説明もある。
 - 運用TIPSや負荷テスト(locust)の説明もある。
 - 独自Dockerレジストリの構築方法やCI連携(Circle CI)など高度な話題もある。

このように高度すぎる内容なため、初心者にはおすすめできません。
ベテランでも必要なのか否か？の記事があるので、まず目次を見てから買うかどうか決めた方がいいでしょう。
私はDockerの根本理解とAlpine Linuxの活用などの参考にしました。


## 『Kubernetes完全ガイド impress top gearシリーズ』 
とにかく全機能網羅を目標に2018年9月時点のkuberntesのエコシステムを含めた全体像を説明しようとしている本。
kuberntesの開発は非常に活発で速いので、もう既に現在では通用しない知識がたくさんあるかも。

 - 環境はローカルk8s(for Mac)/minikube/Google Kubernetes Engine(GKE)/Azure Kubernetes Service(AKS)/Elastic Container Service for Kubernetes(EKS)と多彩。
 - Dockerfileの書き方などDocker基礎解説あり。docker-compose/swarmの説明なし。いきなりkubernetes。
 - kubernetesの膨大な数のリソースをグルーピングして概念理解させようと工夫している。
 - Deployment/ReplicaSet/Podなどのアップデート戦略も説明されている。
 - Job/CronJobの説明はあるが、欠点であるCleanupされない問題の指摘はない。

kubernetesエコシステムの全要素を把握したい、辞書的に使いたい人にはおすすめですが、書籍は情報の陳腐化が早いので向いてないのかもしれません。
私は機能によるグルーピング概念が分類と頭の整理に役立ちました。


## 『しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識』 
はじめてkubernetesを学ぶ人に最適です。最初に買って読むべき本です。

 - 手書きのイラスト満載で、とにかくイメージを抱かせようと読者に説明している。
 - サンプルや説明環境はほぼ全て `Azure Kubernetes Service(AKS)` 。書籍表題の通りです。
 - 運用性とか安定性とか保守性とかインフラの高度な概念を説明しているけど、初心者には敷居が高い。
 - AKS Cluster Autoscalerなどの説明があるが、まだpreview段階で企業がサービス提供できる段階でないことの指摘がない。  
    2019/05/31現在でも未だにpreview段階。 https://docs.microsoft.com/ja-jp/azure/aks/cluster-autoscaler  
 - Kured(Kubernetes Reboot Daemon)などのAKS以外でも通用する技術の解説があり、Azure以外の利用者にもおすすめできる。

前半はイラストを駆使してkubernetesの基礎技術を解説しているので初心者に最適だが、後半はkubernetesの枠を飛び越えてインフラ全体の概念説明でレベルもグンと上がるので、前半だけ読んで後から必要に応じて読み直すのがいい使い方かな。


## 『Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方 Software Design plus』  
最近出版された本で、買ったままあまり読んでいません。

 - SecurityContext/PodSecuritypolicyにたいしてちゃんとした説明がある。
 - Promertheusでメトリクス情報収集してGrafanaで可視化する方法など説明されている。

ザッと目を通したかぎり上記のようなことが書いてありましたが、初心者向けとも思えないし、今後必要になったら読むつもりです。
もう書籍で入門する段階ではないですね。
SecuritypolicyとPromertheusを検討中なので今後読み返す可能性大。運用に強い内容の本です。

## 教訓
全て勉強してからはじめようとしない。完璧主義は捨てる。特にkubernetesの学習コストは高いのが有名で、全部理解しようなどと考えるのは無謀で挫折します。
この４冊を読み込むだけでも年末年始休暇も合わせて１ヶ月くらいかかっていますが、もっと早くkubernetesクラスタ構築して手を動かしながら書籍を読むべきだったなあと反省しています。


# ◆学ばなければいけないことはたくさんある！
実際に企業でインフラの仕事をするには、Dockerとkubernetesを勉強して理解するだけでは足りません。

 - MySQLを中心としたデータベース技術。SQLは分かっていた方がいいけど、DB運用関連技術の方が重要。
 - ネットワークの知識。サブネット作成やゲートウェイの構築＆設定もあるので、ネットワークに関する包括的な知識が必要。
 - ストレージに関する技術。クラウドBLOBストレージを含むストレージ技術全般の知識。特にkubernetesのストレージには「極力頼らない」ことが重要。
 - Docker自体Linuxカーネルのグルーピング機能なので「Linuxに関する技術」は十分理解している必要がある。OSやミドルウェアは苦手という態度は許されない。
 - ミドルウェアの技術。nginxとかPHPアプリケーションサーバとか。LAMPあたりの基本的なことは知っておかないと厳しい。
 - MVCなどのウェブアプリケーションフレームワーク技術。db migrateとか知らないとテスト環境構築もできません。

これらが分かっていないと現実に存在する情報システムのリプレースなんてできません。インフラエンジニアのベテランならいいのですが、新卒がこれらのことをコツコツと習得するのを待っていたら何年経ってもできるようになりませんね。大変な時代になりました。


# ◆次回
次回はいよいよ実際にkubernetesクラスタを作成して検証する段階です。