Oracle RAC on Kubernetes
JPOUG Advent Calendar 2017の9日目のエントリーです。
今回は Oracle RAC on Kubernetesについて書きます。
情報はKubernetes 1.7ベースです
Oracle RAC on XXを作る際に共通して考慮する必要があるのが
- 共有ディスク
- ネットワーク(マルチキャスト)
- ホスト名
- 名前解決
です。
- 共有ディスク
Kubernetes(docker含む)では「コンテナ内」からiscsiを扱うことは難しいため、nfsを使います。
- ネットワーク(マルチキャスト対応含む)
クラウド環境やコンテナ環境ではネットワークが一本しかない、固定IPを指定できない、マルチキャスト対応してない など様々な制約があります 。
これらの制約に対応する為、仮想ネットワーク(vxlan)を使います。vxlanはユニキャストモード使用します。
- ホスト名
一般的なホスト名変更方法(/etc/hostname 変更)でうまくいかないことが多い(再起動すると環境側でホスト名がリセットされたり、/etc/hostnameが編集不可だったり)ので、ホスト名を変更するサービスを作成して対応しています。
- 名前解決
クラウド環境やコンテナ環境側のDNSに仮想ネットワーク(vxlan)に対応したDNSレコードを追加出来ないことが多いので
各ノードにローカルDNS(dnsmasq)を作成し、本来のDNSにforwardしています
Oracle RAC on Kubernetesでは上記に加え、
- コンテナの配置
- コンテナ間の名前解決
- systemd
- 特権モード
- /dev/shm
で対応が必要です。
- コンテナの配置
1ホストにつき、1DBコンテナ起動してほしいのですべてのコンテナでcontainerPortとhostPortを同一にして1ホストにつき、1コンテナ起動するようにしています。
- コンテナ間の名前解決
コンテナ(pod)間で名前解決するにはsubdomainを使用する必要があるようです。(自信ないのでくわしい人教えて下さい)
- systemd
公式Oracle Linuxのイメージはsystemdが含まれていませんので、systemdが含まれたイメージを自作する必要があります。
- 特権モード
systemdやvxlanを動作させるために特権モード
(securityContext:
privileged: true)
でコンテナを起動します
- /dev/shm
デフォルトは64MBで、ASMインスタンスが起動出来ません。
そのため/dev/shmを1200mでマウントし直すsystemdサービスを作成して対応しています
手順は、今後以下URLで公開予定です
https://github.com/s4ragent/rac_on_xx/tree/master/k8s
その他
JPOUG in 15 minutes #6で使用した資料(Oracle RAC on Docker)はこちら
https://www.slideshare.net/ohshimamasaki/oracle-rac-on-docker
手順はこちら
https://github.com/s4ragent/rac_on_xx/tree/master/docker