teratail Report vol.14

2019/1/22

【Oracle Code Tokyoレポート前編】Kubernetes入門 / コンテナ世界でのJava / 開発者が学ぶべきAI

2018年12月11日に開催された「Oracle Code Tokyo」。IBM Developer Advocateの戸倉彩氏(@ayatokura)や、IoTLT主催の菅原のびすけ氏(@n0bisuke)をゲストに迎え、AIやIoT、ブロックチェーンなど最新技術から話題の技術まで様々なジャンルのセッションが行われました。

Oracle Code Tokyoレポート前編では、茂 こと氏、伊藤 敬氏、そしてゲストスピーカーの戸倉彩氏によるセッションに注目しつつ、イベントの様子をお伝えしていきます。

※後編はこちら

オープンコミュニティイベント「Oracle Code Tokyo」とは?

Oracle Code Tokyoとは、日本オラクル社としては初となる、ディベロッパー向けコミュニティイベントです。「デベロッパーによるデベロッパーのためのイベント」というコンセプトのもと、所属企業や使用技術を限定せず、オープンに、新たなテクノロジーや注目のテクノロジーについて最新情報を、学び、共有していく場です。

「私が半年間で学んだKubernetesの3つのこと」by 茂 こと氏

- JapanContainerDays v18.12でも登壇した茂 こと氏 -

トップバッターとして登壇したのは、日本オラクル所属の茂 こと氏(@cotoc88)。半年前からDockerやKubernetesを使い始め、その半年間で学んだことを紹介してくれました。

Container/Kubernetesはなぜ流行っている?

Kubernetesとは、Google発のオープンソースで、コンテナ・オーケストレーションツール、つまり大量のコンテナを管理・運用するプラットフォームです。コンテナ(=軽量・高速な仮想マシン)の技術は世界中の企業で採用が進んでおり、「素早いデプロイメント」「スケーラビリティ」「モジュール性」が主な特徴です。しかし、その特徴ゆえに数千規模のコンテナが動いている企業も出てきており、それら大量のコンテナをどう管理するのかという課題が発生してきました。そこに登場したのがコンテナ・オーケストレーションツールで、複数のコンテナのデプロイやスケーリングといった管理作業をを自動化することを可能にしました。現在、その中でもKubernetesがデファクトスタンダードになりつつあります。

入門者が最初にぶつかる「YAMLの壁」

Kubernetesは、大きく分けて3つの要素で構成されています。実際のワークロードが稼働する場所である「Kubernetesクラスター」、Kubernetesクラスターの管理操作を行うコマンドラインツール「kubectl」、コンテナイメージの保管・配送システムである「コンテナレジストリ」です。また、クラスターにどの要素を配備するかは「マニフェスト・ファイル」にYAML形式で記述していきます。その記述内容を基にKubernetesクラスター上にアプリケーション環境が構築されます。環境構成を変更する場合も、マニフェスト・ファイルのコード変更すればよく、変更内容もバージョン管理されているため追跡可能です。しかし、単純なアプリケーションの環境を記述する場合でも、3桁行、あるいはそれに近い行数のYAMLファイルを記述する必要があります。これは通称「YAMLの壁」と揶揄されるところであり、ここを乗り越えることが入門者としての難関ポイントになります。

Kubernetesで広がる世界!

「YAMLの壁」は難関ポイントではありますが、それを乗り越えると、すばらしい世界が待っています。大量のコンテナをまとめて制御し、管理・運用を効率化、自動化するなど、様々なKubernetesの恩恵を受けることができます。またKubernetesとCloud Nativeプロダクトと組み合わせることで、さらに最高のDevOps環境を実現することも可能となります。

- YAMLの壁を乗り越えた先に待つ世界 -

Oracle社もOracle Container Engine for Kubernetes(OKE)Oracle Cloud Infrastructure Resistry(OCIR)などのKubernetesサービスを提供してますので、ぜひ使ってみてください。また、スピーカーの茂氏が主催するコンテナなどのCloud Native勉強会「Oracle Cloud Hangout Cafe(OCHaCafe)」もありますので、さらに深く学びたい方はぜひ参加してみてください。

「コンテナ環境でJavaイメージを小さくする方法!」 by 伊藤 敬氏

- JavaのDockerイメージをこれでもかと小さくする話をしてくれた伊藤 敬氏-

2番目に登壇したのは、日本オラクル所属で日本Javaユーザーグループの幹事会メンバーでもある伊藤 敬氏(@itakash)。コンテナ技術においては、サイズが大きすぎて使いづらいJavaのDockerイメージを、いかに小さくして使いやすくするのか、そのノウハウと最新事情をお話し頂きました。

コンテナ世界におけるJava

安全性やセキュリティがますます重要になっているコンテナの世界におけるJavaは、ハードウェアやOSに依存しない点や互換性がある点、エコシステムが豊富な点などの本来の特徴が、コンテナ環境においても最も適切な選択肢となるよう維持されています。まさに理想的なものではあるのですが、JavaのDockerイメージはサイズが大きく、使いづらいというのが実状です。JRE 11になり必須でないモジュールが減らされたとはいえ、デフォルトのJDKを含むDockerイメージは、OSのベースイメージ約229MBとJDK343MBを合わせて、約530MBもあります。どのようにすればこのDockerイメージのサイズを小さくしていくことができるのでしょうか?

カスタムJREの作成でJDKのサイズを小さく

JavaのDockerイメージを小さくする方法として、JREのカスタマイズがあります。JREといえば、開発者がカスタマイズできる余地はなく、提供されたものをそのまま利用する、と理解されている方も多いと思いますがが、Java9リリース以降、個々にカスタマイズすることが可能になっています。Javaの基本ライブラリは整理され、モジュールという単位で分割されました。カスタムJREは、任意のJavaアプリケーションの実行に必要なモジュールと、そのモジュールが参照するモジュールをパッケージ化することで実現できます。パッケージ化にはjlinkコマンドを利用します。以下の図では、Javaの基本モジュールの全体構成と”company.application”というアプリが実行するために必要なモジュール”java.sql.rowset”と”java.activation”およびこれらのモジュールが参照するモジュールを示しています。必要なモジュールだけをJREに含めるのがカスタムJREの考え方です。

- java.baseから参照の流れを追い、必要なものだけ使うのがカスタムJREの考え方-

イメージサイズの最適化でさらに小さく

Javaのランタイムに着目すると、さらに小さくすることができます。JREの中で、必須のモジュールはjava.baseです。実際のJavaアプリケーションにおいて、java.baseだけで十分な場合が多いです。一方、マイクロサービスのようにコンテナ内のサービス間で非同期でメッセージをやりとりしながら連動して動作するようなアプリケーションを考えた場合、Nettyの利用を想定できます。これら2つでアプリケーションの動作環境を整えれば最小のJavaアプリケーション環境とすることができます。それ以外を削ることが可能になります。実行環境はjava.baseの48MBとNettyの60MB(ただしアプリ本体含まず)、合計して108MBまで小さくすることができます。加えて、jlinkには --compressというコマンドがあり、実行環境をさらに25%程度圧縮することも可能です。

OSのベースイメージも小さくすることが可能です。Oracle Linxには、slimというコンパクトサイズのDocker用イメージが提供されています。Javaのアプリを実行するために最適化されたLinuxイメージであれば、160MBまで小さくできます。Alpine Linuxmusl libcを使えば、さらに小さくすることもできます。Alpine Linuxは4.4MBしかないので、java.baseと合わせて50MB強ほどのサイズしかありません。これが現状入手してすぐ使える中では一番小さいパターンであり、nginx程度であれば動作させることができます。

これよりさらなる最小化を目指すのであれば、java.baseのみのJREに何が含まれるかに着目します。現時点で実際のJavaアプリを実行する環境として使えるものではありませんが、不要部分を削除していくとなんと5MBまで小さくできる可能性があります。現状で可能なギリギリの最小サイズです。しかし、現状では機能が乏しく現実的ではないですが、今後の研究ではこのサイズが目指すところになるようです。また、それ以上のイメージ最小化の研究も進んでおり、興味がある方は、Oracle Labsで開発されているSubstrateVMをチェックしてみてください。

「No AI, No Life. アナタに寄り添うAI」 by 戸倉 彩氏

- AIの定義から現在できること、これからのAIの可能性について語る戸倉氏 -

レポート前編、最後にご紹介するのは、ゲストスピーカーのIBM Developer Advocate 戸倉 彩氏(@ayatokura)の講演です。こだわりのプレゼンスタイルで、なんとMacBook ProにOracle VM VirtualBoxを入れ、最新のOracle Linux 7.6上のVisual Studio Codeで、HTML/CSSで書いたプレゼン資料を使うというスペシャル講演でした。

AIとは何か?

AIとは、一般的に「Artificial intelligence(人工知能)」の略であり、人間が持つ知能を人工的に生み出す技術の総称です。しかし、IBMが提供するAIとは、「Augumented Intelligence(拡張知能)」の略であり、人間の手助けをするための機能という意味で使われています。AIが様々な仕事を奪っていくのでは?といった、AIを世に拡げていく際の様々な問題が議論に上がることもしばしばありますが、IBM社では、AIを活用して人々の生活や能力をどのように拡張することができるのか、という視点が重要だと考え、AIの開発が進められています。

- IBM社はAIを拡張知能と定義し、人々の可能性を広げるものとして開発している -

AIはどんなことができる?

IBM社が提供しているIBM Watsonは、「お客様のビジネスに活用いただくためのAI」です。社会に浸透し、お客様のビジネス成功に結びつくことを重視しています。ビジネスに繋がらなければ、技術そのものを伸ばすこともできないというのもあります。

WatsonはAPIから活用することができ、簡単にAIアプリケーションを開発することができます。例えば、Watson Assistantでユーザーとのスムーズな対話ができるChat BOTが簡単につくれたり、Discoveryというテキスト分析APIで文章から概念の抜き出したや感情読み取りを可能にしたり、Visual Recognitionで画像の分析(犬や山などの一般名詞の検出や、顔検出など)も可能です。Language Translatorという翻訳APIや、Personality Insightsという個人が書いたテキスト文書から性格を分析するAPIもあります。

性格分析や画像解析は、下記からすぐに体験できます。


2,200万人の開発者たちがAIに取り組むとしたら、どんなソリューションが生まれるのか?

AI活用の障壁は、これまで以上に低くなってきており、誰もが様々なアプリケーションにAIを組み込むことができるようになってきています。もし世界中の2,200万人の開発者たちが、「AI」に取り組むとしたら、どんなソリューションが生まれるのでしょうか?とても楽しみでたまりません。しかし、IBM Watsonなどを使えば、そのような時代はすぐそこまで来ているのです。ぜひみなさんも様々な視点からAIを活用し、ご自身の身の回りやご自身が携わっているビジネスを拡張させていってください。

Oracle Code Tokyoに参加しよう!

Oracle Code Tokyoでは、今後も様々な切り口で、テクノロジー界を盛り上げるイベントを開催していきます。気になる方は、下記のconnpassグループよりメンバー登録し、ぜひ遊びにきてください。

https://oracle-code-tokyo-dev.connpass.com/