[Kubernetes]IBM CloudでマネージドなKubernetesを使用する

#はじめに
これまでオンプレ（PC上のVM）でKubernetesの検証をしていました。
kubernetesを触ってみたい！と思った時に、試せる環境としては他に以下のようなものがあります。

* [Katacoda](https://www.katacoda.com/)
* [minikube](https://kubernetes.io/ja/docs/setup/learning-environment/minikube/)
* クラウドサービスを利用する

今回はクラウドサービスのうち、IBM Cloudを利用してみたいと思います。
IBM Cloudには無料枠があって、無料でもKubernetesのクラスタを作成することができます。
無料でできることは以下に記載されています。


[フリー・クラスターと標準クラスターの比較](https://cloud.ibm.com/docs/containers?topic=containers-cs_ov#cluster_types)

#マネージドと非マネージド
「クラウドでKubernetes」と言っても、マネージドと非マネージドの大きく2つあります。
マネージドはMaster Nodeまでをクラウドベンダーが面倒を見てて、非マネージドはHypervisorまでをクラウドベンダーが面倒を見ています。（IaaSの場合）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/1e47d4f0-9642-a8cc-d7fb-c7739f9e552f.png)

非マネージドは、クラウドでVMを払い出してから自分でKubernetesをインストール、セットアップしていきますので、Kubernetesのセットアップに関してはオンプレミスとあまり変わりません。

今回はIBM CloudでマネージドなKubernetesを利用したいと思います。

#クラスタの作成
ドキュメントには色々と書かれているのですが、こちらに沿って進めていきます。

[クラスターの作成](https://cloud.ibm.com/docs/containers?topic=containers-learning-path-admin&locale=ja#admin_cluster)


##CLIのセットアップ

IBM CloudのCLIとプラグインをローカルPCにインストールします。

[CLIのインストール](https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install&locale=ja)

使用するPCは以下のOSになります。

```
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.4
BuildVersion:	19E287
```

###インストール
[ステップ 1. インストール・コマンドの実行](https://cloud.ibm.com/docs/cli?topic=cli-getting-started&locale=ja#idt-prereq)

MACのターミナルから実行します。

```
% curl -sL https://ibm.biz/idt-installer | bash
[main] --==[ IBM Cloud Developer Tools for Linux/MacOS - Installer, v1.2.3 ]==--
[install] Starting Installation...
・・・
プラグイン名                           バージョン   状況
cloud-functions/wsk/functions/fn       1.0.39
cloud-object-storage                   1.1.3
container-registry                     0.1.471
container-service/kubernetes-service   1.0.57
dev                                    2.4.0        更新が使用可能です
・・・
[install_plugins] Finished installing/updating plugins
[env_setup] WARN: Please restart your shell to enable 'ic' alias for ibmcloud!
[install] Install finished.
[main] --==[ Total time: 674 seconds ]==--
```
私のPCだと10分ほどかかりました。

###インストールの確認

```
% ibmcloud dev help

プラグイン 'dev 2.4.7' が現在使用可能です (2.4.0 をご利用中です)。
'ibmcloud plugin update dev' を使用してプラグインをアップグレードしてください。
'ibmcloud config --check-version=false' を使用して更新チェックを無効にしてください。

名前
   ibmcloud dev - アプリケーションの作成、開発、デプロイ、およびモニターを行います

使用法:
   ibmcloud dev command [arguments...] [command options]

バージョン:
   2.4.0
・・・
```

インストールは成功していますが、新しいバージョンがあると出てきましたので、メッセージ通りにアップデートします。

```
% ibmcloud plugin update dev
プラグイン 'dev 2.4.0' がインストールされました。
リポジトリー 'IBM Cloud' からプラグイン 'dev' のアップグレードを確認しています...
'dev 2.4.0' から 'dev 2.4.7' へ更新
バイナリー・ファイルをダウンロードしようとしています...
 27.35 MiB / 27.35 MiB [====================================================================================] 100.00% 3m26s
28680688 バイトがダウンロードされました
バイナリーを更新しています...
OK
プラグインは正常にアップグレードされました。
```

###ログイン
IBM Cloudにログインしてみます。

```
% ibmcloud login -sso
API エンドポイント: https://cloud.ibm.com

https://identity-1.ap-north.iam.cloud.ibm.com/identity/passcode からワンタイム・コードを取得して、続行します。
デフォルトのブラウザーで URL を開きますか? [Y/n] > y
```
-ssoを指定すると、ワンタイムパスワードでログインできます。
メッセージの後に「ｙ」を入力すると、以下のようにブラウザにパスワードが表示されます。

![スクリーンショット 2020-05-21 11.19.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/ffb96e66-bf66-786c-ed36-fba677268803.png)

このパスワードを入力すると、ログインできます。

```
One Time Code >
認証中です...
OK
```

#クラスタの作成
コマンドラインでも作成できるようなのですが、クラウドですのでブラウザから作成していきます。

[クラスターの作成](https://cloud.ibm.com/docs/containers?topic=containers-clusters&locale=ja#cluster_prepare)

[IBM Cloud](https://cloud.ibm.com/login)にログイン後、以下の順に辿ります。
　ダッシュボード ＞ カタログ ＞ Kubernetes Service

アカウントを作成していない場合は、「アカウントの作成」から作成します。

辿ると以下の画面になります。
デフォルトでは有料プランになっているので、「無料」に変更します。

![スクリーンショット 2020-05-21 11.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/7815c763-4d9d-34cd-efc3-5d814ce91cde.png)

無料に変更すると、以下の様になり変更/選択できるところがほとんどなくなります。
ここでは全てデフォルト設定で「作成」をクリックします。

![スクリーンショット 2020-05-21 11.35.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/de0ae8de-2e5b-0c64-37c8-d40fd61623cc.png)

この画面でしばらく待ちます。

![スクリーンショット 2020-05-21 13.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/018451b5-78ff-2883-e00a-2f3b511ae896.png)

作成できると「通常」と表示されます。

##環境の確認
構築できたら、まずはダッシュボードを見てみます。
右上の「Kubernetesダッシュボード」をクリックします。

![スクリーンショット 2020-05-21 14.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/4f1b4f8f-1944-0835-bf14-176e7c1c65e4.png)

次にCLIでもログインしてみます。
右上の「Actions...」->「CLIを介した接続」の通りにログインします。

```
% ibmcloud login -sso -a cloud.ibm.com -r us-south -g Default
API エンドポイント: https://cloud.ibm.com

https://identity-2.ap-north.iam.cloud.ibm.com/identity/passcode からワンタイム・コードを取得して、続行します。
デフォルトのブラウザーで URL を開きますか? [Y/n] > y
One Time Code >
認証中です...
OK

% ibmcloud ks cluster config --cluster br2vvt2d0xxxxxxxxxxxxx
Kubernetes version 1.16 has removed deprecated APIs. For more information, see <http://ibm.biz/k8s-1-16-apis>

If you have IBM Cloud Kubernetes Service clusters that run versions 1.13 or 1.14, update them now to continue receiving important security updates and support. Version 1.14 is deprecated and will be unsupported 31 May 2020. Versions 1.13 and earlier are already unsupported. For more information and update actions, see <https://ibm.biz/iks-versions>

OK
br2vvt2d0xxxxxxxxxxxxx の構成は正常にダウンロードされました。

br2vvt2d0xxxxxxxxxxxxx のコンテキストを現在の kubeconfig ファイルに追加しました。
これで、クラスターに対して「kubectl」コマンドを実行できます。 例えば、「kubectl get nodes」を実行します。
```
ログインできたら、クラスタの構成を確認します。

```
% kubectl get node -o wide
NAME           STATUS   ROLES    AGE   VERSION       INTERNAL-IP    EXTERNAL-IP     OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
10.47.64.113   Ready    <none>   56m   v1.16.9+IKS   10.47.64.113   173.xxx.xx.xx   Ubuntu 16.04.6 LTS   4.4.0-178-generic   containerd://1.3.4
% kubectl config current-context
mycluster-free/br2vvt2d0usec1kcn730
% kubectl version --short
Client Version: v1.16.2
Server Version: v1.16.9+IKS
```
Worker Nodeが一台だけ構成されていますね。Master Nodeは表示されていないです。
無料枠だと、1台のみのクラスタになります。


#Service/Podのデプロイ
せっかくなので、Podをデプロイしてアクセスできることを確認したいと思います。

##NodePortの作成
以下のマニフェストのNodePortを作成します。

```nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: node-port
spec:
  type: NodePort
  ports:
    - name: node-port
      protocol: TCP
      port: 8080
      targetPort: 80
      nodePort: 30001
  selector:
    app: nginx-dep
```

```
% kubectl apply -f nodeport.yaml
service/node-port created
% kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   172.21.0.1       <none>        443/TCP          78m
node-port    NodePort    172.21.151.109   <none>        8080:30001/TCP   11s
```

##Podの作成
以下のマニフェストのPodを作成します。

```nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-dep
  template:
    metadata:
      labels:
        app: nginx-dep
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
```

```
% kubectl apply -f nginx.yaml
deployment.apps/nginx created
% kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6c4975c9f5-8c6cp   1/1     Running   0          11s
nginx-6c4975c9f5-fxxh4   1/1     Running   0          11s
```

Podのデプロイもできましたので、疎通を確認します。
接続するIPアドレスは、WorkerNodeの「EXTERNAL-IP」です。

ローカルPCから接続を確認します。

```
% curl -s http://173.xxx.xx.xx:30001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```
接続できました！

#まとめ
今回はIBM Cloudの無料枠で作成できるKubernetesクラスタを作成しました。
環境が限られていますのでKubernetsのすべての機能は使えませんが、「とりあえず触ってみたい」という方にはよいのではないでしょうか。

Katacodaはブラウザで簡単に試せますが、決まった操作しかできません。minikubeは自分のPCにインストールする必要があります。
クラウドサービスを活用すると自分のPCにインストールすることなく（クライアントツールをインストールする必要はありますが）Kubernetesをある程度自由に触れます。
今回はIBM Cloudを例にしましたが、他のクラウドサービスにも無料枠がありますので色々試してみるにはいいですね。

なお、今回作成したクラスタは、30日経ったら自動で削除されてしまうようです。

#追伸
無料アカウント（ライトアカウント）で作成できると思っていたのですが、ライトアカウントでは作成できませんでした。
自分はトライアルのアカウントのようです。
ご指摘いただいた方、ありがとうございました。