HDE BLOG

コードもサーバも、雲の上

Azureのマネージドコンテナーサービス「AKS」を使ってみた

こんにちは、HDEの楠本です。

皆さんはKubernetesというソフトは使ったことありますか?ざっくり言うと、コンテナをクラスタ化するためのプラットフォームです。では、使ったことある方はどこで動かしていますか?iDCのサーバ?AWS?

本記事では、Kubernetesではなく、KubernetesをAzureで動かすためのコンテナサービス AKS についてお話したいと思います。

AKSとは

AKSとは、Azure Container Services という、マネージドのコンテナサービスです。

azure.microsoft.com

コンテナとは何かについては今回の本題ではないので各自で検索してほしいと思いますが、コンテナの環境を用意して実際に扱うのは結構大変です。そこで、その難しい管理部分をAzureにおまかせして、コンテナ化されたアプリケーションを迅速かつ簡単にデプロイおよび管理できるようにするためのサービスがAKSです。

AKSの歴史

Container ? C ? ACSではないの?それはその通りですが、今は AKS が正解です。

まず、Microsoft は2015年にマネージドコンテナサービスとしてACSの提供を開始しました。この時はACSです。

その後、コンテナ界隈(?)で、Google謹製のコンテナをクラスタ化して運用するためのオープンソースプラットフォーム Kubernetes に人気が集まってきます。Microsoft もこの流れに乗った方がいいという判断になったのようで、2017年4月に Kubernetes 関連のツールを開発していた Deis という会社を買収します。

そして、2017年10月、Microsoft は ACS で Kubernetes の正式サポートを発表し、名前も AKS に変更しました。略称は AKS ですが、正式名称は Azure Container Services です。Azure Kubernetes Services になったというわけではありません。

ついでに、Kubernetesとは

詳細については割愛しますが、Kubernetes はGoogle謹製のコンテナをクラスタ化して運用するプラットフォームです。

kubernetes.io

コンテナをクラスタ化するには、自動デプロイやスケーリングなどが必要になるため、全て手動で運用するには負荷がかなり高いです。そこで、それらの運用をなるべく自動化出来るようにするための機能が提供されています。

ちなみに、「Kubernetes」という単語を見て恐らくはっきりした読み方が出てこなかったのかのではないかと思いますが、読み方も人によって「くべるねいてす」や「くーべねてす」「くーばーねいてす」など違っていて、私は最初の読み方で読んでいます。

また、単語自体長いので「K」から「s」までの間に8文字あることから、k8s と略されています。i18n と同じやり方ですね。

AKSを使う利点

まず第一には、AKS自体の利用やKubernetesのクラスタには料金がかからないというところです。VMやグローバルIPなど純粋に使用したリソース分のみ料金がかかります。 次に、何と言ってもKubernetes自体の管理が簡単になるということです。 Kubernetes自体はとても強力なツールですが、いざ運用しようとするとそれは決して簡単ではありません。AKSではそういった管理が色々自動・簡略化されており、自動アップグレード、スケーリング、自己修復、などを複雑は操作なしに利用することが出来ます。

また、masterノードもAzure側で管理されて自分で管理する必要がないため、アプリケーションの開発に注力出来るというのも魅力です。

実際に使ってみます。

では、実際に使ってみたいと思います。

環境構築

まずは環境のセットアップから始めます。

環境はLinuxマシンが手元にあるものとして進めます。WindowsやMacでもおおむね同様にセットアップ出来ますが、ツールのインストールなどに関しては若干異なりますので、そのあたりは各自で調べて頂ければと思います。 なお、私はAzure上にUbuntuのVMを1台作って検証しました。

azコマンドのインストール

まずは、Azureのコマンドラインツールazコマンドをインストールします。

# pip install azure-cli

azコマンドはPython製なので、pipコマンドでインストールします。 pipが入っていない人は頑張ってインストールして下さい。

Azureへログイン

azコマンドでAzureへログインしておきます。

# az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AABBCC999 to authenticate.
[
  {
    "cloudName": "AzureCloud",
    "id": "99999999-8888-7777-6666-555555555555",
    "isDefault": true,
    "name": "Microsoft Azure Enterprise”,
    "state": "Enabled",
      :

※IDやコードは適当なものに置き換えています

GUIが使える環境であればブラウザが立ち上がりますし、使えない環境であっても表示されているURL https://microsoft.com/devicelogin にアクセスすると下記ページが開きますので、一緒に表示された認証コード(例:AABBCC999)を入力すればログイン完了です。

f:id:kusumoto-hde:20180516111942p:plain

一度上記作業をすることによって、そのマシンが認証されますので次回以降ログインの必要はありません。

Azureサブスクリプションなどの設定

使用するアカウントが複数のサブスクリプションを持っている場合、以下のコマンドで使用したいサブスクリプションを指定しておいて下さい。指定しない場合、先の az login で表示された最初のサブスクリプションが使われます。私もはじめは意図しないサブスクリプションにリソースが作成されてしまい少し嵌りました。

# az account set --subscription "Microsoft Azure Enterprise" 

ここでは、Microsoft Azure Enterprise というサブスクリプションを指定しています。

リソースグループがまだない場合は以下のコマンドで作成しておいて下さい。後ほどのコマンド実行時に指定します。既にある場合は作成は不要です。

# az group create -n kusumoto-dev -l eastus

ここでは、リソースグループkusumoto-deveastus(米国東部)に作成しています。

kubectlのインストール

Kubernetesのコマンドラインツール kubectl コマンドをインストールします。

# az aks install-cli --install-location ~/bin/kubectl  

なお、azコマンドはAzure全体のコマンドラインツールでAKS専用ではありませんので、AKS関連の操作をする場合には aks オプションを合わせて指定します。

これでセットアップは完了です。 それでは実際にAKSを使ってみましょう。

クラスタの作成

クラスタはaz aks createコマンドで作成します。このコマンドでAzure上にVMを作ったりするので少し時間がかかります。15分くらいかかりました。

# az aks create -n k8stest -g kusumoto-dev -l eastus --kubernetes-version 1.7.7 --generate-ssh-keys
{
  "additionalProperties": {},
  "agentPoolProfiles": [
    {
      "additionalProperties": {},
      "count": 3,
      :

リージョン eastus の リソースグループ kusumoto-devk8stest というクラスタを作成しました。

クラスタの作成はこれで完了です。VM作って、ノード作って、pod作って、という作業は必要ありません。

作成されたクラスタを見てみましょう。 まずは、azコマンドで。

# az aks list -o table 
Name     Location    ResourceGroup    KubernetesVersion    ProvisioningState    Fqdn
-------  ----------  ---------------  -------------------  -------------------  ---------------------------------------------------------
k8stest  eastus      kusumoto-dev     1.7.7                Succeeded            k8stest-kusumoto-dev-aaaaa-00000000.hcp.eastus.azmk8s.io

-oオプション表記させるためのオプションです。

k8stestクラスタが作成されていることが確認できます。

では、次にAzureポータルから見てみましょう。

f:id:kusumoto-hde:20180516141921p:plain

サービス公開

では、次に kubectl コマンドも使って作成したサービスを公開してみましょう。

証明書の取得

まずは、作成したクラスタの証明書を取得する必要があります。

# az aks get-credentials -n k8stest -g kusumoto-dev
Merged "k8stest" as current context in /root/.kube/config

このコマンドはクラスタごとに1回だけ実行しておけばよいです。

Webコンテナの作成

では、実際にWebコンテナを作成して公開してみましょう。

アクセス確認の意味も含めてノード一覧を見てみましょう。

# kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-nodepool1-30888801-0   Ready     agent     42m       v1.7.7
aks-nodepool1-30888801-1   Ready     agent     42m       v1.7.7
aks-nodepool1-30888801-2   Ready     agent     42m       v1.7.7

確かに、3ノード出来ています。 ノード数を増やしたい場合(スケールアウト)は、az aks scale を使います。これは後ほど説明します。

Docker Hub より nginx のイメージを取得&実行。

# kubectl run mynginx --image=nginx:1.13.5-alpine
deployment.apps "mynginx" created

コンテナ(Pod)が出来ているか確認。

# kubectl get pods
NAME                       READY     STATUS    RESTARTS   AGE
mynginx-1485169511-1pjds   1/1       Running   0          5s

確かに出来ています。 ノードやPod(コンテナの概念)の説明は省きますが、これだけでnginxの環境が出来ています。

あとは、外部に公開するための設定です。 80ポートを指定して公開します。

# kubectl expose deploy mynginx --port=80 --type=LoadBalancer
service "mynginx" exposed

公開されているか見てみましょう。

# kubectl get services
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.0.0.1       <none>        443/TCP        58m
mynginx      LoadBalancer   10.0.141.176   11.22.33.44   80:31310/TCP   3m

EXTERNEL-IP がグローバルIPです。kubectl expose 実行直後はまだIPが付いていないこともありますが、少し待てば自動的に付与されます。これだけでもう公開出来たので、ブラウザで http://40.71.1.148 とアクセスすれば Welcome to nginx! のページが開きます。

f:id:kusumoto-hde:20180612182915p:plain

実際に運用するとなると、ドメインを取得したり、HTTPSの設定をしたり、セキュリティの設定をしたり、とやらないと行けないことはまだまだありますが、基本的な環境はこれで出来上がりますので、簡単です。

スケールアウト

しばらく運用してみた→アクセスが増えてきた→サイトが重くなってきた! というわけでスケールアウトしてみたいと思います。

現在ノードは3つ。これを5つに増やしてみます。 実行するコマンドは以下の1つだけ。

# az aks scale -n k8stest -g kusumoto-dev --node-count=5

これだけでスケールアウト出来ます。 ノードの状態を見てみましょう。

# kubectl get nodes
NAME                       STATUS     ROLES     AGE       VERSION
aks-nodepool1-30888801-0   Ready      agent     1h        v1.7.7
aks-nodepool1-30888801-1   Ready      agent     1h        v1.7.7
aks-nodepool1-30888801-2   Ready      agent     1h        v1.7.7
aks-nodepool1-30888801-3   Ready      agent     1m        v1.7.7
aks-nodepool1-30888801-4   NotReady   agent     1s        v1.7.7

確かに2個増えて5個になっています。 最後の1つはまだ配備が完了していませんが、しばらくしたら自動で完了します。

Azureのポータルから見ても増えていることが確認できます。

f:id:kusumoto-hde:20180612184914p:plain

通常サーバーを増やす場合は、サーバーを構築して設置してIPつけてロードバランサに組み込んで、といったことをしないといけませんが、そのあたり全て自動で行われるので安全かつシンプルにスケールアウトすることが出来ます。

もちろん、--node-countオプションで数を減らせばスケールダウンすることも出来ます。その場合も自動で該当ノードのIPをロードバランサから削除して安全にスケールダウンされます。

クラスタの削除

クラスタを削除する場合は、az aks deleteです。

# az aks delete -n k8stest2 -g kusumoto-dev
Are you sure you want to perform this operation? (y/n): y
  :

サービスが終了するのは悲しいことですが、リソースが作られたままだと課金され続けてしまいますので、不要になったクラスタは上記コマンドで消してしまいましょう。

masterノードへのアクセス

AKSを使う場合、masterノードを利用することはありませんが、それでもアクセスしたいとなった場合は以下のコマンドを実行します。

# az aks browse -n k8stest -g kusumoto-dev
Merged "k8stest" as current context in /tmp/tmpvtNG_R
Proxy running on http://127.0.0.1:8001/
Press CTRL+C to close the tunnel...
Forwarding from 127.0.0.1:8001 -> 9090
Forwarding from [::1]:8001 -> 9090

ブラウザが立ち上がりお馴染みの(?)Kubernetesの管理画面が開きます。 f:id:kusumoto-hde:20180612190528p:plain

azコマンドをローカルのPCで実行している場合はこれでよいですが、SSHなどでリモート先の環境で実行しているなどGUIが使えない場合は、--disable-browser オプションを付けるとよいでしょう。ブラウザは立ち上がりませんので、ポートフォワードなので、そのマシンの 8001 ポートへアクセスできれば、管理画面が開けます。

なお、ポート番号は自動で8001になるようで、変更する方法は見つかりませんでした。公式のマニュアルにもありません。az aks browse は内部的には kubectl コマンドを実行しているようなので、どうしてもポート番号を変更したい場合は、kubectl コマンドで頑張る必要があるようです。

Kubernetesのアップデート

ミドルウェアに脆弱性が発見されて、アップデートしないといけないが、色々影響がありそうそう簡単にアップデートできない・・・・なんてことにならないように、Kubernetesのバージョンアップもサービス影響なく簡単に行なえます。

バージョン1.8.1にアップデートする例です。

# az aks upgrade -n k8stest -g kusumoto-dev --kubernetes-version 1.8.1

一つずつ順番にローリングアップデートされているのがわかります。

# kubectl get nodes
   :
aks-nodepool1-30888801-4   Ready     agent     13m       v1.7.7
aks-nodepool1-30888801-5   Ready     agent     35s       v1.8.1 ←Create new node

# kubectl get nodes
   :
aks-nodepool1-30888801-4   NotReady,SchedulingDisabled   agent     14m       v1.7.7     ←Stopping old  node
aks-nodepool1-30888801-5   Ready                         agent     1m        v1.8.1

# kubectl get nodes
   :
aks-nodepool1-30888801-5   Ready     agent     3m        v1.8.1 ←Removed the old node.  Upgrade DONE!

なお、Kubernetesは現時点(2018年6月)で ver.1.10 まで出ているようですが、AKSが対応しているのは ver.1.9 までの様です。

さいごに

AKSを使うことによって、Kubernetes の使用への敷居が一気に下がったのではないかと思います。今まで運用で苦労していた色々な点がこれで解消できることが期待されます。ただ、このサービス、利用できるリージョンはまだ米国のみとのことで、日本リージョンでは今は利用できません。MSの人によるとまだロードマップにも乗っていないとのことなのですが、早く日本で利用できる様になるといいですね。

シンガポール出張 最終日

こんにちは!インターン生の林元です。 四日間にわたりシンガポールでの出来事をお伝えしてきましたが、今日で最後になってしまいました。 最終日だったこともあり、今日はアポ一件同行させていただいてその後は空港に直行。 時間がたつのはとてもはやいですね。毎日が新しい発見と学びの連続だったこともあり、もう少し長く滞在したかったという寂しい思いでいっぱいです。

今回同行させてもらった商談は、かなりテクニカルな内容だったこともあり理解するのに苦戦したものの、新しいビジネスが形になる過程を実際に目撃することができてすごく良い経験になりました。インターン生という立場でこのような大事でリアルな商談の現場に足を運ぶことができたのは本当に凄い事ですよね。未熟な学生を素敵な場所に連れて行ってくださり本当に有難うございました。

f:id:maki-hayashimoto:20180324012211j:plain

新卒インターンのシンガポール出張レポート#最終日

こんにちは!新卒インターンの豊崎です。

早いもので、ついにシンガポール出張も最終日です。

最終日の本日は、再び現地のパートナー企業さんを訪問しました。

HDE Oneのお客様のお話や、新規ビジネスへのフィードバックなど、本日の訪問はテクニカルなお話が中心でした。 (昨日のIoT Asiaに引き続き、通信技術がわかったら楽しいんだろうなあ)


最後の最後まで知識欲が刺激されたシンガポール最終日でした。

振り返ってみると、シンガポールでの4日間は本当にあっという間に終わってしまいました。

4日間という短い間でしたが、やはり日本を飛び出して海外に来てみると、人々の働き方も、セキュリティのニーズも全く異なることが実感できます。
(新卒インターンの大学生に貴重な機会を与えてくれたHDE, Thank you!!)

そしてついにシンガポールとも、読者の皆さんともお別れです。
f:id:hiroshi-hde:20180323214126j:plain
またいつかHDEブログを更新出来る日を楽しみにしています。
以上、豊崎でした。

新卒インターンのシンガポール出張レポート#day3

こんにちは。新卒インターンの豊崎です!

シンガポール出張も 本日で3日目を迎えました。

そして本日は、今回の出張の目的であるIoT Asia 2018の2日目に参加してきました!


IoT Asia 2018は、企業のブース出展やカンファレンスなど、アジアを中心に世界中からIoTに関連した企業が100社以上集まる一大イベントです。

(イベントの様子は文字だけでは伝わりにくいので、本日のブログは写真を交ならがらのイベントレポ風です!!)


まずは入り口を入ると、、、

f:id:hiroshi-hde:20180323013855j:plain


早速出展企業のブースがたくさん。

f:id:hiroshi-hde:20180323013935j:plain

写真左側の赤いカラーのブースはすべてシンガポール企業です。



こちらが実際にIoT Asia 2018に出展しているシンガポール企業の一覧。

f:id:hiroshi-hde:20180323015452j:plain

やはり開催国だけあって、出展企業数も多いですね。

○ッパー君みたいなロボットを展示している企業もありました。

f:id:hiroshi-hde:20180323014128j:plain

他にも、台湾企業のブースや、

f:id:hiroshi-hde:20180323014236j:plain

韓国企業のブースも。

f:id:hiroshi-hde:20180323014357j:plain



他にも沢山の企業ブースがありましたが、 そんな中で豊崎のお気に入りはこちら。

f:id:hiroshi-hde:20180323014445j:plain

なんと、タブレットからメニューをタッチするだけで、自動でカクテルを作ってくれる自動バーテンダーデバイス。

(HDEオフィスにも欲しい。。。)



そして我らがHDEブース。

f:id:hiroshi-hde:20180323014554j:plain

インターンの豊崎も、HDEブースで説明スタッフとしてブース運営をお手伝い。



さて、刺激的なイベントに豊崎は終始ワクワクしていたのですが、 IoT Asia 2018の全体的な感想としては、”IoT”がメインなだけあって、電子回路系のビジネスを扱う出展企業が多かった印象です。


電子回路系の企業の中でも、特にIndustry 4.0の領域の企業ブースなどは、IT初心者の豊崎が理解できないこともまだまだ多く、己の勉強不足に歯がゆい思いをしてしまいました。

(こういうのが理解できたらもっと楽しいんだろうなあ)

ますます知識欲が刺激されたIoT Asia 2018への参加をもって、シンガポール出張の3日目は終了です。

明日のシンガポール出張最終日は、再び現地のHDEパートナー企業さんを訪れた後、ついに日本に帰国します!

それではまた明日の更新をお楽しみに!


P.S.

IoT関連のデジタルツールで溢れていたIoT Asia 2018会場。

実はこんなアナログなリラックススペースも。

f:id:hiroshi-hde:20180323014711j:plain



座り心地、最高でした。

f:id:hiroshi-hde:20180323015003j:plain


以上豊崎でした。

シンガポール 三日目

こんにちは! 今日はついにIOTASIAのイベントに参加してきました。我々のミッションはHDEで開発中である商品(meeting room optimiser)のニーズの有無を現地の声を集めながら調査する事でした。最初は商品にどれだけの訪問者の方が興味を示してくださるのか、全くわからず不安でいっぱいでした。が、日本でも会議室の空き状況を即座に把握するニーズがあるように、海外でも同じように問題意識を抱えている人たちがたくさんいることに気付きました。 大企業であればあるほど、必要な会議室の数は多くなりますし、効率的に会議室を予約して使用することが求められます。しかし、海外では会議室を予約せずに他の人が勝手に使用していて困るケースが多いようで、、。これは日本の企業ではあまり耳にしないお話だったので、聞いていてすごく興味深かったです。また、この商品に対する率直な現地の人の意見をたくさん回収できたこともすごく良かったなと感じています。人間の存在を感知するだけではなく、その部屋にいる人の人数や顔も把握できたほうがよいのではないか、という意見や、照明を自然に調整できるシステムとコラボすれば良いのではという意見もありました。私の想像を超えた新しい枠組みからの声はすごく刺激になりましたし、聞いていてとても勉強になりました。今回得た情報を日本に持ち帰り有効活用していきたいと思います。そして何よりも、インターン生という立場でこのような素晴らしいイベントに関われたことにすごく感謝しています!本当にお疲れ様でした。 f:id:maki-hayashimoto:20180323000614j:plain

皆様お疲れ様でした!

イベントの後はシンガポールのソウルフードとも言われている牛骨茶を食べに行ってきました。日本のコンソメスープと鶏ガラスープを混ぜ合わせたような味で本当に美味しかったです。シンガポールを訪れる機会がある方はぜひ一度ご賞味ください! f:id:maki-hayashimoto:20180323001002j:plain

牛骨茶で有名な老舗

そしてさらにその後は、、マリーナベイサンズホテルの最上階で夜景を楽しんできました! いやーーーー最高の眺めでした。 f:id:maki-hayashimoto:20180323001143j:plain

マリーナベイサンズからの夜景

明日は早くも帰国日。毎日が濃くて学びの連続でした。 自分一人では絶対経験できなかった数々のことを経験させていただけて本当に幸せで楽しい三日間でした。 関わってくださり、いろいろ親切に面倒を見てくださったすべての方々にお礼を言いたいです! 本当にありがとうございました。

シンガポール 二日目

こんにちは!林元です。 今日もシンガポールでの出来事をお伝えしていこうと思います。 今日は朝から2件アポイントメントが入っていたため、そちらに営業の方と同行させて頂きました。 シンガポールで会社を経営されている方のお話を聞くのは非常に興味深かったです。日本では当たり前のように守られている期日や、早いレスポンスなどが、海外では決して当たり前ではないということを改めて再認識しました。日本でのニーズがそのまま海外に適応されることは難しいのだと感じました。明日はいよいよIOTアジアのイベントに参加します。しっかり 今日学んだ事を活かして、新しい商品が海外の方々にもニーズがあるのかどうかを調査してきたいと思います!

実は今日少し観光も行ってきました!シンガポールといえば、、、マーライオン! f:id:maki-hayashimoto:20180322084623j:plain

マーライオンとマリーナベイサンズ
しっかり定番のポーズで写真も撮ってきました^^

今日は早く寝て明日に備えようと思います! 今日も一日お疲れ様でした。

新卒インターンのシンガポール出張レポート#day2

こんにちは!新卒インターンの豊崎です!

シンガポール出張2日目は、現地のパートナー企業さん訪問でした!

(他のHDEメンバーはIoT Asiaの一日目に出展していたので別行動です)


インターン達は、シンガポールでHDE Oneを販売して頂いている大切なパートナーさん(現地のリセラーさん)を2件訪問しました。


彼らのお話で印象に残っているのは、やはり「日本とシンガポールは異なる」ということ。

国が違えば、クラウドセキュリティの市場状況もそこで働く人々の文化も異なります。


東南アジアでは日本ほどセキュリティの意識が高くなく、HDE Oneへのニーズもまだまだこれからだとか。

(裏を返せば、これから伸びしろがあるということでもあるのでしょうか)

セキュリティの市場状況もさることながら、豊崎が一番印象に残っているのはシンガポールで働く人々の文化のお話です。


シンガポールは多民族国家なので、ローカルスタッフの方々にも宗教や文化の違いがあるのだとか。


シンガポールは多民族国家だからこそ、多様性が豊か。

こうした多様性はチームに多様な視点をもたらす一方で、制約を伴います。


ムスリムの方がいらっしゃれば、決まった時間に祈祷をされますし、お食事もハラールで無ければなりません。

また、ヒンドゥー教徒の方ならば、牛はNGです。


他にも宗教ではありませんが、欧米系の方にはベジタリアンの方も多いです。



そしてこうした制約は、これから日本が外国籍の方々と協力していく過程で必ず直面する問題でもあります。

(ちなみに、HDEでは祈祷室の設置など、多様性を尊重する会社作りを進めています!)


さて、もし読者の皆さんがこういった多様性のあるチームを率いるとしたらどうしますか?

例えば、宗教的な多様性のあるチームの夕食会の幹事を務めるとしたら??


本日僕達が訪問したパートナー企業さんいわく、そんな時は名の通ったホテルのビュッフェがオススメとのこと。


名の通ったホテルならば宗教への配慮がされている場合も多いですし、ビュッフェ形式なので個々人が自由に食事を選べて、チームみんなが楽しめる可能性が高いらしいです。


さすが多民族国家シンガポールのプロフェッショナルからの、ナイスアドバイスですね!

もちろん、ビュッフェならお腹をすかせた豊崎も大満足です!!

これで次回のインタナショナルチーム夕食会は、バッチリですね!

以上、豊崎でした!

明日はいよいよIoT Asia 2018の2日目に参加してきますのでお楽しみに!