yikegaya’s blog

yikegayaのブログ

kubenetes触ってみた(Mac上で動くとこまで)

kubenetes調べて軽く動かしてみたのでメモ。

  • Dockerfile、docker-composeは作れる

くらいのところから

  • kubenetesの基本的なリソースは理解
  • ローカル環境でWebサービス動かせる

というくらいまでは到達できたと思われ。

そもそもkubenetesはなんなのか

とりあえずWebアプリとかの開発環境をDockerで作ろうとするとdocker-composeで作るのが主流だが、本番環境の運用にdocker-composeをそのまま持ってこうとすると以下の理由で厳しい

  • docker-composeは単一のホストで動かす用なのでアプリとDBなどのミドルウェアが同じホストで動いてしまう
  • docker-composeはスケーリングとかロードバランスとかロギングなど本番環境運用に十分な仕組みがない

なので上記の問題を解決するためにswarmとかAWSのECSとかDockerを本番環境で運用するためのツールがいくつか存在するが、その中で現状一番人気があって将来性もありそうなのがkubenetesらしい。人気で需要が増えているけど学習コストが高い、難しいってのもよく聞く。

教材

まずチュートリアルやってみた。これはブラウザ上のエミュレータみたいなので全部動かせるし手軽なのはよかったんだけど、まだ物足りない感じはあったので本棚から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(MacWindows)で動かすことができる。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の上で基本的なところを動かすことはできて一旦気は済んだんだけど、実際にAWSGCP使って動かそうと思うとまたいろいろ考えることありそうだな。。リソースも上記以外にもあるし、kubenetes利用を便利にしてくれる周辺ツールも知る必要ありそうだし、複数Nodeで動かした時のネットワークとか難しそうだし監視の仕組みとか考えなきゃいけないことめっちゃ多そう。