IBM Cloud Private k8sクラスターをCLIで操作してみる

前の投稿 [IBM Cloud Private: Kubernetesをオンプレミス(IaaS)に導入してみる](https://qiita.com/capsmalt/items/d15055ab3cb423d2d7ae) では，Kubernetes環境を構築した後，コンソール画面から少し操作をして終了としました。

今回はCLIを使ったクラスターへのアクセスについて書いてみたいと思います。

※既にIBM Cloud Private環境を構成済という前提で進めます。

# コマンドラインからKubernetesクラスターを操作する
手元のPCから，IBM Cloud Private (Kubernetesクラスター)に接続し，操作・制御してみます。
そのために 2つのCLIと，1つのプラグインを導入します。

- 1) kubectlコマンド: Kubernetes CLI [CLI]
- 2) bxコマンド: IBM Cloud CLI [CLI]
- 3) bx prプラグイン: IBM Cloud Private プラグイン [Plugin]

## 1) kubectlコマンド
### 1-1) kubectl: インストール
バイナリ取得，実行権限付与，OSのbinに移動。やることはそれだけです。

```text
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.7.3/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
```
参考: [Install and Set Up kubectl](https://v1-7.docs.kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl)

この他にも，IBM Cloud Privateのインストールイメージ内にあるkubectlコマンドをインストールすることもできます。
オフライン環境であったり，誰がやっても製品に対応したバージョンを導入できるという意味では便利かもしれません。
参考: [Accessing your IBM Cloud Private cluster by using the kubectl CLI](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/manage_cluster/cfc_cli.html)

### 1-2) IBM Cloud Privateへの接続，コマンド実行

- IBM Cloud Privateコンソールにログイン 
 - `https://10.132.75.83:8443/console`
- [右上のユーザーアイコン]>[Configure client]のように辿ります (下図参照)
 - <img width="592" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/f66ad86b-bdd2-2ebf-7755-935135325d96.png">
- ポップアップ内の "kubectl config〜〜〜" 数行をコピーします (下図参照)
 - <img width="962" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/dc4a1181-917b-0596-efa9-2867722de425.png">
- お手元のPCのターミナルにペーストして実行します

```text
$ kubectl config set-cluster mycluster.icp --server=https://10.132.75.83:8001 --insecure-skip-tls-verify=true
Cluster "mycluster.icp" set.

$ kubectl config set-context mycluster.icp-context --cluster=mycluster.icp
Context "mycluster.icp-context" modified.

$ kubectl config set-credentials mycluster.icp-user --token=eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF0X2hhc2giOiJSZDJWSDh5Mjl3alBLNVJydjEtZjVRIiwiaXNzIjoiaHR0cHM6Ly9teWNsdXN0ZXIuaWNwOjk0NDMvb2lkYy9lbmRwb2ludC9PUCIsImF1ZCI6ImNiNmI2ZDg4YTA2MjIyYTRkZTQ0MjhmMWFmMmZlMmQyIiwiZXhwIjoxNTEyOTUxOTM4LCJpYXQiOjE1MTI5MDg3Mzh9.BYhO4iURwi0dhEqPn1DdWzNNzQZRb7-tnCXXKzdbyDOK_ChFxCC-3JdxE01JWNM3Xaku0Ji-SoII9UCbeQx_SCGabRHcvUJF2RAEbWAehykXFyB9SpyBA_W9CPUxr_s8NY3XlDD75-3EMXxad73FsgP64IgSMZD72Vm1jeS4UOge4oMkOIaAvjqud-kOYrKXib8J8oCEtI7yBNOLf8dA_puoYhl2HGD9BBrpFEpCsCkZj0m8WFeg0LAD-Km7uhI6pjsNLiWpOD4E2re82D7y7ZqGZAcGSNWh2WA07lJLlYLSbOOpwF38Z-CVCjbdqAr_Lsu0izfWYsbDPI_83W5lGA
User "mycluster.icp-user" set.

$ kubectl config set-context mycluster.icp-context --user=mycluster.icp-user --namespace=default
Context "mycluster.icp-context" modified.

$ kubectl config use-context mycluster.icp-context
Switched to context "mycluster.icp-context".
```

これで手元のPC上のkubectlコマンドで，IBM Cloud Private上のkube-api-serverに対するAPI操作ができるようになりました。

いくつか実行してみましょう。

- ノード情報を取得

```text
$ kubectl get nodes

NAME           STATUS    AGE       VERSION
10.132.75.83   Ready     1d        v1.7.3-7+154699da4767fd
```

- pod一覧を取得
 - カタログからnodejsを選択してデプロイしていたので，1つ表示されています

```text
$ kubectl get pods

NAME                                        READY     STATUS    RESTARTS   AGE
appnodejs-ibm-nodejs-sam-2158423597-m9gmk   1/1       Running   0          1d
```

- namespaceがkube-systemとして設定されているpodの一覧を取得
 - ざっくり言うとIBM Cloud Privateの管理機能のプロセス
 - クラスターコンポーネント，ネットワークや認証，コンテナの利用量計測，モニタリングなど

```text
$ kubectl get pods -n kube-system

NAME                                                      READY     STATUS    RESTARTS   AGE
auth-apikeys-vdlfx                                        1/1       Running   0          1d
auth-idp-m2tf3                                            3/3       Running   1          1d
auth-pap-p1qj7                                            1/1       Running   0          1d
auth-pdp-5tsm1                                            1/1       Running   0          1d
calico-node-amd64-5lzc2                                   2/2       Running   0          1d
calico-policy-controller-1048521425-s07tl                 1/1       Running   0          1d
catalog-catalog-apiserver-18wtr                           1/1       Running   0          1d
catalog-catalog-controller-manager-3100032879-56t5f       1/1       Running   0          1d
catalog-ui-rzn8b                                          1/1       Running   0          1d
default-http-backend-198681862-t48zl                      1/1       Running   0          1d
elasticsearch-client-3479638665-n8pfj                     2/2       Running   0          1d
elasticsearch-data-0                                      1/1       Running   0          1d
elasticsearch-master-1570256108-g7b31                     1/1       Running   0          1d
filebeat-ds-amd64-4tnlw                                   1/1       Running   0          1d
heapster-1250025240-h1x2h                                 2/2       Running   6          1d
helm-api-2886503079-7g3wf                                 1/1       Running   0          1d
helmrepo-577444838-xk6mm                                  1/1       Running   0          1d
icp-ds-0                                                  1/1       Running   0          1d
icp-router-0lbfp                                          1/1       Running   0          1d
image-manager-0                                           2/2       Running   0          1d
k8s-etcd-10.132.75.83                                     1/1       Running   0          1d
k8s-mariadb-10.132.75.83                                  1/1       Running   0          1d
k8s-master-10.132.75.83                                   3/3       Running   0          1d
k8s-proxy-10.132.75.83                                    1/1       Running   0          1d
kube-dns-1038623989-jsrs6                                 3/3       Running   0          1d
logstash-4245234969-q4l16                                 1/1       Running   0          1d
metering-dm-653503904-b1hw0                               1/1       Running   0          1d
metering-reader-amd64-4tvx6                               1/1       Running   0          1d
metering-server-1157299371-zr5n1                          1/1       Running   0          1d
metering-ui-3198198023-pkb81                              1/1       Running   0          1d
monitoring-exporter-3293343457-q5t8v                      1/1       Running   0          1d
monitoring-grafana-2476181526-kz8v7                       2/2       Running   0          1d
monitoring-prometheus-2422752664-fcx6t                    2/2       Running   0          1d
monitoring-prometheus-alertmanager-3766402458-ts6ws       2/2       Running   0          1d
monitoring-prometheus-kubestatemetrics-3025976457-kwff6   1/1       Running   0          1d
monitoring-prometheus-nodeexporter-amd64-dg9rq            1/1       Running   0          1d
nginx-ingress-lb-amd64-zhrv0                              1/1       Running   0          1d
platform-api-14t17                                        1/1       Running   0          1d
platform-ui-3mbrx                                         1/1       Running   0          1d
rescheduler-9flqh                                         1/1       Running   0          1d
tiller-deploy-2307655136-zjv3n                            1/1       Running   0          1d
unified-router-lkgjr                                      1/1       Running   0          1d
```
## 2) bxコマンド (IBM Cloud CLI)
### 2-1) IBM Cloud CLI のインストール
[IBM Cloud CLI Installer](https://console.bluemix.net/docs/cli/reference/bluemix_cli/all_versions.html#ibm-cloud-cli-installer-all-versions) のページから，お使いのOSにあったものを選択しダウンロードします。(下図参照)
<img width="797" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/9d587be9-ce9e-c462-558a-2453e10e41eb.png">
macOSの場合だと，"Bluemix_CLI_0.6.2.pkg" のようなファイルがダウンロードできますので，オープンしてウィザードに従ってインストールしましょう。

```text
$ bx --help  // ヘルプで使いかたも確認しておきましょう
```
bxコマンドは，IBM Cloud (旧Bluemix)を操作できます。
IBM Cloud Privateでは，次のステップで導入するプラグインを追加して使用します。

## 3) bx prプラグイン (IBM Cloud Privateプラグイン)
## 3-1) IBM Cloud Private プラグインのインストール
IBM Cloud PrivateのKubernetesクラスターのノード操作や，helm charをロードする際などに使用します。
詳細は以下のCLIリファレンスを参照ください。
参考: [IBM Cloud Private CLI command reference](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/manage_cluster/cli_commands.html)


以下の手順で，prプラグインをコンソール画面から取得し，お使いのPCに導入します。

- IBM Cloud Privateコンソールにログイン 
 - `https://10.132.75.83:8443/console`
- [メニュー]>[Tools]>[Command line]を選択
 - <img width="283" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/2b082c7d-c7f6-e977-8668-743158d7fb67.png">
- お使いのOSにあったものをクリックしてダウンロード
 - <img width="1179" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/c9d90744-f5f0-a8f1-4752-f3384706be4a.png">
- bxコマンドで，上記でダウンロードしたファイル(icp-darwin-amd64)を指定してインストール
 - `$ bx plugin install icp-darwin-amd64`
 - 参考: `$ bx pr --help` で使いかたを確認できます

### 3-2) bx prプラグインでクラスターを操作してみる
せっかくなので，いくつかコマンドを叩いてみましょう。

クラスターにログインします。
今回はシングルノードなので，masterノードのIPは `10.132.75.83` ですので以下のように指定します。

```text
$ bx pr login -a https://10.132.75.83:8443 --skip-ssl-validation

 Login method invokedAPI endpoint: https://10.132.75.83:8443

Username> admin

Password>
Authenticating...
OK

Select an account:
1. ICP Account (8733008909db59ca880939cfa1a17509)
Enter a number> 1
Targeted account: ICP Account (8733008909db59ca880939cfa1a17509)
```

APIエンドポイントや，APIバージョンを確認してみます。

```text
$ bx pr api

API Endpoint:          https://10.132.75.83:8443/api
API Version:           v1
Skip SSL Validation:   true
```

masterの一覧を出力してみましょう。

```text
$ bx pr masters mycluster

OK
ID                      Public IP      Private IP     State
mycluster-00000000-m1   10.132.75.83   10.132.75.83   deployed
```

# まとめ
(...というか余談がほとんど)

今回はCLIでのクラスターアクセスについて記述しました。
といっても高度なことは何もしていなくて，kubectlとIBM Cloud PrivateのCLIを導入，少し試しただけです。

CLIの使い分けという意味では，
アプリ(Pod/Deployment/Service)を直接デプロイしたい時は，きっとkubectlコマンドを使いますよね。

パッケージとしてhelm chartをロードする時や，IBM Cloud Privateそのもののクラスター操作については，bx prコマンド(プラグイン)を使用する方向性かと思われます。今は正直言ってかなり非力なCLIですが，kubeadmでやれることや，もっと便利に使えるように拡張されることを期待します。

ちなみにbxコマンドというのがそもそもIBM Cloud(旧Bluemix)を操作するコマンドだったりします、
つまり，bxコマンドでパブリッククラウド(IBM Cloud Container Service)と，プライベートクラウド(IBM Cloud Private)両方を制御できちゃう，そんな方向性でしょうか。
(BOSHでCloud Foundry Application RuntimeもCloud Foundry Container Runtimeも両方制御するよーというのと同じイメージですかね。)

ほぼコマンドインストール編のような感じでしたが，今回はこの辺りで。