Kubernetesは銀の弾丸ではない――エンジニアが生き残るために必要な技術とは【デブサミ2018 関西】
【C-6】Javaを活用したマイクロサービスのためのKubernetes活用
Kubernetesでつまずきやすいポイントとその解消策
Azureにおいてもコンテナを動かす仕組みが用意されている。それが「Web App for Containers」「Container Instances」「Azure Kubernetes Service(AKS)」である。
Web App for ContainersはLinux上で、コンテナを単体で動かしたり、Docker Swarmの構成を使って複数のコンテナを動かしたりできるサービスだ。
Container Instancesは、コマンド1つでAzure上のコンテナを実行して起動できるサービス。「サービスを動かしているときだけ課金されるので、コストを抑えられる。バッチといった短命な処理のサービスに向いている」と寺田氏は説明する。
Azure Kubernetes Serviceは、ホストされているKubernetes環境を容易に管理できるサービスである。「DevOpsやマイクロサービスを意識したアプリケーションを作る際は、ぜひ検討してほしい」と寺田氏。またAzureでは、Kubernetes以外にも「OpenShift」や「Pivotal Cloud Foundry」も利用可能だ。
Kubernetesは容易に扱える技術ではない。「よくQiitaなどで、『たったこれだけの設定でコンテナ2つを動かせます』といった定型ファイルを見かけるが、これは単に動いたというだけ。本番環境で適用できるとは思わないでほしい」と寺田氏は注意を促す。本番環境で適用するなら、リソースやディスク、ネットワーク、無停止更新、可用性、セキュリティ、パフォーマンスなど、検討すべき要素がたくさんあるからだ。例えば無停止更新をするには、下図の通りに書かなければならない。
しかもKubernetesは数カ月に1回はバージョンアップされるなど、進化が激しい。「ひとつバージョンが変わると、今まで書いていたYAMLが動かなくなることは当たり前。進化が早いのでサードパーティー系のツールもどんどん登場しており、絶対、ハマってしまう」と寺田氏。ここで言うハマるとは、つまずくことだ。寺田氏がハマったポイントは6つあるという。
うち1つはKubernetesのバージョンアップで壊れたということ。「これはAzureに限った話ではない。ローリングアップデートはやってくれるが、失敗する可能性がある。バージョンアップをしなければならない場合は、最新のクラスタを1つ作り、今まで動いていたものをそのままコピーする。そしてカナリアリリースのように最初は8割のリクエストを古い方に飛ばし、2割を新しい方に飛ばす。それがうまくいってから、徐々に移行させることをおすすめする」と寺田氏は話す。
その他にもVMのスケールで失敗したり、podを作成し過ぎてコマンド操作が不可能になったり、バージョンアップで既存の設定が動かなかったり、PV(Persistent Volumes)のアタッチ・デタッチができない、もしくは時間がかかったり、Istio Heotio Arkといった周辺ツールの導入・設定が容易にできなかったりした。
「ハマったときに実施したいのは、次の5つ」と寺田氏は解説する。
- kubectl describe pod
- kubectl logs POD_NAME
- kubectl exec -it POD_NAME /bin/sh
- kubectl get events -w
- Ubuntuを同一名前空間にデプロイ
これでもダメならStack OverflowやGitHubのIssueを見にいく。「私はこの手順で解消している。Kubernetesを触るときにはハマる覚悟を持って立ち向かってほしい」と寺田氏。
Kubernetesを扱う上で大事なのは、開発者と運用者双方にノウハウが必要なこと。なぜならKubernetesはDevのツールでもOpsのツールでもなく、DevOpsのツールだからだ。そのためにも、とにかく「経験と知識を積み重ねていくしかない」と言い切る。
ちなみにKubernetesの技術的な情報については、寺田氏もGitHubで公開しているという。「k8s-Azure-Container-Service-AKS--on-Azure」のリンクをクリックすると、Kubernetesに関するさまざまな情報が得られる。
Javaの開発・提供もアジャイル的に進んでいる。今月リリースされたJDK11では、コンテナ対応がさらに進んだ。しかもこれからは半年に1回バージョンアップされていく。「ぜひ、最新のJavaを試してほしいが、Kubernetes同様、おそらく最初はハマる」と寺田氏。なぜなら、JDK11よりJava SEからjava.xml.ws(JAX-WS、Webサービス)、java.xml.bind(JAXB)、jdk.xml.ws(JAX-WS用ツール)、jdk.xml.bind(JAXB用ツール)などのパッケージが削除されたからだ。「JAX-WSやJAX-BはMavenのパブリックレポジトリの方に上がっているので、POMファイルや定義ファイルの中に書けば動かすことができる」と寺田氏。
また、カスタムのスモールJDKを作ることができるようになった。
「アプリケーションを動かすために最低限必要なJRE(Java Runtime Environment)を自分自身で『jlink』というコマンドを使って作れるようになった。特にコンテナ系でJavaを運用する際には、こういったカスタムのJREを作ることは必須になってくるので、ぜひ覚えてほしい」
マイクロソフトではJava開発者向けに、Azure上でサービスを提供する際に参考となるドキュメントを日本語で提供している。
最後に寺田氏は次のように語り、セッションを締めた。
「将来は今日から始まる。新しいテクノロジーをキャッチアップし、良いものを作っていけば、エンジニアの私たちが世界を変えていける。ぜひ、一緒に良い社会を作っていきましょう」
お問い合わせ
日本マイクロソフト株式会社
この記事は参考になりましたか?
既に会員の方はを行ってください。
- 【デブサミ2018 関西】セッションレポート連載記事一覧
-
- Kubernetesは銀の弾丸ではない――エンジニアが生き残るために必要な技術とは【デブサ...
- Yahoo!カレンダーがPHPからKotlinに技術移行し品質アップ! 成功の鍵とは?【デ...
- アプリ開発には「おもてなし」が必要だ! ゲーミフィケーションに学ぶ、面白さの伝え方【デブサ...
- この記事の著者
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営する開発者のための情報メディアです。日々の開発に取り組むエンジニアやテクノロジーを学びたい方に向けて、プログラミングやAI活用、開発ツール、エンジニアの学びとキャリアに関する記事をお届けしています。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社
この記事は参考になりましたか?
この記事をシェア
