Vitess as a Service:Vitessのフル・マネージド・サービスを試す(導入編)
注意:本記事の内容は所属企業とは全く関係がありません。個人の趣味です。
Kubernetes Advent Calendar 2019 - Qiita 15日目です。
Vitessとは
Vitessを皆さんはご存知でしょうか?
CNCFが2019/11/5にVitessのGraduateを発表し、 さらにCloudNativeCon 2019 SanDiegoでもKeynoteに取り上げられたこともあり注目度・認知度が上がってきているのではないでしょうか。
Vitessは一行で説明すると"MySQLの水平スケーリングを実現するためのデータベースクラスタリングシステム"です。
Vitessの大きな特徴は、Cloud Native Databaseと紹介されることがある通り、Kubernetesを当初からサポートし、etcd、gRPC、Prometheusを含む他の多くのCloud Native Projectsと統合して利用することで、ベンダーロックインされることなく、MySQLをシャーディングにより(無限に?)スケールさせて利用できる点です。
この記事ではVitessのアーキテクチャ紹介は致しません。 アーキテクチャや特徴に興味のある方は、以前Vitessについてまとめた資料を御覧ください。2018年作成のため少し古いです。
Vitess のパフォーマンスと運用性を検証してみた
Kubernetesが超強力な分散RDBに vitessの真価を大検証してみた (JapanContainerDays v18.12)
これらの資料を作成した頃は、Helmが用意されていなかったり、マニュアルも正確でないことがあり、エラー内容もわからないままにトライアンドエラーを繰り返し、躓いてはSlackで質問し本当に大変でした。(今は改善しつつあります!)
Vitess as a Service:PlanetScale CNDb
さて、この記事で本題として取り上げたいのはPlanetScale社が提供する"Vitess as a Service"である"PlanetScale CNDb"です。
PlanetScaleは、2018年にVitessのオープンソースプロジェクトの共同管理者によって設立されました。以下のサービスを提供しています(抜粋)。
- Open Source Vitess:Vitessの9ヵ月の限定的なサポート(恐らく導入コンサル的なもの?)
- PlanetScale Enterprise:Vitessの長期サポート3年とSLA保証
- PlanetScale CNDb:Kubernetesを前提としたVitessのフル・マネージドなサービス提供
Vitessのフル・マネージド……すごい。ということで試してみました。
ログイン
https://console.planetscale.com/login からログインします。私はGoogleアカウントでログインします(便利)。
続いて Create New Account で以下を入力していきます。
- アカウント名
- Billing Information
- Apply Coupons
Billing Information / Apply CouponsはSkipすることができるので、今回はSkipしていきます。$0.07/hr までは無料で利用することが可能です(Getting Started Credits)。
ログインするとこのようなページへ。早速Create Clusterしたくなるページ。
Create your first cluster
"Create Cluster"をクリック。ここではクラスタ名と使用するCloudサービス、Regionを選択します。
現在Regionは以下に対応しているようです。今後増えていくのでしょう。Tokyoにも来るといいですね。
Create Database
続いてDatabaseを作成していきます。画面遷移することなく手順が示されるため、とても分かりやすいです。
"Create Database"をクリックすると、以下の入力が求められます。
- Database Name:データベース名を入力
- Deployment Type:Deployment Typeを選択(今回はGCPを選択したため、Single Regionしか選べませんでした。)
- Instance Configuration:CPU、RAM、Storageなどサイズを選びます。今回はdefaultのまま。
- Number of instances:レプリカ数、Read-Only数を選択します。レプリカ数は3以上にすることで High Availabilityにチェックが付きますが、今回は1のまま。
- Sharding:シャードの数を指定します。せっかくなので今回は2を指定してみます。
金額は0.604/hrとでています。即座に金額がわかって親切ですね。最後に"Create Database"をクリックして少し待つと以下の画面が表示されます。
裏側では恐らくPlanetScaleが管理するKubernetes上にMySQLのコンテナやVitessのコンポーネント(vtgate等)がデプロイされ、Ingressが作成されているようです。ほんの数分で完了します。
作成したデータベース名を選択すると、"Overview"タブからデータベースの情報を確認することができます。
さらにこのページから"Schema"を作成したり、"Sharding Scheme(vSchema)"を作成することができます。
右上の"Connect"をクリックすると、以下のようにvtgateへの接続するためのコマンドが表示されます。
mysql --host 34.XX.XX.XX --port 3306 --user vtgate-testdb-user --password=XXXXXXX
コマンドを打つと、vtgate経由でServer version:5.5.10-Vitess MySQL Community Serverへの接続が確認できます。
# mysql --host 34.XX.XX.XX --port 3306 --user vtgate-testdb-user --password=XX mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.10-Vitess MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW TABLES FROM testdb; +---------------------+ | Tables_in_vt_testdb | +---------------------+ | user1 | | user2 | +---------------------+ 2 rows in set (0.06 sec)
"Instances"タブでは、各シャードの状態が確認できます。今回はShardを2つ作成しているので2つのインスタンスが見えています。
”Backup”タブでは、バックアップの取得状況が確認できます。
12時間ごとに自動的にレギュラーバックアップが取得されるようです。 Vitessではタブレットを追加作成するとき、バックアップから作成されるため、確実に使えるバックアップを用意する必要があります。
長くなったので今回はここまでにします。次は実際にデータを入れて、スケールのテストなどしてみたいと思います。
終わりに
Vitessは、YouTube、Square、Slack、Githubなどグローバルにサービスを提供する企業が利用している印象を受けます。
これらグローバル企業の多くは研究開発費やエンジニアの数もすさまじく、クラウドに頼らずともon-premiseで運用できてしまうことが多いですが、やはり絶対的に楽です。クラウド。今回試してみて、あの苦労は何だったのだと思いました。
Vitessもクラウドサービス化されることで導入の敷居を下げ、より幅広い企業に利用されていくことを期待しています。
がんばれVitess!
ATPをWebLogicデータソースとして設定
この記事について
Autonomous Transaction Process(ATP)をOracle WebLogic Server(WLS)データソースとして設定する際の手順のメモです。WebLogic Cafeの記事をお手本にしています。 WebLogic Café | Configuring a WebLogic Data Source to use ATP
Walletの配置
1.ATPのWalletファイルをWebLogic ServerのAdmin Server(管理サーバー)にファイル転送
2.Admin Serverにsshでログイン
※ 今回は JCS(Java Cloud Service)を利用しているため、OPC ユーザーを経由してログイン・操作しています
> ssh opc@<ホスト名 or IPアドレス> -i <秘密鍵>
3.zipファイルをopcユーザーからoracleユーザー引き渡し
[opc@jcs01 ~]$ ls Wallet_atp_ks.zip [opc@jcs01 ~]$ sudo cp Wallet_<dbname>.zip /shared/atp [opc@jcs01 ~]$ sudo chown oracle:oracle /shared/atp/Wallet_<dbname>.zip
4.zipファイルを解凍
[opc@jcs01 ~]$ sudo su - oracle [oracle@jcs01 ~]$ cd /shared/atp/ [oracle@jcs01 atp]$ ls Wallet_<dbname>.zip [oracle@jcs01 wallet]$ unzip Wallet_<dbname>.zip Archive: Wallet_<dbname>.zip inflating: cwallet.sso inflating: tnsnames.ora inflating: truststore.jks inflating: ojdbc.properties inflating: sqlnet.ora inflating: ewallet.p12 inflating: keystore.jks
sqlnet.oraを編集
sqlnet.oraにWalletを配置したディレクトリを指定します。
[oracle@jcs01 atp]$ vi sqlnet.ora [oracle@jcs01 atp]$ cat sqlnet.ora WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/shared/atp"))) SSL_SERVER_DN_MATCH=yes
WebLogic 管理コンソールから JDBCデータソースの作成
ここからは管理コンソールで作業します。
管理コンソールのURLは https://‹Admin ServerのIPアドレス›:7002/console
です。
weblogic ユーザーにインスタンス作成時に指定したパスワードでログインします。
ドメイン構造から サービス › データ・ソースを選択し、ロックして編集をクリックします。 そして 新規ボタンから 汎用データソース を選択します。
データ・ソースの名前を入力して、次を選択
デフォルトの設定のまま、次を選択
デフォルトの設定のまま、次を選択
ATPの接続情報を入力します。
- データベース名
- ホスト名
- ポート番号 ※ ATPはポート番号1521ではなく、1522を使用します
- ユーザー名
- パスワード
続いてJDBC接続文字列を指定します。
JDBC接続文字列 = jdbc:oracle:thin:@<データベース名>_high (=tnsnames.oraで定義されているもの)
プロパティに以下を設定します。
ディレクトリはWalletを展開先を指定、パスワードはWallet取得時に設定したパスワードを指定します。
user=admin oracle.net.tns_admin=/shared/atp/ oracle.net.ssl_version=1.2 oracle.net.ssl_server_dn_match=true javax.net.ssl.keyStoreType=JKS javax.net.ssl.keyStore=/shared/atp/keystore.jks javax.net.ssl.keyStorePassword=<walletパスワード> javax.net.ssl.trustStoreType=JKS javax.net.ssl.trustStore=/shared/atp/truststore.jks javax.net.ssl.trustStorePassword=<walletパスワード> oracle.jdbc.fanEnabled=false
設定が終わったら構成のテストを行います。
以下が表示されれば成功です。
データソースのターゲットを選択します。
変更のアクティブ化 を選択します。
以上で設定完了です!お疲れ様でした!
ご覧いただきありがとうございました。
Node.jsからAutonomous Transaction Processing(ATP)に接続
この記事について
この記事ではNode.jsのアプリケーションからAutonomous Transaction Processing(ATP)に接続する方法を記載しています。
前提
- Oracle Cloudのアカウントを持っている
無償トライアルはこちら Try for Free | Oracle Cloud - Autonomous Transaction Processing(ATP)がプロビジョニングされている
Autonomous Transaction Processing(ATP)とは
Autonomous Transaction Processing は、自己稼動、自己保護、自己修復が可能なOracle Autonomous Database を基盤とするクラウド・サービス・ファミリーの一部です。
Autonomous Transaction Processingは、機械学習と自動化を使用して人手による作業、人的エラー、手作業によるチューニングを排除してくれます。
ATPへの接続は証明書認証とSSLが使用されクライアントとATP間のすべての通信は暗号化されます。
Node.jsアプリケーションからATPへの接続 設定手順
以下の手順で設定していきます。
- Oracle Instant Clientのセットアップ
- ドライバ(node-oracledb)のインストール
- セキュリティ資格証明を取得
- アプリケーションに接続情報を登録
Oracle Instant Clientのセットアップ
1.Oracle Instant Client を入手します*1
以下URLから入手可能です。 ご利用の環境に合うファイルを選択してください。
Oracle Instant Client - Free tools and libraries for connecting to Oracle Database
2.Zipファイル、またはrpmパッケージを解凍します
Windowsの例:C:\instantclient_12_2
Windowsの場合には解凍したディレクトリをPATH変数に登録します。
Linuxの例:/home/myuser/instantclient_18_3
Linuxの場合にはlibclntsh.so
のシンボリック・リンクを作成し、環境変数LD_LIBRARY_PATH
を登録します。
> cd /home/myuser/instantclient_18_3 > ln -s libclntsh.so.18.1 libclntsh.so > export LD_LIBRARY_PATH=/home/myuser/instantclient_18_3:$LD_LIBRARY_PATH
ドライバ(node-oracledb)のインストール
node-oracledb は Node.jsのOracle DBドライバ(Apatche License 2.0)です。
以下URLから入手可能です。
GitHub - oracle/node-oracledb: Oracle Database driver for Node.js maintained by Oracle Corp.
package.jsonの依存関係にoracledbを追加するか、手動で以下のコマンドを実行することでインストールできます。
> npm install oracledb
セキュリティ資格証明を取得
1. 以下の手順でセキュリティ資格証明(Oracle client credentials)をダウンロードします。
- Autonomous Transaction Processing詳細ページで「DB Connection」をクリックします
- パスワードを入力します*2
- 「Download」クリックして、クライアントのセキュリティ資格証明のzipファイルを保存します
2. セキュリティ資格証明のZipを以下のディレクトリに解凍します。
Windowsの例:C:\instantclient_12_2\network\admin
Linuxの例:/home/myuser/instantclient_18_3/network/admin
Linuxの場合には解凍したディレクトリを環境変数TNS_ADMIN
に登録します。
Zipに含まれるファイル
-rw-r--r-- 1 cotoc 197121 3336 1月 29 05:53 truststore.jks -rw-r--r-- 1 cotoc 197121 12753 1月 29 05:53 tnsnames.ora -rw-r--r-- 1 cotoc 197121 87 1月 29 05:53 ojdbc.properties -rw-r--r-- 1 cotoc 197121 3243 1月 29 05:53 keystore.jks -rw-r--r-- 1 cotoc 197121 6616 1月 29 05:53 ewallet.p12 -rw-r--r-- 1 cotoc 197121 6661 1月 29 05:53 cwallet.sso -rw-r--r-- 1 cotoc 197121 20083 1月 29 14:53 Wallet_store.zip -rw-r--r-- 1 cotoc 197121 139 1月 29 16:10 sqlnet.ora
Node.jsアプリケーションからATPに接続するためにはtnsnames.ora、sqlnet.ora、cwallet.ssoを使用します。
アプリケーションに接続情報を登録
dbConfig.js にnode-oracledbドライバを使用したOracle DBのアクセスのコードを記述します。
今回はmodule.exportsを使用しています。
module.exports = { user : process.env.NODE_ORACLEDB_USER || “DBユーザー名”, password : process.env.NODE_ORACLEDB_PASSWORD || “DBパスワード”, connectString : process.env.NODE_ORACLEDB_CONNECTIONSTRING || “<サービス名>_low”, externalAuth : process.env.NODE_ORACLEDB_EXTERNALAUTH ? true : false };
- NODE_ORACLEDB_USER:DBのユーザー名を登録します
- NODE_ORACLEDB_PASSWORD:DBのユーザー名のパスワードを登録します
- NODE_ORACLEDB_CONNECTIONSTRING:データベース・サービス名を登録します
- NODE_ORACLEDB_EXTERNALAUTH :外部認証テストのためのオプションをFalseに設定します
NODE_ORACLEDB_CONNECTIONSTRINGに記述するデータベース・サービス名はセキュリティ資格証明に含まれる tnsnames.ora を確認します。
※ tnsnames.oraファイルには、high/medium/low/tp/tpurgentの5つのデータベース・サービス名が含まれます。それぞれ優先順位と並列処理の実行の有無が異なります。
Managing and Monitoring Performance of Autonomous Transaction Processing
お疲れさまでした!これでNode.jsアプリからATPへの接続に必要な設定は完了です!
ご覧いただきありがとうございました。
Istio1.0.5でJaegerやPrometheusに外部ネットワークからアクセスできるようにする
デフォルトの状態でIstioをインストールすると、JaegerやPrometheus、Grafanaといった可視化サービスのServiceタイプがClusterIPとなっているため、外部ネットワークからアクセスできない状態になっています。
そのため、ローカルのブラウザからアクセスできるようにServiceタイプをClusterIPからNodePortまたはLoadBalancerに変更する必要があります。
Jaegerを例に変更してみます。
現在の状態
$ kubectl get service jaegar-query -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jaeger-query ClusterIP 10.96.141.214 <none> 16686/TCP 3d
kubectl expose
コマンドで --type=NodePort を指定
$ kubectl expose service jaeger-query --type=NodePort --name=jaeger-query-svc -n istio-system
確認
$ kubectl get service jaeger-query-svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jaeger-query-svc NodePort 10.96.178.82 <none> 16686:32599/TCP 3h
これで外部に公開されるポートが作成されたので、http://<クラスターノードのIPアドレス>:32599 でアクセスすることが可能です。
Kubernetesのマニュアルはこちら
Exposing an External IP Address to Access an Application in a Cluster - Kubernetes
Oracle Container Engine for Kubernetes(OKE)にIstio1.0.5をインストールしてみた
この記事について
Oracle Container Engine for Kubernetes(OKE)にIstio1.0.5をインストールする手順を記載します。
OKEクラスターの準備
Istioの公式ドキュメントにもOracle Cloud Infrastructureのセットアップ手順が記載されています。
Oracle Cloud Infrastructureテナント内にOKEクラスターを作成する最も簡単な方法は、Oracle Cloud InfrastructureのWebコンソールから「Quick Cluster」オプション(デフォルト)を使用する方法です。 僅か数クリックでOKEクラスターを構築することができます。
詳しくは OKEでKubernetesクラスターをプロビジョニングする - チャーリー!のテクメモ を参照してください。
OKEクラスターが作成できたら、OCI cliコマンドを実行してkubeconfigファイルをダウンロード、保存します。
$ oci ce cluster create-kubeconfig \ --file $HOME/.kube/config \ --cluster-id <cluster-ocid>
続いてユーザーにクラスタ管理者(admin)権限を与えます。Istioに必要なRBACルールを作成するには管理者権限が必要です。
$ kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin \ --user=<user_ocid>
Istioのインストール
Istio / Quick Start with Kubernetesに沿って作業します。
1.最新バージョンを以下コマンドでダウンロード
$ curl -L https://git.io/getLatestIstio | sh -
2.Istioのカスタムリソース定義を適用
$ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
3.LoadBalancerの定義を編集(任意)
今回はPod同士のTLS認証を有効にせずにIstioをインストールします。
LoadBalancerタイプのServiceオブジェクトに、Oracle Cloud Infrastructureのロードバランサーを利用するための記述を追加します。
マニフェストファイル install/kubernetes/istio-demo.yaml
のL12485に記述を追加します。
12478 --- 12479 apiVersion: v1 12480 kind: Service 12481 metadata: 12482 name: istio-ingressgateway 12483 namespace: istio-system 12484 annotations: 12485 service.beta.kubernetes.io/oci-load-balancer-shape: 400Mbps
追加しない場合、デフォルトの定義(Shape:100Mbps)でOracle Cloud Infrastructureのロードバランサーが作成されます。
4.Istioの各定義を適用
編集したらマニフェストファイルを適用します。
$ kubectl apply -f install/kubernetes/istio-demo.yaml
確認
Pod を確認
$ kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE grafana-7f6cd4bf56-ggqj7 1/1 Running 0 3d istio-citadel-7dd558dcf-6frkq 1/1 Running 0 3d istio-cleanup-secrets-bvt9s 0/1 Completed 0 3d istio-egressgateway-88887488d-9cgcq 1/1 Running 0 3d istio-galley-787758f7b8-zx7gb 1/1 Running 0 3d istio-grafana-post-install-mj7r8 0/1 Completed 0 3d istio-ingressgateway-58c77897cc-5h9cn 1/1 Running 0 3d istio-pilot-86cd68f5d9-xvxs6 2/2 Running 0 3d istio-policy-56c4579578-p7lgg 2/2 Running 0 3d istio-security-post-install-4dz55 0/1 Completed 0 3d istio-sidecar-injector-d7f98d9cb-xsbvx 1/1 Running 0 3d istio-telemetry-7fb48dc68b-4sgmz 2/2 Running 0 3d istio-tracing-7596597bd7-rtxfm 1/1 Running 1 3d prometheus-76db5fddd5-fj6gl 1/1 Running 0 3d servicegraph-56dddff777-r6wff 1/1 Running 1 3d
Service を確認
$ kubectl get service -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.96.215.232 <none> 3000/TCP 3d istio-citadel ClusterIP 10.96.63.94 <none> 8060/TCP,9093/TCP 3d istio-egressgateway ClusterIP 10.96.50.97 <none> 80/TCP,443/TCP 3d istio-galley ClusterIP 10.96.198.43 <none> 443/TCP,9093/TCP 3d istio-ingressgateway LoadBalancer 10.96.225.198 129.XXX.XXX.XXX 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:32084/TCP,8060:30266/TCP,853:32123/TCP,15030:31048/TCP,15031:30558/TCP 3d istio-pilot ClusterIP 10.96.51.162 <none> 15010/TCP,15011/TCP,8080/TCP,9093/TCP 3d istio-policy ClusterIP 10.96.68.127 <none> 9091/TCP,15004/TCP,9093/TCP 3d istio-sidecar-injector ClusterIP 10.96.160.21 <none> 443/TCP 3d istio-telemetry ClusterIP 10.96.226.178 <none> 9091/TCP,15004/TCP,9093/TCP,42422/TCP 3d jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 3d jaeger-collector ClusterIP 10.96.245.242 <none> 14267/TCP,14268/TCP 3d jaeger-query ClusterIP 10.96.141.214 <none> 16686/TCP 3d jaeger-query-svc ClusterIP 10.96.178.82 <none> 16686/TCP 3d prometheus ClusterIP 10.96.113.247 <none> 9090/TCP 3d servicegraph ClusterIP 10.96.50.158 <none> 8088/TCP 3d tracing ClusterIP 10.96.29.192 <none> 80/TCP 3d zipkin ClusterIP 10.96.100.234 <none> 9411/TCP 3d
全てのサービスが立ち上がっていることを確認します。
インストール作業はこれで完了です!
次回はIstioの機能をいろいろ試してみたいと思います。ご覧いただきありがとうございました。
Oracle Container Engine for k8s(OKE)のKubernetesダッシュボードにアクセスする方法
この記事について
Oracle Container Engine for Kubernetes(OKE)のKubernetesダッシュボードにアクセスする方法をまとめます。
Kubernetesダッシュボードとは
Kubernetesダッシュボードは、kubectlコマンドライン・ツールの代わりに使用することができるWebベースのユーザー・インタフェースです。
Kubernetesダッシュボードを使用して、クラスタ上で実行されているアプリケーションの概要を確認したり、個々のKubernetesリソースを作成または変更したりできます。
例えば以下の用途に利用可能です。
- コンテナ化されたアプリケーションをKubernetesクラスタにデプロイ
- コンテナ化されたアプリケーションのトラブルシューティング
コマンドラインに慣れる前はこういったUIがあると便利ですね。
Kubernetesクラスタやノードプールを作成および削除したり、関連するComputing、Network、およびStorageリソースを管理する場合はKuberenetesダッシュボードではなくOKEのダッシュボードを使用します。
前提条件
1, OKEでKubernetesダッシュボードを利用するにはクラスター作成時にKUBERNETES DASHBOARD ENABLE
が有効になっている必要があります(後から追加することも可能です)。
2, kubeconfigの設定ファイルをダウンロードし、kubectlコマンドを利用できる状態にします。
kubeconfigのダウンロードの方法はAccess Kubeconfig
を確認してください。
Kubernetes ダッシュボードの起動
ダッシュボードにアクセスする方法はKubernetesクラスター作成後、クラスターの詳細の左側にある Getting Started にも記載されています。
1, ローカル端末でkubectl proxy
コマンドを実行します。
~$ kubectl proxy Starting to serve on 127.0.0.1:8001
kubectk proxy
コマンドを実行すると、KubernetesのAPIエンドポイント経由でアプリケーションにアクセスすることが出来ます。 kubectlがapiエンドポイントへのリバースプロキシとして動作します。
2, ブラウザを開き以下URLでKubernetesダッシュボードを表示します。
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
3, Kubernetesダッシュボードにサインインするための情報を入力します。
今回はkubeconfigファイルを使用してサインインします。
クラスターへのアクセスを構成するために作成したkubeconfigファイル$HOME/.kube/config
*1を選択します。
これで完了です!Kubernetesダッシュボードにアクセスすることができました。
Overviewでは現在動作しているリソースの状況を確認することが出来ます。
リソースを選択することでより詳細な情報を確認することが出来ます。
ご覧いただきありがとうございました。
この記事は Oracle Cloud Advent Calendar 2018 - Adventar 23日目です。
Oracle Cloud Hangout Cafe
OchaCafe#1 - Kubernetesで作るコンテナベースCI☆CDの夕べ
12/20 Oracle Cloud Hangout Cafe を開催しました!
当日の様子はTogetterはこちらから togetter.com
第二弾の募集はこちらから
OchaCafe#2 - Microservicesの運用・監視(仮)
まずはリンク集まで。