はじめに
年が明けまして2020年を迎えましたが、皆様いかがお過ごしでしょうか。
2020年代は5Gの整備が完了し、IoTや自動運転技術が大いに浸透する10年であると言われていますが、2010年代も激動の10年でした。
特に、2013年ごろから開発が始まったKubernetesがようやくGA段階となり、各クラウドベンダーでマネージドサービスとして展開されたことが大きかったと思います。
これによってコンテナ技術やマイクロサービスがより管理しやすくなり、これから様々なサービスが生まれ進化してくことでしょう。
今回は、初投稿ではありながら、これからKubernetesを触ってみたい!という方のために、私がいろんな文献や技術書を読み漁って勉強した、
Kubernetesでアプリケーションを外部公開する手順
を、IBM Cloudを用いて紹介しようと思います。
※なお、筆者も勉強し始めで、詳しい技術や論理は理解している途中でございますので、深く知りたい!という方はこの後の参考資料をご覧ください。
この記事はあくまでアプリを開発してKubernetesにデプロイするまでの流れを紹介するものです。
Kubernetesとは?
1. 読み方
そもそもどう読むの?くべ..くば..くばねってす?何語?ってなると思います。私もなりました。
いろんな動画を見ていると開発者の間ではクーバネ(ー)ティスと呼ばれているみたいです。クーバネティス。分かんねぇよ。
ギリシャ語で操舵手とか、航海長とかいう意味みたいですね。
では一体どういう技術何でしょうか??
2. Kubernetesとは
Wikipediaによれば
「コンテナ化したアプリケーションのデプロイ、スケーリング、および管理を行うための、オープンソースのコンテナオーケストレーションシステム」
とされています。
私が一番にお世話になった技術書(詳しくは後述の参考資料をご覧ください)にも
「コンテナ化されたアプリケーションを合理的に運用するために設計されたOSSのプラットフォーム」
として紹介されています。
すなわち、KubernetesはDockerなどでコンテナ化されたアプリケーションなどを運用、管理するために利用されるOSSのプラットフォームということですね。なんかすごそうですね。
それでは早速本題に入っていきます。
開発環境
macOS
node.js 12.2.0
npm 6.13.4
docker cli 19.03.5
前提条件
- Node.js, npmがインストール済みである。
- Gitコマンドが打てる。
- Dockerアカウントを作成済みである。
1. 事前準備
1-1. IBM Cloudのアカウントを作成
まずはじめに、IBM Cloudのアカウントを作成しましょう。
Kubernetesの利用方法は数多くありますが、クラウドベンダーが提供するKubernetesマネージドサービスを利用すれば、必要なものが全て揃っているのでとても便利です。
これを使う手はありませんね。
ここで注意ですが、IBM CloudのKubernetesサービス(以下、IKS)は、無料アカウントでは利用できず、クレジットカードの登録をして、従量課金アカウントへアップグレードしなくてはいけません。
しかし、だからと言ってお金がかかる訳ではなく、1ヶ月間限定やワーカノードは1つのみなどの色々な制約はありますが、IKSにはフリークラスタの提供があり、Kubernetesを試すことは十分にできますのでご安心ください!
サークルの仮入部みたいな感じですね。
やべ、Kubernetesサークル、ちょうたのちぃ...となれば会費払って正式に入部すればいい訳です。
まずはここにアクセスして、IBM Cloudのアカウント作成ページに飛んでください。
順調にアカウント作成が進んだら以下の画面に進むと思います。
ここから、右上にあるアカウントのアップグレードをポチりしてください。
必要な情報を入力して、I accept the Cloud Service term
にチェックを入れたら完了です。はい、早い。
このダッシュボード画面はあとで操作するのでこのままにしておいてください。
1-2. IBM Cloud CLIのインストール
続いてIBM Cloud CLIをインストールしましょう。
これは、ご自身のPCのターミナルやコマンドプロンプトでIBM Cloudのリソースを管理することができるコマンドラインインタフェースであり、同時にKubernetes CLIもインストールされるため、Kubernetesの操作がコマンドで可能になります。
基本的にこの先Kubernetesをコマンドで操作していくことになるので是非ともIBM Cloud CLIのインストールを完了させておいてください。
私はすでにインストールを済ませてあるのでインストールコマンドだけ載せておきます。(詳しくはこちらをご覧ください。)
Terminal
#Mac, Linux用$ curl -sL https://ibm.biz/idt-installer | bash
環境によってはインストールにかなり時間がかかると思います。
Terminal
$ ibmcloud -v
ibmcloud version 0.21.0+f5d1134-2019-12-16T07:34:45+00:00
Terminal
$ kubectl version --short
Client Version: v1.14.8
上記2つのコマンドを叩いてバージョンがうまく出ていればインストールは完了です!
2. Webアプリケーションを作成
2-1. Node.jsでアプリケーションを作成
事前準備が済んだら、早速デプロイするためのアプリケーションを作りましょう!
今回はGitHubに演習用の簡単なアプリケーションを作成しておきました。
是非使ってみてください。
Node.jsのアプリケーションです。
※Node.jsとnpmはインストール済みであることが前提条件です。
Terminal
$ git clone https://github.com/rikkyrice/kube-sample-app
Cloning into 'kube-sample-app'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), done.
これで簡単にkube-sample-appというNode.jsアプリケーションのディレクトリが作成されました。
アプリケーション自体はいたってシンプルで、以下のようなサイトが表示されます。
これでWebアプリケーションの作成は終了です。はやっ
3. Dockerコンテナを作成する
続いてDockerにて生成したアプリケーションのコンテナを作成します。
Dockerはインストール済みであることが前提です。
3-1. Dockerfileの作成
それでは、コンテナ化する際に必要になるDockerfileを作成しましょう。
Dockerfileにはコンテナを動作させる構成情報を記載していきます。
kube-sample-app
をGitHubからcloneしてきた人はすでにディレクトリにDockerfile
があると思います。
Dockerfile
FROM node:12WORKDIR /usr/src/appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 8080CMD ["node", "app.js"]
3-2. コンテナのイメージを作成し、DockerHubへpush
続いてTerminalにて、kube-sample-appディレクトリのファイルからコンテナのイメージを作成します。
以下のコマンドをkube-sample-appディレクトリ
上で行ってください。
${ユーザ名}にはあなたのDockerHubのユーザ名を入力してください。
私の場合はrikkyrice/kube-sample-app:0.1
となります。
Terminal
$ docker build --tag${ユーザ名}/kube-sample-app:0.1 .
Sending build context to Docker daemon 106kB
Step 1/7 : FROM node:12
---> 6b5991bf650f
Step 2/7 : WORKDIR /usr/src/app
---> Running in 02ac3c501da8
Removing intermediate container 02ac3c501da8
---> 7e8b2f94b323
Step 3/7 : COPY package*.json ./
---> 90cd726f65d3
Step 4/7 : RUN npm install---> Running in 3abe5e4c5677
> ejs@3.0.1 postinstall /usr/src/app/node_modules/ejs
> node ./postinstall.js
Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)
added 64 packages from 39 contributors and audited 139 packages in 3.197s
found 2 moderate severity vulnerabilities
run `npm audit fix` to fix them, or `npm audit`for details
Removing intermediate container 3abe5e4c5677
---> 6882306b5a87
Step 5/7 : COPY ..---> 4085a1edc12c
Step 6/7 : EXPOSE 8080
---> Running in 794847f8f427
Removing intermediate container 794847f8f427
---> f8147522bc79
Step 7/7 : CMD ["node", "app.js"]---> Running in dadc7ad0b91e
Removing intermediate container dadc7ad0b91e
---> 1d08c3fe706c
Successfully built 1d08c3fe706c
Successfully tagged ${ユーザ名}/kube-sample-app:0.1
これでDockerイメージが${ユーザ名}/kube-sample-app:0.1
という名前で作成され、ローカルリポジトリへ保存されました。
そこからDockerにログインし、ご自身のDockerHubのリモートリポジトリへイメージをpushします。
以下のコマンドを実行してください。
Terminal
$ docker login
Authenticating with existing credentials...
Login Succeeded
$ docker push ${ユーザ名}/kube-sample-app:0.1
The push refers to repository [docker.io/${ユーザ名}/kube-sample-app]
485558bdae5c: Pushed
fe34ac93a512: Pushed
91da8ffeb073: Pushed
e204a1f85920: Pushed
af817f759558: Pushed
b5aa4fb76f12: Pushed
f68782bbfa17: Pushed
42f9c2f9c08e: Pushed
99e8bd3efaaf: Pushed
bee1e39d7c3a: Pushed
1f59a4b2e206: Pushed
0ca7f54856c0: Pushed
ebb9ae013834: Pushed
0.1: digest: sha256:15270113aa252fedf81d41066dd21a2cd7143fed7dc27649971bd9a6f2901ded size: 3051
これでご自身のDockerHubへイメージが格納されました。
いよいよKubernetesを触っていきます!
4. Kubernetesクラスタの作成
それではKubernetesのクラスタを作成しましょう。
基本的にアプリケーションはこのKubernetesクラスタのワーカノードが実行していきます。
4-1. IBM CloudからKubernetesクラスタを作成
先ほど事前準備で行ったIBM Cloudのアカウントダッシュボードを再度開いてください。
この右上にあるリソースの作成
またはカタログ
を押すと、IBM Cloudのサービスを選択できる画面に進みます。
そこからカタログの検索
にkubernetes
と入力し、Kubernetes Serviceを選択しましょう。
画面が移動したらそのままCreate
を押しましょう。
クラスタの作成画面に移ります。
初期設定ではStandard
が選択されていると思いますが、Free
を選択しましょう。
アカウントごとに一意の名前を自由に決められますが、今回はmycluster
としておきます。
Create cluster
を押してKubernetesクラスタを作成します!
Kubernetesクラスタの作成は約10分ほどかかります。
正月に余ったお餅でも食べながら気長に待ちましょう。
これでクラスタの作成は終了です。
次からはついにコンテナをクラスタへデプロイしていきます!
5. Kubernetesへコンテナをデプロイ
さぁついに最終章です。
Kubernetesにコンテナをデプロイしていきます!
5-1. ibmcloudへログイン
まずはターミナルを開いて、ibmcloudへログインしてください。
このコマンドを叩くと、対話型のログインプロセスが起動します。
事前準備で作成したご自身のIBM Cloudアカウントのメールアドレスとパスワードを入力して、ログインを完了させてください。
OKと出れば、ログイン成功です。
5-2. Kubernetesをターミナルで操作
これから、IBM Cloudのダッシュボードで作成したKubernetesクラスタをターミナルで操作していくための準備をしていきます。
まず、作成したIBM CloudのKubernetesクラスタの画面のAccess
タブを開き、次にAfter your cluster provisions, gain access
を順に実行していきます。
ターミナルを開いて、以下のコードを叩いてください。
Kubernetesクラスタの画面のコードをコピペすれば大丈夫です。
Terminal
$ ibmcloud ks cluster config --cluster${クラスタid}
正常に動作すると、環境変数が吐き出されると思います。
これをexportします。
Terminal
OK
mycluster の構成は正常にダウンロードされました。
環境変数をエクスポートして Kubernetes の使用を開始してください。
export KUBECONFIG=/Users/hashikiriku/.bluemix/plugins/container-service/clusters/mycluster/kube-config-hou02-mycluster.yml
$ export KUBECONFIG=/Users/hashikiriku/.bluemix/plugins/container-service/clusters/mycluster/kube-config-hou02-mycluster.yml
これで、指定したKubernetesクラスタを端末で操作することができるようになりました!
試しに以下のコマンドを叩いてみましょう。
Terminal
$ kubectl get node
NAME STATUS ROLES AGE VERSION
10.76.215.133 Ready <none> 6m45s v1.14.9+IKS
うまくワーカノードが表示されていますね。
5-3. deployment.ymlとservice.ymlを作成、実行
さぁ、Kubernetesクラスタにアクセスできるようになったので、いよいよコンテナをデプロイしていきます。
コンテナをデプロイするためにはポッドを作成し、そこにコンテナを配置する必要があります。
そのポッドを作成したり、稼働数を管理するのに用いられるのがデプロイメントです。
今回はこのデプロイメントをdeployment.ymlというマニフェストファイルに記述していきます。
GitHubからkube-sample-appをcloneしてきた方はすでにディレクトリに存在していると思います。
deployment.ymlのspec.template.spec.containers[1].imageの${ユーザ名}は、ご自身のDockerHubアカウントのユーザ名に書き換えてください。
deployment.yml
apiVersion:apps/v1kind:Deploymentmetadata:name:kube-sample-appspec:replicas:5selector:matchLabels:app:kube-sample-apptemplate:metadata:labels:app:kube-sample-appspec:containers:-name:kube-sample-appimage:${ユーザ名}/kube-sample-app:0.1command:ports:-containerPort:8080
これをターミナルで実行します。
Terminal
$ kubectl apply -f deployment.yml
deployment.apps/kube-sample-app created
これでポッドが作成されました。
今回はreplicasを5と設定し、稼働するポッドを5個生成するようにしました。
試しにポッドが5個作動しているか見てみます。
Terminal
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
kube-sample-app-f6478fbcc-74s4t 1/1 Running 0 3m18s
kube-sample-app-f6478fbcc-bbncl 1/1 Running 0 3m18s
kube-sample-app-f6478fbcc-lgk79 1/1 Running 0 3m18s
kube-sample-app-f6478fbcc-tplh6 1/1 Running 0 3m18s
kube-sample-app-f6478fbcc-znxq5 1/1 Running 0 3m18s
うまく動いているのがわかります。
しかし、これだけではブラウザからアクセスできません。
そこで、クライアントからのリクエストを受けるために必要なのがサービスです。
サービスにはいくつかタイプがあるのですが、今回はNodePortというタイプを用いて、ノードのIPアドレスに公開用ポート番号を開きます。
これで外部クライアントもポッドへアクセスすることができます。
今回はservice.ymlに設定を書き込んでいます。
service.yml
kind:ServiceapiVersion:v1metadata:name:kube-sample-app-servicespec:type:NodePortselector:app:kube-sample-appports:-name:webserverprotocol:TCPport:8080
これをターミナルで実行します。
Terminal
$ kubectl apply -f service.yml
service/kube-sample-app-service created
これで外部ネットワークへ公開する準備が整いました。
アクセスURLはKubernetesクラスタが持つパブリックIPアドレスに公開用ポートが付与された形で提供されています。
KubernetesクラスタのパブリックIPアドレスはIBM CloudのKubernetesクラスタの管理画面でも確認できますが、以下のコマンドでも確認することができます。
Terminal
$ ibmcloud ks workers ${クラスタ名}
OK
ID パブリック IP プライベート IP フレーバー 状態 状況 ゾーン バージョン
kube-bo6of95d0e80ipchv6ag-mycluster-default-000000a8 184.***.***.** 10.76.215.133 free normal Ready hou02 1.14.9_1544
このパブリック IPというのがKubernetesクラスタのパブリックIPアドレスになります。
さらに以下のコマンドで、サービスがどの公開用ポートで開いているかを確認することができます。
Terminal
$ kubectl get service kube-sample-app-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-sample-app-service NodePort 172.21.213.190 <none> 8080:32175/TCP 28s
このPORT(S)にある、32175というのが公開用ポート番号です。
これで公開されているURLがわかりました。
私の環境ではhttp://184.***.***.**:32175/
でアプリケーションが公開されています。
早速ブラウザで動作を確認してみましょう。
うまくアクセスできましたね!
他にもKubernetesには様々な機能があります。
例えばイングレスという機能を使えば、公開用のURLのパスへアプリケーションをマッピングしたり、HTTPS通信を実装したりすることもできます。
しかし、イングレスは標準クラスタのみでしか利用できません...残念っ
もし利用したかったら新しくフリークラスタではなく、標準クラスタを作成しましょう!
これ以外にもKubernetesには様々な機能があります。
私も今後もっともっと勉強して様々な技術をQiitaを通して紹介していこうと思います。
参考資料
・15Stepで習得 Dockerから入るKubernetes 高良真穂(著)
![Dockerから入るKubernetes]()
私がもっともお世話になった技術書です。Kubernetesのことはもちろん、Dockerのことについても詳しく紹介されており、大変参考になります。今も隣にあります。私のこのQiita記事はこの本を参考に書いてありますので、もっともっと詳しく知りたい!という方は是非ともこの本を買って読んでください。個人開発から法人のシステム開発まで幅広く適用できる技術書です。また、IBM Cloud以外にも、GCPでのKubernetesの利用方法も書かれていますので、多くの方をターゲットにされた本だと思います。
amazonリンク (https://www.amazon.co.jp/dp/B08221TFBH/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
・IBM Japan Channel(Youtube)
![]()
Youtubeチャンネルですね。これも大変お世話になっています。Kubernetesのハンズオンの紹介や、概念の説明をしたり、Kubernetesを小人の世界に例えて紹介されたりしています。是非ご覧ください。
URL(https://www.youtube.com/channel/UCR5bQwLkDls81oOkKbx45dw)
他にも色々参考にさせていただきましたが(例えばIBM公式の資料など)、最も参考にさせていただいた2点を紹介させていただきました。
終わりに
今回初めてQiitaの記事を書かせていただきました。
色々至らぬ点があると思います。
ここ間違ってるよ、とか、ここおかしいよ、とか。
是非ともご指摘いただければと存じます。
すぐに修正し、これからの励みにさせていただきます。
最後まで読んでいただきまして誠にありがとうございました。
良いお年を。