Kubernetes の config フィアルをマージする

単純な Tips のメモ。

今私は複数のクラスタを切り替えたいと思っている。だから、二つの config ファイルを１つにマージしたい。

# configのデフォルト

`~/.kube/conf` になる。このコンフィグファイルの構造は下記の通り。大きく分けて、`clusters`, `contexts`, `users` に分かれていてそれぞれ複数登録できるようになっている。

```yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:  YOUR_CERTIFICATE_AUTHORITY_DATA
    server: https://sacluster-aksresource-757738-55889d33.hcp.eastus.azmk8s.io:443
  name: sacluster
contexts:
- context:
    cluster: sacluster
    user: clusterUser_AKSresource_sacluster
  name: sacluster
current-context: sacluster
kind: Config
preferences: {}
users:
- name: clusterUser_AKSresource_sacluster
  user:
    client-certificate-data: YOUR_CLIENT_CERTIFICATE
    client-key-data: YOUR_CLIENT_KEY_DATA
    token: YOUR_TOKEN
```

# az aks/acs get-credential

[az acs kubernetes get-credentials
](https://docs.microsoft.com/en-us/cli/azure/acs/kubernetes?view=azure-cli-latest#az_acs_kubernetes_get_credentials)コマンド、もしくは、[az aks get-credentials](https://docs.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az_aks_get_credentials)コマンドは、マスターノードに接続して、/home/azureuser/.kube/conf を取ってきて、ローカルの、`~/.kube/conf` に入れてくれる。既存のものがあるとマージしてくれる。

# kubectl config

`kubectl config` コマンドを使うと、これらの設定ファイルをそうさできる。例えば

```
$ kubectl config current-context
sacluster
```

このコマンドで現在選択されているクラスターが選択できる。既存のなくなったクラスターの情報を消したいときは

```
$ kubectl config delete-cluster YOUR_CLUSTER_NAME
$ kubectl config delete-context YOUR_CULSTER_NAME
```

残念ながら `users` のセクションは削除できなさげだったので、手動で実施した。実際にクラスタを作るときは、ユーザは意識していなかったが、acs-engine / aks だと、certificate ベースのものになっている様子だ。

この辺りのは

* [Configure Access to Multiple Clusters](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable)
* [Organizing Cluster Access Using kubeconfig Files](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#merging-kubeconfig-files)

# ２つの config ファイルのマージ

Stack Overflow にバッチリのやつがあった。[one line kubectl command to merge config file with ~/.kube/config?](https://stackoverflow.com/questions/46184125/one-line-kubectl-command-to-merge-config-file-with-kube-config)

```
KUBECONFIG=~/.kube/config:~/config kubectl config view --flatten
```

KUBECONFIG には、複数のコンフィグファイルをかける。それに対して`kubectl config view` でその内容を表示して、`--flatten` オプションで、全ての内容を表示する。すると、config ファイルと同じものになるという仕組みだ。やってみよう。今回は、ACS と AKS の config をマージする。

```
$ scp azureuser@sasbrk.japaneast.cloudapp.azure.com:/home/azureuser/.kube/config .
```
で、config を取得する。acs-engine で作成したものなので、`az acs get-credentials`は使えない。
概要を出してみよう。AKS, ACS のが興味深い。

```
$ KUBECONFIG=~/.kube/config:./config kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://sacluster-aksresource-757738-55889d33.hcp.eastus.azmk8s.io:443
  name: sacluster
- cluster:
    certificate-authority-data: REDACTED
    server: https://sasbrk.japaneast.cloudapp.azure.com
  name: sasbrk
contexts:
- context:
    cluster: sacluster
    user: clusterUser_AKSresource_sacluster
  name: sacluster
- context:
    cluster: sasbrk
    user: sasbrk-admin
  name: sasbrk
current-context: sacluster
kind: Config
preferences: {}
users:
- name: clusterUser_AKSresource_sacluster
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: YOUR_TOKEN_INFO
- name: sasbrk-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

```

ついにマージする。

```
$ KUBECONFIG=~/.kube/config:./config kubectl config view --flatten > newconfig
$ mv ~/.kube/config ~/.kube/config_bak
$ cp newconfig ~/.kube/config
```

動作確認する。

```
$ kubectl cluster-info
Kubernetes master is running at https://sacluster-aksresource-757738-55889d33.hcp.eastus.azmk8s.io:443
　　　:
$ kubectl config use-context sasbrk
Switched to context "sasbrk".
$ kubectl  cluster-info
Kubernetes master is running at https://sasbrk.japaneast.cloudapp.azure.com
     :
```

うむ。いい感じ。