2019年6月17日(月)にTECH PLAY SHIBUYAにて「さくらの夕べ Docker/Kubernetesナイト」を開催しました。最近注目を集めているDockerKubernetesなどのコンテナ技術について、さくらのエンジニアがどのような取り組みをしているかをお伝えしようという趣旨で企画したものです。それではさっそく、イベントの模様をご紹介しましょう!

Kubernetesって何ができるの?どうなってるの?

最初の発表はストレージチームの伊藤竜一による「Kubernetesって何ができるの?どうなってるの?」。伊藤は社内の新規プロジェクトにおいてKubernetes(以下k8s)を導入中で、その経験も踏まえてk8sの初歩的な解説を行いました。ちなみに発表の冒頭で参加者のk8s利用状況を調査したところ、結果は以下のようになりました。

  • 名前しか知らない:2割ぐらい
  • 簡単なデプロイをしてみたことがある:約半数
  • いろいろな機能を試している:2割ぐらい
  • 本格利用している:1割未満(数人)

k8sはDockerなどで作られたコンテナ群を管理するシステムです。競合のソフトウェアに比べて複雑ですが高機能・高性能で、この分野の標準たる地位を確立しつつあります。特徴としては、スケールが容易、高い対障害性、高度な制御機能、ベンダー非依存、手厚いデプロイのサポートなどがあり、きちんと使えれば運用がとても楽になります。しかし、学習コストや構築コストが大きいのが難点です。

k8sを使うときの役割はAdmin(k8sを構築し運用する人)とApplication Developer(k8sの上でサービスを開発し運用する人)に分かれます。両者それぞれの視点から見たk8sの構造は以下の図のようになります。

Application Developerから見たk8s

Adminから見たk8s

実際にk8sを使ってみるには、Kubernetes as a Service (KaaS)と呼ばれる類のサービスを利用するのが簡単ですが、さくらのクラウドでRancherのスタートアップスクリプトを使うことによりk8sクラスタを構築する方法もあります。詳細は下記の記事をご覧ください。

k8sについてさらに詳しく知りたい方は、伊藤の発表資料をご参照ください。

Kubernetes/Prometheusをやってみて辛い/辛かった話

続いてはエバンジェリストチームの仲亀拓馬による「Kubernetes/Prometheusをやってみて辛い/辛かったお話」。こちらも実務でKubernetesとPrometheusを使ってみた体験談をもとにした発表です。

Prometheusは監視ツールの一種で、同類のツールの中では新種に属するものです。Go言語で書かれていてバイナリを置くだけで動作するため監視システムの設置・展開が容易、サービスを指定すると自動的に監視対象を取得するService Discovery機能が強力、監視対象から情報を取得するExporterが多くのサービスに対応しており、Kubernetesや各種クラウドサービスだけでなくオンプレミスのシステムの監視設定も容易など、多くの利点があることからユーザが増えつつあります。Prometheusのアーキテクチャを図に示します。

しかし、実際に使ってみると「いいけど辛い」というのが仲亀の感想です。主な問題は、使用するポートが非常に多くポート管理が面倒、ほしいラベルを選択して取得する機能であるReLabelを使いこなすのが難しい、Service Discoveryを正しく設定しないと監視対象が出てこない、Prometheus Operatorを使うと構成をKubernetesのマニフェストファイルとして記述できて便利だが理解するまでが大変、といったところです。

仲亀は、これらの辛さの原因として日本語の情報が少ないことを挙げ、使っている人は一緒に情報発信をやっていきましょうと訴えました。こちらの発表も資料が公開されていますので、詳しく知りたい方はご覧ください。

また、Prometheusについては、さくらのナレッジにも解説記事があります。2017年末に公開した記事なので情報が多少古い部分があるかもしれませんが、参考にしてください。

Kubernetesを最大限に活かすためのGitOps入門

休憩をはさんで後半の1本目はストレージチームの伊藤が再登場。「Kubernetesを最大限に活かすためのGitOps入門」と題して発表しました。

システムに変更があった際に必要な処理を自動化する仕組みとしてCI(Continuous Integration)やCD(Continuous Delivery)があります。k8s環境でCI/CDを行う場合、kubectlコマンドによる手動デプロイでは世代管理が難しく状態管理ができないといった問題があります。これらに対する解として、Gitを利用してk8s環境のCI/CDを行うのがGitOpsです。デプロイの設定を1つのGitリポジトリで管理することで、デプロイ状態が明確になり、その変更も容易になります。また、開発者と運用者の権限が適切に分離されることも大きな利点です。

GitOpsを導入するには、ツールの選択(GitリポジトリやCI/CDツールなど)、Gitリポジトリの作成、k8sのマニフェストの作成、アプリ側のCIの準備、k8s側のCDの準備、といった作業を行います。ツールはそれぞれ複数のものがGitOpsに対応しています。運用においては、開発者がアプリを更新するとCIツールが自動的にDockerイメージを更新し、Gitリポジトリ更新のプルリクエストも自動生成します。運用者がプルリクエストを承認すると、CDツールが自動的にk8s環境の更新を行います。

伊藤によると、導入時からすべてのパーツをそろえないといけないのでセットアップがやや大変であることや、どの変更をどの環境に適用するかなどをきちんと管理するために適切なブランチ戦略が必要であるといった課題があるとのことですが、それでも導入のメリットは大きいようです。発表資料には、GitOpsのベストプラクティスやハマりどころなども載っていますので、詳しく知りたい方はぜひご覧ください。

クラウドネイティブの動向とDockerfileベストプラクティス

最後の発表はデベロッパーアドボケイトの前佛雅人による「忙しい人のためのCloud Native関連動向2019前半編 + Dockerfile Best Practice 2019」でした。

はじめにクラウドネイティブ界隈の近況が、CNCF(Cloud Native Computing Foundation)が作成したマップという形で提示されました。前佛によると、「混沌とした状況は変わらないが、レイヤーが分かれてきたのと、業界再編が始まりつつある」とのことです。

クラウドネイティブ界隈のマップ (出典:https://landscape.cncf.io/images/landscape.png)

続いて本題であるDockerfileのベストプラクティスです。Dockerイメージを自動構築するための設計図にあたるものがDockerfileですが、実は書き方次第で性能や保守性に大きな差が出ます。発表では数多くの改善策が示されたのですが、それらの中からいくつかを紹介します。

イメージ作成時間の短縮

まず、Docker 18.06以降で導入されたBuildKitを使うと、イメージの作成が数倍速くなります。また、Dockerfileの記述においては、頻繁に更新するものを後ろに書く、コピーする範囲を絞る、古いパッケージのキャッシュ利用を避ける、などの策があります。

イメージサイズの削減

イメージを小さくすればデプロイが速くなります。不要な依存関係やパッケージマネージャーのキャッシュを削除するとイメージが小さくなります。また、同じパッケージでもタグによってサイズが異なります。例えばopenjdkのタグを8から8-jre-alpineに変更するだけで540MBも小さくなります。

保守性の向上

Docker公式パッケージを使うとDockerfileの記述が簡潔になり、保守が容易になります。パッケージを利用するときにlatestタグを指定するとイメージが常に最新の内容に入れ替わるため、保守性という観点ではタグをバージョン番号で指定した方がよいでしょう。

再利用性の向上

1つのDockerfileに複数のステージを定義するマルチステージDockerfileという手法を用いると、開発環境/テスト環境/本番環境で共通のDockerfileが使えるようになり、再利用性が向上します。さらにBuildKitも利用すると各ステージのビルドを並行処理できるので処理時間も短縮されます。

発表の最後には、Dockerの最新機能としてコンテキストマウントやシークレットマウントなどが紹介されました。詳しくは前佛による資料をご覧ください。

おわりに

今回のイベントの趣旨は冒頭で説明した通りですが、今もっとも注目を集めている技術だけあって、200人の定員に対して350人以上の応募をいただき、あらためて関心の高さを感じました。当日も140人近い方が来場され、会場は超満員に。たくさんのご参加ありがとうございました!

発表資料は各発表の中でご紹介しましたが、この他にイベントの模様を撮影した動画を、さくらインターネットのエバンジェリストチームが運営する「さくらのエバンジェリストナイト」チャンネルにて公開しています。動画でご覧になりたい方はぜひご視聴ください。(よろしければチャンネル登録もお願いします)

それではまた、次回のイベントでお会いしましょう!