kubectl でリモートクラスタに接続

Mac にインストールした Docker for mac の kubernetes の kubectl から、LAN 内で起動している Ubuntu の サーバで起動している microk8s のクラスタに接続する例です。

Docker for mac で起動しているローカルの kubernetes クラスタも、Ubuntu のリモートの microk8s のクラスタも同じような頻度で扱う場合、設定ファイルをまるっと分けてしまって、コマンドラインオプションで切り替えるのが楽だと思います。

# 設定ファイルを分けてコマンドラインオプションで接続先を変える方法

### 1. mac に kubernetes をインストール

Docker for mac -> Preference -> kubernetes からインストールする


### 2. Ubuntu サーバに microk8s をインストール

snap でインストールする

```bash
$ sudo snap install microk8s --classic
```

### 3. Ubuntu サーバの microk8s の認証情報を表示

参考: https://microk8s.io/docs/

```bash
$ microk8s.kubectl config view --raw
```

ターミナルにドバっと認証情報が表示されるので取扱注意

```yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: xxxxxxx
    server: https://127.0.0.1:16443
  name: microk8s-cluster
contexts:
- context:
    cluster: microk8s-cluster
    user: admin
  name: microk8s
current-context: microk8s
kind: Config
preferences: {}
users:
- name: admin
  user:
    password: xxxxxxxxx
    username: admin
```

### 4. 認証情報の内容を、mac にコピー

表示された認証情報を、macの `~/.kube/config-ubuntu` として保存。

※ファイル名は適当です。

### 5. macにコピーした認証情報のIPアドレスを変更

```
server: https://127.0.0.1:16443
```

となっている箇所を、`https://192.168.??.??:16443` みたいに外部からアクセスできるIPアドレスに変更。

ちなみに、**127.0.0.1**:16443 と書いてあるため、このポートに外のIPアドレスからアクセスできなそうですが、実際はできるので大丈夫です。

(すべてのネットワークインターフェイスの :16443 にバインドされてる)

### 6. kubectl の引数、もしくは環境変数で config ファイルを指定

ためしに、`kubectl config` だけ実行してみると、

```
The loading order follows these rules:

  1. If the --kubeconfig flag is set, then only that file is loaded.  The flag may only be set once and no merging takes
place.
  2. If $KUBECONFIG environment variable is set, then it is used a list of paths (normal path delimitting rules for your
system).  These paths are merged.  When a value is modified, it is modified in the file that defines the stanza.  When a
value is created, it is created in the first file that exists.  If no files in the chain exist, then it creates the last
file in the list.
  3. Otherwise, ${HOME}/.kube/config is used and no merging takes place.
```

というメッセージが確認できますので、

```bash
$ kubectl --kubeconfig=${HOME}/.kube/config-ubuntu get all
```

とか

```bash
$ KUBECONFIG=${HOME}/.kube/config-ubuntu kubectl get all
```

とかで、リモートの microk8s のクラスタのコントロールができます。

# 1つの設定ファイルの中に複数のコンテキストを書いて、コマンドで切り替える方法

先程の認証情報を、`~/.kube/config` に同居させ、コマンド `kubectl config use-context ...` によってデフォルトの接続先を切り替えることもできます。

~/.kube/configの書き加える箇所は、

1. users に Ubuntu の microk8s のユーザー名とパスワードを追加
(ユーザー名とパスワードは、書かなくても動きますが毎回パスワードを聞かれます。)

2. cluster を追加

3. context を追加

です。

こんな感じになります。

```yaml
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://localhost:6443
  name: docker-for-desktop-cluster

# 追加
- cluster:
    certificate-authority-data: xxxx
    server: https://192.168.xx.xx:16443
  name: microk8s-cluster

contexts:
- context:
    cluster: docker-for-desktop-cluster
    user: docker-for-desktop
  name: docker-for-desktop

# 追加
- context:
    cluster: microk8s-cluster
    # 下部で定義しているユーザー情報を参照
    user: microk8s-user
  name: microk8s

current-context: docker-for-desktop
kind: Config
preferences: {}
users:
- name: docker-for-desktop
  user:
    client-certificate-data: xxxxx
    client-key-data: xxxxx
# 追加
- name: microk8s-user
  user:
    password: xxxx
    username: admin
```

現在の接続先を確認

```bash
$ kubectl config current-context
docker-for-desktop
```

```bash
$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop
          microk8s             microk8s-cluster             microk8s-user
```

接続先を ubuntu の microk8s に切り替え

```bash
$ kubectl config use-context microk8s
Switched to context "microk8s".
```

現在の接続先を確認

```bash
$ kubectl config current-context
microk8s
```

```bash
$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
          docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop
*         microk8s             microk8s-cluster             microk8s-user
```

```bash
$ kubectl get all
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   3d
```

切り替わりました。

この .kube/config にコンテクストを追加する設定を行えば、Docker for mac のプルダウンメニューからでもコンテクストの切り替えができるようになります。

![スクリーンショット_2019_05_06_13_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68302/53f07cfb-3e89-d6ab-3f7b-0fa4f11a7ec1.png)