Hatobaでコンテナを動かしてみた

# Hatobaでコンテナを動かしてみた

みなさん、こんにちは。
[富士通クラウドテクノロジーズ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/fjct)の3日目の記事です。

## はじめに

ニフクラからHatobaというコンテナのサービスが提供されています。サービス紹介は[こちら](https://pfs.nifcloud.com/service/hatoba.htm)から。

Hatobaは、ニフクラから提供されているKubernetesクラスターを簡単に構築・管理できるサービスです。  
Hatobaで構築したクラスターは、ニフクラにてマネージメントされています。Kubernetesの標準的な操作で、コンテナ化されたアプリケーションを、クラスター上にデプロイできます。
今日は、このサービスを利用してコンテナをデプロイするところまでをやっていきます。

## 前準備

操作するための環境をニフクラ上に作成していきます。  
今回は、VMware Photon OS 3.0を利用していきます。まずは、docker動くようにしていきます。  
ニフクラのコントロールパネルから、VMware Photon OS 3.0を選択してサーバを作成します。  
起動したらsshで接続を行い、dockerが動作する環境を作っていきます。

```bash
systemctl start docker
```
ちゃんとdockreコマンドが動作するか確認します。

```bash
docker --version
```

ログインもしておきましょう。

```bash
docker login
```

### アプリケーションを用意する

アプリケーションを格納するためのディレクトリを作成します。

```bash
mkdir demo-app
cd demo-app
```

コンテナを作るために簡単なアプリケーションを作ります。  
pythonのflaskというフレームワークを使って実装します。 
 
```bash
mkdir src
vi src/app.py
```

[最小規模のアプリケーション例](https://a2c.bitbucket.io/flask/quickstart.html#id2)があったので、こちらを利用します。

```python:app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':
    app.run()
```

## コンテナを用意する

作成したアプリケーションを動作するコンテナを用意します。  
pythonのコンテナでFlaskが動作するDockerfileを作ります。

```bash
vi Dockerfile
```

```Dockerfile:Dockerfile
FROM python:3.6
RUN pip install Flask
ARG project_dir=/projects/
ADD src/app.py $project_dir
WORKDIR $project_dir
CMD flask run --host 0.0.0.0 --port 5000
```

## コンテナの動作確認を行います。

コンテナを作成して、動作を確認します。  

```bash
docker build -t demo-app .
docker run -d -p 5000:5000 demo-app
```

起動したコンテナに接続してみます。  

```bash
curl -s http://127.0.0.1:5000
```

「Hello world!」が表示されました。

## 作成したコンテナをDockerHubに登録

コンテナをDockerHubに登録します。

```bash
docker image tag demo-app <DockerID>/demo-app:v1
docker image push <DockerID>/demo-app:v1
```

## クラスタを作成する

では、このコンテナを動作させてるためのKubernetes環境を作成していきます。  
ニフクラにログインしてHatobaを選択します。

![00_ダッシュボード.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/34960897-7950-85ab-f312-56312985f6cd.png)

  
左メニューからファイヤーウォールを選択して、以下のアクセスに必要なポートを開けておきます。

![01_FW設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/f0c33066-989b-9fe5-de5d-d6be261442da.png)

| ポート番号 | 説明 |
|:-:|:-:|
| 6443 | kubectl用 |
| 31500  | Flaskアプリケーション用 |

左メニューからクラスタを選択して、クラスタを作成していきます。
クラスタを選択すると、以下の画面が表示されます。

![02_クラスタ一覧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/9fc1b1ae-0343-cefd-53fc-fd99f5c226ab.png)

クラスタを作成するために、[クラスタ作成]ボタンをクリックします。

![03_クラスタ作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/2e044859-b084-9705-f867-e0900d46af27.png)

必要な項目を入力・選択して、[ノードプールの設定へ]ボタンをクリックします。

![04_ノードプール作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/46354770-1bb5-4be9-a2b0-43223c61219e.png)

必要な項目を入力・選択して、[確認へ]ボタンをクリックします。

![05_設定内容確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/32842dd1-3aab-2381-e5fd-2eb22d58af1b.png)

内容を確認して、[作成する]ボタンをクリックします。

![06_起動後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/e4d08932-dbf2-9db2-c516-8da74b1a2523.png)

正常に起動されると、上記の画面が表示されます。

## kubectlを動かしてみる

はじめに、コマンドをインストールします。

```bash
tdnf -y install kubernetes-kubectl-extras
ln -s /opt/vmware/kubernetes/linux/amd64/kubectl /usr/local/bin
```

続いて、kubectlを使うための準備をします。  
接続のためのクラスター クレデンシャルを登録します。
コントロールパネルからクラスタを選択して、クレデンシャル表示を選択します。

![07_クレデンシャル表示.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7257/f665efb0-40bc-d5d6-2dfc-78916be80fc1.png)

表示されているクレデンシャルをコピーし、`~/.kube/config`を作成します。

```bash
mkdir ~/.kube
vi  ~/.kube/config
```

kubectlが正しく動作するかを確認します。

```bash
kubectl get nodes
```

作成したノードの情報が取得できれば完了です。

## アプリケーションを登録する

作成したクラスタにコンテナを登録していきます。
登録するアプリケーションの定義ファイルを

```bash
vi demo.yaml
```

```yaml:demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-flask
  labels:
    app: app-flask
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app-flask
  template:
    metadata:
      labels:
        app: app-flask
        version: v1
    spec:
      containers:
        - name: app-flask
          image: <DockerID>/demo-app:v1
          command: ["flask"]
          args:
            - "run"
            - "--host"
            - "0.0.0.0"
            - "--port"
            - "5000"
          ports:
            - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: app-flask
spec:
  type: NodePort
  selector:
    app: app-flask
  ports:
    - protocol: TCP
      port: 5000
      name: app-flask
      nodePort: 31500
```

アプリケーションの登録を実施します。

```bash
kubectl apply -f demo.yaml --record
```

## アクセスしてみる

ノードプールを表示して設定されているグローバルIPをコントロールパネルから確認して、ローカルで確認した時と同じように接続を行います。

```bash
# curl -s http://<PodのIPアドレス>:31500
```

「Hello world!」が表示されましたでしょうか。

## おわりに

いかがでしたでしょうか？  
Hatobaを使えば簡単に、Kubernetesを試すことができます。

明日は、 @tmtms さんの MySQL Parameters を拡張した になります。