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 でインストールする
$ sudo snap install microk8s --classic
3. Ubuntu サーバの microk8s の認証情報を表示
$ microk8s.kubectl config view --raw
ターミナルにドバっと認証情報が表示されるので取扱注意
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.
というメッセージが確認できますので、
$ kubectl --kubeconfig=${HOME}/.kube/config-ubuntu get all
とか
$ KUBECONFIG=${HOME}/.kube/config-ubuntu kubectl get all
とかで、リモートの microk8s のクラスタのコントロールができます。
1つの設定ファイルの中に複数のコンテキストを書いて、コマンドで切り替える方法
先程の認証情報を、~/.kube/config
に同居させ、コマンド kubectl config use-context ...
によってデフォルトの接続先を切り替えることもできます。
~/.kube/configの書き加える箇所は、
-
users に Ubuntu の microk8s のユーザー名とパスワードを追加
(ユーザー名とパスワードは、書かなくても動きますが毎回パスワードを聞かれます。) -
cluster を追加
-
context を追加
です。
こんな感じになります。
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
現在の接続先を確認
$ kubectl config current-context
docker-for-desktop
$ 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 に切り替え
$ kubectl config use-context microk8s
Switched to context "microk8s".
現在の接続先を確認
$ kubectl config current-context
microk8s
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
docker-for-desktop docker-for-desktop-cluster docker-for-desktop
* microk8s microk8s-cluster microk8s-user
$ 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 のプルダウンメニューからでもコンテクストの切り替えができるようになります。