Rancher 2.0のデータストアを覗く方法

Rancher 2.0がめでたくGAとなりましたね！

[Announcing Rancher 2.0 GA!](https://rancher.com/blog/2018/2018-05-01-rancher-ga-announcement-sheng-liang/)

今後本格的にRancher2.0を使う場面も増えるかと思います。  
そこで今回はRancher2.0をより深く知るための方法として、Rancherが扱う管理データを詳しく追う方法について紹介します。  

## Rancher 2.0のデータストア

Rancher1系ではデータストアとしてMySQLが利用されていましたが、Rancher2系ではetcd3が利用されるようになりました。  
なので、etcdctlなどでetcdに直接接続することでデータストアの内容を確認できます。  
ただしこの方法だと接続の際にCA証明書/証明書/秘密鍵が必要で結構面倒です。

そこでもっと手軽に確認できるものとして`kubectl`コマンドを利用する方法があります。  

Rancher2.0では管理用のデータはKubernetesの[カスタムリソース](https://kubernetes.io/docs/concepts/api-extension/custom-resources/)として登録されています。
なので、`kubectl`コマンドさえ使えれば管理用データを覗くことが可能です。

## Rancher2.0でkubectlコマンドを使うには

Rancher2.0を起動する方法はいくつかありますが、今回はその中でももっとも単純な[公式ドキュメントのQuick Start](https://rancher.com/docs/rancher/v2.x/en/quick-start-guide/)に記載されている方法で起動した場合について扱います。  

具体的には以下のコマンドを実行してRancher2.0を起動した場合となります。

    sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
    
この場合は`docker ps`コマンドなどでコンテナIDを確認した上で`docker exec`を利用することで`kubectl`が実行できます。

```bash
# 起動したRancher2.0のコンテナIDを確認
$ docker ps
# execでコンテナ上でbash起動
$ docker exec -it <確認したコンテナID> bash
```

## 管理データを覗く

kubectlが使えるようになったら以下のコマンドでカスタムリソースの一覧を確認できます。

```console
$ kubectl get crd
    
    NAME                                                            AGE
    apprevisions.project.cattle.io                                  3m
    apps.project.cattle.io                                          3m
    authconfigs.management.cattle.io                                3m
    catalogs.management.cattle.io                                   3m
    clusteralerts.management.cattle.io                              3m
    clustercomposeconfigs.management.cattle.io                      3m
    clusterevents.management.cattle.io                              3m
    clusterloggings.management.cattle.io                            3m
    clusterpipelines.management.cattle.io                           3m
    clusterregistrationtokens.management.cattle.io                  3m
    clusterroletemplatebindings.management.cattle.io                3m
    clusters.management.cattle.io                                   3m
    dynamicschemas.management.cattle.io                             3m
    globalcomposeconfigs.management.cattle.io                       3m
    globalrolebindings.management.cattle.io                         3m
    globalroles.management.cattle.io                                3m
    groupmembers.management.cattle.io                               3m
    groups.management.cattle.io                                     3m
    listenconfigs.management.cattle.io                              3m
    namespacecomposeconfigs.project.cattle.io                       3m
    nodedrivers.management.cattle.io                                3m
    nodepools.management.cattle.io                                  3m
    nodes.management.cattle.io                                      3m
    nodetemplates.management.cattle.io                              3m
    notifiers.management.cattle.io                                  3m
    pipelineexecutionlogs.management.cattle.io                      3m
    pipelineexecutions.management.cattle.io                         3m
    pipelines.management.cattle.io                                  3m
    podsecuritypolicytemplateprojectbindings.management.cattle.io   3m
    podsecuritypolicytemplates.management.cattle.io                 3m
    preferences.management.cattle.io                                3m
    projectalerts.management.cattle.io                              3m
    projectloggings.management.cattle.io                            3m
    projectnetworkpolicies.management.cattle.io                     3m
    projectroletemplatebindings.management.cattle.io                3m
    projects.management.cattle.io                                   3m
    roletemplates.management.cattle.io                              3m
    settings.management.cattle.io                                   3m
    sourcecodecredentials.management.cattle.io                      3m
    sourcecoderepositories.management.cattle.io                     3m
    templatecontents.management.cattle.io                           3m
    templates.management.cattle.io                                  3m
    templateversions.management.cattle.io                           3m
    tokens.management.cattle.io                                     3m
    users.management.cattle.io                                      3m
```    

カスタムリソースの名前がわかったら`kubectl get`で各リソースのデータを確認できます。

    $ kubectl get <カスタムリソースの名前>
    
例えば様々な設定値を保存するためのリソース`settings.management.cattle.io`のデータを確認するには以下のようにします。

```console
$ kubectl get settings.management.cattle.io
    
    NAME                      AGE
    agent-image               3m
    cacerts                   3m
    cli-url-darwin            3m
    cli-url-linux             3m
    cli-url-windows           3m
    engine-install-url        3m
    engine-iso-url            3m
    engine-newest-version     3m
    engine-supported-range    3m
    first-login               3m
    helm-version              3m
    ingress-ip-domain         3m
    install-uuid              3m
    k8s-version               3m
    k8s-version-to-images     3m
    machine-version           3m
    server-image              3m
    server-url                3m
    server-version            3m
    system-default-registry   3m
    system-namespaces         3m
    telemetry-opt             3m
    ui-feedback-form          3m
    ui-index                  3m
    ui-path                   3m
    ui-pl                     3m
    whitelist-domain          3m
```

もう少し詳細に知りたい場合は`-o`オプションを指定すればOKです。

```console
# -oオプションでyaml形式を指定
$ kubectl get settings.management.cattle.io agent-image -o yaml
    
    apiVersion: management.cattle.io/v3
    customized: false
    default: rancher/rancher-agent:master
    kind: Setting
    metadata:
      clusterName: ""
      creationTimestamp: 2018-05-07T10:47:27Z
      deletionGracePeriodSeconds: null
      deletionTimestamp: null
      initializers: null
      name: agent-image
      namespace: ""
      resourceVersion: "286"
      selfLink: /apis/management.cattle.io/v3/agent-image
      uid: 08abd93e-51e4-11e8-b695-0242ac110002
    value: rancher/rancher-agent:v2.0.0
```

もちろん`--watch`オプションで変更検知も可能です。

    # watchオプションで変更検知
    $ kubectl get settings.management.cattle.io -o yaml --watch

ちなみに各カスタムリソースはソースコードだと以下の部分で登録されているため、定義を追いたい場合はこの辺からソースを追うのがおすすめです。

https://github.com/rancher/rancher/blob/v2.0.0/pkg/api/server/managementstored/setup.go

### 5/8 追記

カスタムリソースの中には動的にnamespaceを追加するものもある点にご注意ください。
例えば`nodepools.management.cattle.io`などです。
この場合、`kubectl`実行時に`--all-namespaces`オプションを指定するなどしてください。

## 終わりに

ということでRancher2.0での管理データを覗く方法を紹介しました。  
Rancher2.0はKubernetesのカスタムリソースを利用してそれぞれに対するコントローラーを実装することで管理機能を実現しているため、ソースを追う際はデータがどのように変化するのかを把握しておくとそれぞれのコントローラーの処理が追いやすいと思います。

Rancher2.0を調査する際は是非カスタムリソースを覗いてみてください！

以上です。