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
Oracle Linux 7でyumコマンド実行時の注意点
本エントリとは直接関連しませんが、まずは宣伝から。
宣伝その1
JPOUGのイベントが11月17日にあります
http://www.jpoug.org/2017/09https://jpoug.doorkeeper.jp/events/65435
テーマは「Docker」。Dockerized Sessionのみです。
今回は私も、Oracle RAC on Dockerというタイトルで登壇致します。まだ席に余裕がありますので、興味がある方は是非。
宣伝その2
今年もAdvent Calendaerやります
https://jpoug.doorkeeper.jp/events/67051
一年の終わりにOracleというキーワードで記事を書いてみませんか?
ここで本題です。
Oracle Linux 7で環境構築するときにCentOS7の手順を参考にすると思いますが、たまにyum コマンドでそんなパッケージないよ とエラーがでるときがあります。
そんなときは
--enablerepo=ol7_addons --enablerepo=ol7_optional_latest
をつけて実行します
自分もちょいちょい忘れて、ドハマリするのでメモ用でした
Google Compute EngineでNested KVMを使えるようにする
本エントリとは直接関連しませんが、まずは宣伝から。
JPOUGのイベントが11月17日にあります
http://www.jpoug.org/2017/09
テーマは「Docker」。Dockerized Sessionのみです。
今回は私も、Oracle RAC on Dockerというタイトルで登壇致します。
まだ席に余裕がありますので、興味がある方は是非。
さて本題です。
Microsoft Azureに続き、Google Compute EngineでもNested VMが可能になったようです。
https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances
今回は、Google Compute EngineでNested KVMを試してみようかと思ったのですが、
上記URLを見る限り、そのままではNested KVMはつかえないようです。(専用のイメージ作成が必要)
そこで、Nested KVMが使えるイメージを作成します。
作成手順は以下です。
1.仮想化用のライセンスキーを割り当てて、カスタムイメージを作成 今回は、ubuntu 16.04を使用します
gcloud compute images create nested-test --source-image-family=ubuntu-1604-lts --source-image-project=ubuntu-os-cloud --licenses https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx
2.カスタムイメージからVMインスタンスを起動
gcloud compute instances create testvm --machine-type g1-small --network "default" --can-ip-forward --maintenance-policy MIGRATE --scopes "https://www.googleapis.com/auth/devstorage.read_write,https://www.googleapis.com/auth/logging.write" --image nested-test --boot-disk-type "pd-ssd" --boot-disk-device-name testvm --boot-disk-size 200 --zone us-central1-c
3.VMインスタンスに接続し、必要なパッケージをインストール
sudo apt-get update
sudo apt-get install kvm virt-manager libvirt-bin bridge-utils
lsmod でkvmがロードされていればKVMが使用出来るはずです。
Oracle RAC on Docker
JPOUG Advent Calendar( https://jpoug.doorkeeper.jp/events/53797 )と Docker Advent Calendar2 (http://qiita.com/advent-calendar/2016/docker2 )の4日目です。
Oracle RAC on Dockerの作成スクリプトをgithub(https://github.com/s4ragent/rac_on_xx)で公開していますので、その紹介です
概要
- 基本情報
- | - |
---|---|
OS(イメージ) | Oracle Linux 7.2 |
Storage | NFS4 with Flex ASM |
L2 実装方式 | vxlan |
DNS | 各コンテナ上にdnsmasq |
- Network 情報 (3-nodes RACの場合)
hostname/container name/vip | eth0 | vxlan0(public) | vxlan1(internal) | vxlan2(asm) |
---|---|---|---|---|
storage | 10.153.0.50 | - | - | - |
node001 | 10.153.0.51 | 192.168.0.51 | 192.168.100.51 | 192.168.200.51 |
node002 | 10.153.0.52 | 192.168.0.52 | 192.168.100.52 | 192.168.200.52 |
node003 | 10.153.0.53 | 192.168.0.53 | 192.168.100.53 | 192.168.200.53 |
node001.vip | - | 192.168.0.151 | - | - |
node002.vip | - | 192.168.0.152 | - | - |
node003.vip | - | 192.168.0.152 | - | - |
scan1.vip | - | 192.168.0.31 | - | - |
scan2.vip | - | 192.168.0.32 | - | - |
scan3.vip | - | 192.168.0.33 | - | - |
- Storage 情報
Diskgroup name | use | asm device path | redundancy | size(MB) | size(MB)(3-nodes RACの場合) |
---|---|---|---|---|---|
VOTE | ocr and voting disk | /u01/oradata/vote.img | external | 5120 + ( num_of_nodes * 1024 ) | 8192 |
DATA | Database files | /u01/oradata/data.img | external | 5120 + ( num_of_nodes * 1024 ) | 8192 |
FRA | flash recovery area | /u01/oradata/fra.img | external | 5120 | 5120 |
必要なもの
- ubuntu/debian(Kernel 3.18 or later), CentOS/RHEL/OEL 7.2
- docker 1.12
- ansible 2.0 or later
- Oracle 12c Release 1 (12.1) Clusterware and Database software
- 1コンテナにつき、1core CPU および 4GB Memory
注意
各コンテナはprivilegedモードで起動するため、 検証環境でのみ使用してください
インストール方法
git clone https://github.com/s4ragent/rac_on_xx
使いかた
Oracle 12c Release 1 (12.1) Clusterware とDatabase software をdocker hostにダウンロード/展開します
#mkdir -p /media
#unzip linuxamd64_12102_database_1of2.zip -d /media
#unzip linuxamd64_12102_database_2of2.zip -d /media
#unzip linuxamd64_12102_grid_1of2.zip -d /media
#unzip linuxamd64_12102_grid_2of2.zip -d /media
#ls -al /media
total 16
drwxr-xr-x 4 root root 4096 May 1 21:56 .
drwxr-xr-x 3 root root 4096 May 1 21:53 ..
drwxr-xr-x 7 root root 4096 Jul 7 2014 database
drwxr-xr-x 7 root root 4096 Jul 7 2014 grid
dockerutil.sh runall を実行します (optionつけない場合は 3-nodes RACを作成します)
##create 3-nodes RAC#
#cd rac_on_xx/docker
#bash dockerutil.sh runall
5-nodes RACを作成したい場合は以下
##create 5-nodes RAC#
#cd rac_on_xx/docker
#bash dockerutil.sh runall 5
その後、最初のコンテナ(node001)にログインしたい場合は以下
#docker exec -ti node001 /bin/bash
最初のコンテナ(node001)でORACLEのコマンドを実行したい場合 (例. crsctl status res -t)
#docker exec -ti node001 /u01/app/12.1.0/grid/bin/crsctl status res -t
最初のコンテナ(node001)を停止したい場合
#bash dockerutil.sh stop 1
ストレージ用のコンテナ(storage)を停止したい場合
#bash dockerutil.sh stop storage
最初のコンテナ(node001)を起動したい場合
#bash dockerutil.sh start 1
コンテナを全て起動する場合
#bash dockerutil.sh startall
コンテナを全て削除する場合
#bash dockerutil.sh deleteall
制限事項
docker save非対応
guacamole を使う その3 (docker SSL対応編)
本エントリとは直接関連しませんが、まずは宣伝から。
https://jpoug.doorkeeper.jp/events/51429
まだ席に余裕がありますので、興味がある方は是非。
ここからが本題です。
今回もその1,2から続きguacamoleです。
2の手順でも十分問題なく、使えるのですが、ゲートウェイサーバを外部に、置いたりする場合
通信をSSL化したい場合があります。
手順そのものは、以下のURL(guacamoles公式サイト)にあるので、そう難しくはないのですが、
http://guacamole.incubator.apache.org/doc/gug/proxying-guacamole.html
今回はその2に引き続きDocker コンテナで完結させたいと思います。
その2で作成したコンテナがそのまま起動していることを前提とします
#コンテナの作成
docker run --name nginx --link guacamole:guacamole -d -p 443:443 nginx
#nginxコンテナにログイン
docker exec -ti nginx /bin/bash
#オレオレ証明書の作成(ブラウザで証明書のエラーが出ても気にしないことにします)
cd /opt/nginx/certs
openssl genrsa -out server.key 4096
openssl req -new -batch -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
#nginxのconf作成
cat > /etc/nginx/conf.d/default.conf <<'EOF'
server {
listen 443;
ssl_certificate /opt/nginx/certs/server.crt;
ssl_certificate_key /opt/nginx/certs/server.key;ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";location /guacamole/ {
proxy_pass http://guacamole:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
access_log off;
}
}
EOFexit
#nginx コンテナの再起動
docker stop nginx
docker start nginx
上記設定後、ブラウザから以下のURLへアクセスするとguacamoleにログインできます
guacamole を使う その2 (docker DB連携なし編)
本エントリとは直接関連しませんが、まずは宣伝から。
https://jpoug.doorkeeper.jp/events/51429
まだ席に余裕がありますので、興味がある方は是非。
ここからが本題です。
今回もその1から続きguacamoleです。
その1ではCentOS7+yumでのインストール方法を紹介しましたが、
yumからですと、最新版ではなく、少々古いバージョンのインストールとなります。
このエントリのようにdockerを使うのがお手軽です。
基本的には、公式ドキュメントに記載の方法でよいのですが、
公式ドキュメントの方法では、DB連携(MySQL/PostgreSQL)前提となってしまいます。
DB連携するほどでもない(またはリソースケチりたい場合)は
今回紹介する手順になります。
<構成>
・OS CentOS7.2
・docker 1.12
・guacd/guacamole (tomcat) 別コンテナ
・guacd/guacamole 0.9.9(執筆時点)
・DB連携なし
<インストール方法>
#guacamoleのパスワードをmd5hashで取得
#ここではguacamoleには、gucauser/Guac123!でログインすることとする。
#echo -n 'Guac123!' | md5sum | awk '{print $1}'
#6e9b83fc538318184ca185a44c06d235
#コンテナの起動
#docker run --name guacd -d glyptodon/guacd
#docker run --name guacamole --link guacd:guacd -d -p 8080:8080 glyptodon/guacamole /bin/sh -c "cd /usr/local/tomcat && exec catalina.sh run"
#コンテナ内で操作
#docker exec -ti guacamole /bin/bash
#mkdir -p /root/.guacamole
#cat > /root/.guacamole/guacamole.properties <<'EOF'
guacd-hostname: guacd
guacd-port: 4822
EOF
#user-mapping.xml(認証情報)の編集
#ここではguacamoleには、gucauser/Guac123!でログインすることとする。
#接続先は適宜編集してください#接続先は guacdコンテナからみた接続先であることを注意
#docker ホストに接続するようにしたいのであれば、
#locahostではなく、docker ホストのIP(通常 172.17.0.1)にする
#cat >/root/.guacamole/user-mapping.xml<<'EOF'
<user-mapping>
<authorize username="guacuser" password="6e9b83fc538318184ca185a44c06d235" encoding="md5">
<connection name="doccker-host-ssh">
<protocol>ssh</protocol>
<param name="hostname">172.17.0.1</param>
<param name="port">22</param>
</connection>
<connection name="RDP">
<protocol>rdp</protocol>
<param name="hostname">localhost</param>
<param name="port">3389</param>
</connection>
<connection name="VNC">
<protocol>vnc</protocol>
<param name="hostname">localhost</param>
<param name="port">5901</param>
</connection>
</authorize>
</user-mapping>
EOF
#guacamole コンテナからログアウト
#exit
#guacamole コンテナ再起動
#docker restart guacamole
以下のURLでアクセスできます
guacamole を使う その1 (CentOS7+yum 編)
本エントリとは直接関連しませんが、まずは宣伝から。
https://jpoug.doorkeeper.jp/events/51429
まだ席に余裕がありますので、興味がある方は是非。
ここからが本題です。
本エントリは、Oracleから少し外れて、guacamoleというリモートデスクトップ・ゲートウェイの紹介です。
通常、LinuxマシンでGUI環境が必要な場合、vncviewer等で
接続する必要があります。
vncviewerをインストールすることが難しい場合もありますし、
他ネットワークだとするとvncのポートが解放されてなかったり
色々と面倒なこともしばしばあります。
そんなとき、非常に便利なのがguacamoleです。
http(s)ベースのリモートデスクトップ・ゲートウェイとして動作するため、
クライアント端末側には、ブラウザさえあればOKです。
(最新バージョン(0.9.9)ではiphoneからも操作できます)
https://guacamole.incubator.apache.org/
今回は、CentOS7(RHEL7/OEL7)での簡単なインストール方法を紹介します。
<構成>
・OS CentOS7.2
・guacd/guacamole (tomcat) 同一マシン構成
・guacd/guacamole 0.8.4(執筆時点)
・DB連携なし
・SSL構成なし
<インストール方法>
#epel有効化
#rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#必要モジュールインストール
#yum -y install guacamole guacd libguac-client-rdp libguac-client-vnc libguac-client-ssh
#guacamoleのパスワードをmd5hashで取得
#ここではguacamoleには、gucauser/Guac123!でログインすることとする。
#echo -n 'Guac123!' | md5sum | awk '{print $1}'
#6e9b83fc538318184ca185a44c06d235
#user-mapping.xml(認証情報)の編集
#ここではguacamoleには、gucauser/Guac123!でログインすることとする。
#接続先は適宜編集してください
#cat > /etc/guacamole/user-mapping.xml <<'EOF'
<user-mapping>
<authorize username="guacuser" password="6e9b83fc538318184ca185a44c06d235" encoding="md5">
<connection name="localhost ssh">
<protocol>ssh</protocol>
<param name="hostname">localhost</param>
<param name="port">22</param>
</connection>
<connection name="RDP">
<protocol>rdp</protocol>
<param name="hostname">localhost</param>
<param name="port">3389</param>
</connection>
<connection name="VNC">
<protocol>vnc</protocol>
<param name="hostname">localhost</param>
<param name="port">5901</param>
</connection>
</authorize>
</user-mapping>
EOF#guacamole関連サービスの起動/有効化
#
#systemctl start guacd
#systemctl start tomcat
#
#systemctl enable guacd
#systemctl enable tomcat
上記設定後、ブラウザから以下のURLへアクセスするとguacamoleにログインできます
http://guacamoleがインストールされているマシンのIP:8080/guacamole