uiuifree.com

- サイト制作のノウハウと最適化を目指して-

2020.10.13「Kubernetesで実践するクラウドネイティブDevOps」を読んでみた

「Kubernetesで実践するクラウドネイティブDevOps」を読んでみた

今回は「Kubernetesで実践するクラウドネイティブDevOps」を読んでみました。

なぜ読んだのか

kubernetesを社内で導入しようとした時に、ひたすら情報を集めてた時にたどり着いた一冊でした。本番環境への導入のための運用ルールなどを決めたり、導入時に気をつけなければいけないことなど記述されていたので購入を決めました。

筆者のエンジニアスキル

  • Kubernetesを学び始めてる
  • Kubernetesを社内や本番環境で運用したいと考えてる
  • アプリケーションエンジニア
  • インフラ知識は最低限、AWSでVPC/NAT設定したりネットワーク周りの設計は可能

この本で学べること

並行して「Kubernetes完全ガイド 第一版」と「RancherによるKubernetes活用完全ガイド」を読んでいましたが、これらと違って運用で気を付ける点などの知識が詰まっていて初期導入〜運用ルールを作る段階で必要なことを学べました。

この本を読んでも学べなかったこと

これら3冊を読んでも導入が間に合わなかったのがログ周りの管理です。Fluentdをサイドカーとして立ち上げて運用すれば良いということまではわかったのですが、実際どう立ち上げ設定するのか現段階の知識では理解できませんでした。

第1章 クラウドでの革命

第1章では社内で目指してるクラウドネイティブの特製についても触れていました。

  • 自動化可能
  • ユビキタスかつ柔軟
  • 弾力的かつスケーラブル
  • 動的
  • 観測可能
  • 分散化

内容も納得感がありチームにメリット感を伝える時に役立ちました。 開発をしているとインフラに知見があるメンバーと無いメンバーが顕著にわかれますが、「DevOpsを導入することで境目が無くなっていく、できないと取り残されていく」ってのも、開発業界あるあるですね。コンテナやTypeScriptが流行ってきた辺りからキャッチアップしないと開発すら円滑に進めれなくなったり。

第2章 Kubernetes最初の一歩

Dockerのビルド方法〜kubectlを使ってコンテナを起動させる方法の紹介

第3章 Kubernetes環境の選択

この章ではクラスタのアーキテクチャについて解説しています。 RancherからKubernetesの理解を進めた筆者にとって「etcd」「Control Plane」「Worker ノード」の役割、特にコントロールプレーンについて曖昧だった認識が明確になりました。 「信頼するも検証を怠らない」、運用検証の段階で実際にRancherでNodeを削除したり復活させたりでアプリケーションがどう落ちるか、etcdサーバーが落ちたらどう復活するか等試していました。 「異常検知したら復活!」と予定してたけど実際落とすと復活しなかったりコネクションエラーでNodeを消せなくなったり。

  • 高可用性は必須
  • クラスタをセルフホスティングせずにマネージドサービスを使え

第4章 Kubernetesオブジェクトの基本操作

Pod / Deployment / Serviceなどのyaml操作についての説明

第5章 リソースの管理

この章では今までの開発経験で全く触れてこなかったリソースについて紹介されています。 Kubernetesではコンテナを立ち上げる際にCPUメモリの最小と最大を設定します。特にメモリはどのスライドをみても必須と言っており、メモリはマシンが落ちる可能性がでるので最小と最大を同じにしても良いと聞いたことがあります。実際テスト環境で検証しているとホストのマシンが頻繁に落ちる現象がありましたが割り当てをすると無くなりました。

  • コンテナを小さく保つ
  • サービスで求められる処理能力とビジネス要件の定義
  • レプリカ数は少なくできるか

第6章 クラスタの運用

「ノードの典型的なインスタンスサイズは1CPUと4GBのメモリ」と書かれていましたがAWSにこのサイズがないのが残念。

  • 本番だけが本番
  • 高可用性を持たせるためにはDeploymentに複数のPodを指定

第7章 Kubernetesの強力なツール

kubectlについてのコマンド解説、ツールといえばyamlを管理する時に教えてもらったのがkustomizeでDEV/PRDやバッチサーバーなど一部の差分だけを変更したいときに有効に使えました。

第8章 コンテナの実行

latestタグが最後にpushされたタグが自動的につくというのが初耳でした。普通に危ないので二度と使わない。

  • コンテナでrootを禁止するべき
    • Pod間のデータのやり取りはボリュームマウントでデータを共有する

ボリュームマウントといえばrockを使って分散ストレージを作れるという話を聞きましたが実際使い勝手どうなんでしょう?EBSだと複数のノードから読み書きできないし何かしら分散ストレージを組む必要はありそう。

第9章 Podの管理

  • Label付でリソースの一意の管理をする
  • バッチ実行はJobCronJob
  • Ingressでサービスをルーティング

CronJobも検証で使っていましたが、RancherOSでタイムゾーンを日本時間にする方法が無く諦めて9時間ずらして運用しました。

第10章 設定と機密情報

環境変数はConfigMapやSecretを使って管理します。Secretは暗号化されておりpodの出力で表示されません。

第11章 セキュリティとバックアップ

  • 本番で使うコンテナは全てスキャンツールを使うべき
  • クラスタの状態は常に外部バックアップをとっておくべき

第12章 Kubernetesアプリケーションのデプロイ

Helmについて記述されていましたが、今回不要そうな内容のため読み飛ばし

第13章 開発ワークフロー

アプリケーションのデプロイ方法について紹介されています、私のチームではECSからの引き継ぎでブルーグリーンデプロイでの運用をしていました。ローリングデプロイにしようかなと検討してる部分が、リソースの予約との関連です。 ブルーグリーンの場合、podが全て揃ってからデプロイするため設定しているリソースの倍CPUとメモリの確保が必要になってきます。その点、ローリングデプロイだと準備した段階からリリースをしてくれるので余剰リソースが少なくてすみます。

第14章 Kubernetesにおける継続的デプロイ

CICDについてはRancherのpipelineを使ってるので読み飛ばし、検証中にRancherの最新バージョンが2.5.0にからfleetを使ってね。ってなってるけど全く使い方わからず(情報待ち) pipelineもプロジェクト単位でリソース食うので早めに移行はしたい。

第15章 オブザーバビリティと監視

ログはインシデント発生してからのトラブルシューティングには便利

第16章 Kubernetesにおけるメトリクス

Kubernetesで役立つメトリクスの紹介

感想

最後ログ関連や監視については読み飛ばしてしまいましたが、この本を読んでると運用イメージを十分に得ることができました。rsyncでデプロイ、docker-composeで運用してる環境から一歩進みコンテナさえ作ればチームの誰でもサービスを立ち上げることができたり容易にバージョンアップやスケーリングを試せる環境までもう一歩です。インフラ環境変更するのって本当手間で勇気いりますよね、頑張ってここから抜け出しましょう。

この記事を読んでる人にオススメ