Kubernetes: Minikube で作成したクラスタの etcd にアクセスする

## はじめに

etcd は Kubernetes における唯一のデータストアです。一般的な利用の中で etcd に直接アクセスしたいことはないと思いますが、Kubernetes オブジェクトのエンコード/デコード周りの動作を確認したいときに Minikube で作成した検証用クラスタを使えると便利です。

## TL;DR

```
$ minikube ssh
$ docker run -it --net host -e ETCDCTL_API=3 gcr.io/etcd-development/etcd /bin/sh
$ etcdctl version
```

## Minikube で作成したクラスタの etcd にアクセスする

Minikube で作成するクラスタは、etcd も含めて Kubernetes をワンバイナリで動作させる Localkube が使われていますが、組み込まれている etcd も通常と同様に 127.0.0.1:2379 で待ち受けているので、Minikube の VM にログインして直接アクセスするだけです。

ポイントとして、etcd を操作する etcdctl をインストールするのが面倒なので etcd コンテナから操作すると便利です。その際 `--net=host` オプションを利用します。

```
$ minikube start --kubernetes-version=v1.8.0
$ minikube ssh
(minikube)  $ docker run -it --net host -e ETCDCTL_API=3 gcr.io/etcd-development/etcd /bin/sh
(container) # etcdctl version
etcdctl version: 3.3.2
API version: 3.3
(container) # etcdctl member list
8e9e05c52164694d, started, default, http://localhost:2380, http://localhost:2379
```

Minikube の Kubernetes 1.7 以下では etcd v2 API が使われているので、`ETCDCTL_API=2` として実行させます。

```
(minikube)  $ docker run -it --net host -e ETCDCTL_API=2 gcr.io/etcd-development/etcd /bin/sh
(container) # etcdctl member list
fcf2ad36debdd5bb: name=kubeetcd peerURLs=http://0.0.0.0:2380 clientURLs=http://0.0.0.0:2379 isLeader=true
```

---

ここからは etcd を操作する上での便利情報です。

### 全てのキーをリストする

クラスタの全てのオブジェクトのキーを確認します。

```console
(container) # etcdctl get "" --prefix --keys-only | sed '/^\s*$/d'
/registry/apiregistration.k8s.io/apiservices/v1.
/registry/apiregistration.k8s.io/apiservices/v1.authentication.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.autoscaling
/registry/apiregistration.k8s.io/apiservices/v1.batch
/registry/apiregistration.k8s.io/apiservices/v1.networking.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.rbac.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.storage.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1alpha1.admissionregistration.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1alpha1.rbac.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1alpha1.settings.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.apiextensions.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.apps
/registry/apiregistration.k8s.io/apiservices/v1beta1.authentication.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.batch
/registry/apiregistration.k8s.io/apiservices/v1beta1.certificates.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.extensions
/registry/apiregistration.k8s.io/apiservices/v1beta1.policy
/registry/apiregistration.k8s.io/apiservices/v1beta1.rbac.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.storage.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta2.apps
/registry/apiregistration.k8s.io/apiservices/v2alpha1.batch
/registry/apiregistration.k8s.io/apiservices/v2beta1.autoscaling
/registry/configmaps/kube-system/extension-apiserver-authentication
/registry/events/default/minikube.151d300ae651407d
/registry/events/default/minikube.151d300ae6ddedb4
/registry/events/default/minikube.151d300ae6ddfb98
/registry/events/default/minikube.151d300ae6de0283
/registry/events/default/minikube.151d300ae787b8a1
/registry/events/default/minikube.151d300b07a92c64
/registry/events/default/minikube.151d300b07aa71c2
/registry/events/default/minikube.151d300bde808339
/registry/events/kube-system/kube-controller-manager.151d300a53d1a582
/registry/events/kube-system/kube-scheduler.151d300abfe55fe8
/registry/minions/minikube
/registry/namespaces/default
/registry/namespaces/kube-public
/registry/namespaces/kube-system
/registry/ranges/serviceips
/registry/ranges/servicenodeports
/registry/secrets/default/default-token-ss86j
/registry/secrets/kube-public/default-token-pc694
/registry/secrets/kube-system/default-token-g7gbj
/registry/serviceaccounts/default/default
/registry/serviceaccounts/kube-public/default
/registry/serviceaccounts/kube-system/default
/registry/services/endpoints/default/kubernetes
/registry/services/endpoints/kube-system/kube-controller-manager
/registry/services/endpoints/kube-system/kube-scheduler
/registry/services/specs/default/kubernetes
compact_rev_key
```

Minikube Kubernetes 1.7 以下 (ETCDCTL_API=2) ではコマンド体系が異なります。

```
(container) # etcdctl ls -r
```

### 特定のキーの値を取得する

Protocol Buffers としてエンコードされているため、見にくいですがなんとなく中身は分かります。

```
# etcdctl get /registry/namespaces/kube-system
/registry/namespaces/kube-system
k8s

v1      Namespacec
I

kube-system"*$db3b961e-2b19-11e8-bfcb-08002730655c2����z

kubernetes
Active"
```