kubenetes調べて軽く動かしてみたのでメモ。
- Dockerfile、docker-composeは作れる
くらいのところから
- kubenetesの基本的なリソースは理解
- ローカル環境でWebサービス動かせる
というくらいまでは到達できたと思われ。
そもそもkubenetesはなんなのか
とりあえずWebアプリとかの開発環境をDockerで作ろうとするとdocker-composeで作るのが主流だが、本番環境の運用にdocker-composeをそのまま持ってこうとすると以下の理由で厳しい
- docker-composeは単一のホストで動かす用なのでアプリとDBなどのミドルウェアが同じホストで動いてしまう
- docker-composeはスケーリングとかロードバランスとかロギングなど本番環境運用に十分な仕組みがない
なので上記の問題を解決するためにswarmとかAWSのECSとかDockerを本番環境で運用するためのツールがいくつか存在するが、その中で現状一番人気があって将来性もありそうなのがkubenetesらしい。人気で需要が増えているけど学習コストが高い、難しいってのもよく聞く。
教材
前にDockerの勉強しようと思って買った本。
Udemyの講座 www.udemy.com
まずチュートリアルやってみた。これはブラウザ上のエミュレータみたいなので全部動かせるし手軽なのはよかったんだけど、まだ物足りない感じはあったので本棚からDocker/Kubenetesの本出してkubenetesのくだりだけ読んでみた。
ただ手を動かすには個人的にオンライン講座の方が快適なのでUdemyも受講してみた。この中だとUdemyが一番おすすめな感じ。
kubenetesのリソース
kubenetesにはリソースっていうkubenetesのオブジェクトの単位?というか部品?みたいなものがあってこれを1つ1つコマンドかymlファイルから作成して環境を作っていく。このリソースの理解がkubenetesの基本的なところっぽい。
以下基本的なリソースのメモ
リソース | 説明 |
---|---|
Node | ホストのサーバ |
Pod | コンテナの最小単位 |
ReplicaSet | コンテナの集合体、Podのラッパー |
Deployment | ReplicaSetの世代管理。Blue/Greenデプロイ的なことができる。RelicaSetのラッパー |
Service | Podはそのままだとクラスタ外からアクセスできない。このServiceをpodに当てるとアクセスできる |
Ingree | Serviceはレイヤー4での公開なのでURLのパスで振り分けたりできない。のでServiceに対してさらにL7のIngressの設定が必要 |
ConfigMap | 環境変数をPodに渡す |
Secret | ConfigMapみたいなものだけどBASE64エンコードされる。BASE64エンコードは暗号化ではないのでこれだけだと安全ではない |
PersistentVolume | Podが使うストレージのサイズや種別の定義 |
PersistenVolumeClaim | 名前の通りPersistentVolumeを要求(Claim)し動的に確保するための仕組み |
他にもいろいろあるっぽいけど基本はこの辺り。Node以外はdocker-composeと同じようにymlかjson(ymlが推奨)でインフラのコード化ができる。で、そのymlをgitで管理するっていう辺りはansibleとかと同じ感覚で良さそう。
やったこと
Udemyの講座の通りにローカル環境でコマンド打ってみた。
セットアップ
まずPCにvirtual boxをインストールして
brew install minikube minikube start --driver=virtualbox
でminikubeというシステムを使ってデモ環境を作れる。Virtual boxを使うけどコマンドは普通にホストOS(Mac、Windows)で動かすことができる。virtual boxは他の仮想環境でも代替可能。
環境を作った後は以下のように各リソースを作って動作確認してUdemyの添付のWebアプリをkubenetes上で動かしてブラウザからアクセスするところまで試した。
kubectl run \ --port 8080 \ --image gcr.io/google-samples/hello-app:1.0 \ --restart Never \ --dry-run \ -o yaml \ helloworld > pod.yaml kubectl apply -f pod.yml
こんな感じでkubectlでリソースを作成、操作してさらに--dry-run -o yaml オプションをつけてコード化していく。基本各リソースでこれを繰り返して環境を作るのがやったこと。
今後
macの上で基本的なところを動かすことはできて一旦気は済んだんだけど、実際にAWSやGCP使って動かそうと思うとまたいろいろ考えることありそうだな。。リソースも上記以外にもあるし、kubenetes利用を便利にしてくれる周辺ツールも知る必要ありそうだし、複数Nodeで動かした時のネットワークとか難しそうだし監視の仕組みとか考えなきゃいけないことめっちゃ多そう。