このエントリはKubernetesアドベントカレンダー2014の13日目です。
今までさんざんKubernetes環境を構築することばかり考えてきたので、今日は使い方について考えます。
Kubernetesの使い方を考えるうえでのポイント
できること
Podを使って、複数のコンテナを同じMinion(物理サーバ)にまとめる- ダウンしたコンテナを再起動する
ReplicationControllerでPodの並列数を管理するServiceでエンドポイントを1つ用意し、各Podへのネットワークアクセスを一元的に管理する- 各
PodにはRoundRobinで振り分ける
- 各
- コンテナごとに利用するリソースリミットを設定できる(CPU、メモリ)
Podをヘルスチェックして、NGになったら切り離す
(今のところ)できないことと代替手段
- ダウンしたコンテナを、元のデータを引き継いで別の
Minionで起動する- GCEのPersistentDiskを駆使すればあるいは…
Podをヘルスチェックして、NGになったらfailoverするPodではなくServiceを複数つくればいける
- 特定条件に合致した場合に
Podを特定のMinionに配置するようスケジューリングする- ホストOSのスペックが異なる別Kubernetesクラスタを用意
- 同一
ReplicationControllerで別Podのコンテナ同士の通信- Kubernetesの想定範囲外なので無理
Kubernetesの特徴
Podを展開するのが得意- データに局所性をもたせるのは難しい
- 可用性の観点だと、restartはするけどfailoverはしない
Service配下にstatelessなAct-Actクラスタはうまくいく- failoverクラスタはうまくいかない
結論1
いまのところKubernetes単体だと使いドコロ難しい。
MySQLを使おうとした時のお悩み
ユースケースとしてMySQLを使うことを考えてみます。
ReplicationController で「MySQLは5台ね!」とかしてみたいですよね。
ダガシカシ…
レプリケーションスレーブ構築上のお悩み
ReplicationController で「MySQLは5台ね!」とすると、
ReplicationController 内で Pod を複数生成する形になる。
でもそれだと Pod ごと個別にIDが付与できないのが困る。
具体的にどう困るかというと、MySQLのserver-idが重複しないようにコントロールできない。
このあたりのクラスタグローバルなデータの管理はetcdでやるのが筋なので、server-idはetcdから取得するように仕込む必要があります。ちょっとつらみ。
マスター・スレーブ構成のお悩み
Kubernetesでは同じ ReplicationController 内であっても Pod 間の直接通信がうまく解決できないので、
MySQLでマスター・スレーブ構成にするためには、
guestbook exampleのRedisのように、
MySQLレプリケーションマスタ用の Service と ReplicationController 、
MySQLレプリケーションスレーブ用の Service と ReplicationController
を用意する形になります。
なんかダサい。
マスターの冗長化のお悩み
前項のとおりマスターとスレーブの ReplicationController を分ける都合上、
MHAやmysqlfailoverなどを利用してスレーブを昇格させる方法が使えないです。
これは困った…と思いきや、MySQLレプリケーションマスタ用のMySQLのための Service を2つ作成し、
その前段にHAProxyを置けばfailoverは実現できるかもしれません。
結論2
めんどくさい。 MySQLのクラスタをKubernetsで組むのは今のところやめたほうがいいです。
素直に、AWSならEC2かRDS、GCPならGCEかCloudSQLあたりを使いましょう。
じゃあKubernetesは何に使うのよ?
データの局所性の問題とかは分散環境の基本で鬼門だと思うので、まだちょっとそのへんに手を出すにはKubernetesはシンプルすぎるかなーという印象です。
GCEありきで考えると解決する問題がたくさんあるので、そのへんがポイントなのかなと思っています。
いいユースケースが浮かんだ方は教えてください。