Kubectlに複数のクラスタを同時に使用できるように設定する(.kube/configの設定)

# はじめに
タイトルの通りです
1つのKubectlから別のVMにある複数のクラスタを操作したいと思ったので，設定を行いました．

# 1．Configファイルを用意する
始めに.kube/configからコンフィグファイルを取ってきます．
```yaml
apiVersion: v1
kind: Config
preferences: {}
current-context: <my-context>
clusters:
- cluster:
    certificate-authority-data: <>
    server: https://<IPアドレス>:6443
  name: <my-cluster>
users:
- name: <my-user>
  user:
    client-certificate-data: <>
    client-key-data: <>
contexts:
- context:
    cluster: <my-cluster>
    namespace: default
    user: <my-user>
  name: <my-context>
```
<>の部分は隠してある内容なので適宜読み替えてください．
このconfigファイルをまとめて扱いたい複数のクラスタからとってきてください．

## 構造
先に構造を解説します．
この設定は3段階に分かれています．

### clusters
1つ目は`clusters`です
`cluster`の設定を書くことで複数のクラスタの内容を書けます(後述)．
`certificate-authority-data`は認証用の文字列になっておりクラスタごとに設定されます．
`server`はクラスタのIPアドレスになります．初期のものをそのまま取ってくると127.0.0.1(localhost)になっているはずなので，Kubectlコマンドを配置しているサーバから見えるIPアドレスに書き換えてください．
`name`はこのファイル上でのクラスタの名前です．
クラスタの設定に依存しているものではないため任意で分かりやすい名前を付けてください．

### users
2つ目は`users`です．
`user`の設定を書くことで複数のユーザの内容を書けます(後述)．
`client-certificate-data`，`client-key-data`はユーザの認証用の文字列です．
`name`はこのファイル上でのユーザの名前です．
ユーザの設定に依存しているものではないため任意で分かりやすい名前を付けてください．

### contexts
最後に`contexts`です．
コンテキストはクラスタにどうやってアクセスするかを定義したファイルです．
`context`の設定を書くことで複数のコンテキストを書けます(後述)
`cluster`には1つ目のcluster内でnameに記述した名前を書くことで，このコンテキストで使用するクラスタを指定できます．
`namespace`を指定することで-nオプションを使用しなかったときにデフォルトで参照されるネームスペースを指定できます．
`user`に2つ目のuser内でnameに記述した名前を書くことで，このコンテキストで使用するユーザを指定できます．
`name`はコンテキストの名前です．
kubectlからコンテキストを参照する時はこの名前を使用します．分かりやすい名前を付けてください．

`current-context`には現在使用しているコンテキストが書かれています．

# ２．configファイルを統合する
複数のクラスタから上記のファイルを取得した後は構造で示したそれぞれの項目について，名前等の重複が無いように入れていくだけです．
以下に例を示します．

```yaml
apiVersion: v1
kind: Config
preferences: {}
current-context: cluster1-context
clusters:
- cluster:
    certificate-authority-data: <>
    server: https://<IPアドレス1>:6443
  name: my-cluster1
- cluster:
    certificate-authority-data: <>
    server: https://<IPアドレス2>:6443
  name: my-cluster2
- cluster:
    certificate-authority-data: <>
    server: https://<IPアドレス3>:6443
  name: my-cluster3
users:
- name: my-user1
  user:
    client-certificate-data: <>
    client-key-data: <>
- name: my-user2
  user:
    client-certificate-data: <>
    client-key-data: <>
- name: my-user3
  user:
    client-certificate-data: <>
    client-key-data: <>
contexts:
- context:
    cluster: my-cluster1
    namespace: default
    user: my-user1
  name: cluster1-context
- context:
    cluster: my-cluster2
    namespace: default
    user: my-user2
  name: cluster2-context
- context:
    cluster: my-cluster3
    namespace: default
    user: my-user3
  name: cluster3-context
```

この例では3つのクラスタ情報をコンテキストに設定しています．
clustersの中にクラスタの設定を，usersの中にユーザの設定を入れて，それらの組み合わせをcontextで指定する感じです．
それぞれの項目が指定されているのが分かると思います．

# 3. コンテキストを使用する
最後にコンテキストを使用する方法です

使用できるコンテキストの確認
```bash
$ kubectl config get-contexts
CURRENT   NAME               CLUSTER       AUTHINFO   NAMESPACE
*         cluster1-context   my-cluster1   my-user1   default
          cluster2-context   my-cluster2   my-user2   default
          cluster3-context   my-cluster3   my-user3   default
```
今使用しているコンテキストの確認
```bash
$ kubectl config current-context
cluster1-context
```
コンテキストの切り替え
```bash
$ kubectl config use-context cluster2-context
Switched to context "cluster2-context".
```