Minikubeにリモートのkubectlから接続する

目次

  1. 背景
  2. サーバーから.kube/configを取得
  3. 認証ファイルのコピー
  4. ローカルの.kube/configの編集
  5. SSHトンネルを開く
  6. 疎通確認
  7. まとめ
  8. 関連記事
  9. PR

背景

こんにちは。 かりんとうマニア(@karintozuki)です。
Minikubeを自宅のサーバーに建てています。勉強目的なので本家k8sより構築が楽なMinikubeを使ってます。

今回はローカルで使っているPCからkubectlでサーバー上のMinikubeを管理する方法を紹介します。

Minikubeが走っているマシンにSSHを繋げられるようになっていることが前提です。

サーバーから.kube/configを取得

サーバー上でMinikubeが問題なく動いているなら、~/.kube/configファイルが設定されているはずです。
これはサーバー上のkubectlがMinikubeに接続する際の情報です。(たしか、Minikubeをインストールする際に自動的に設定されているはずです。)

ローカルのKubectlからMinikubeへの接続を設定する際に参考にするので、このファイルをローカルマシンにコピーしてきてください。

こんな中身になっていると思います。

.kube/config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apiVersion: v1
clusters:
- cluster:
certificate-authority: /home/remote-user/.minikube/ca.crt
extensions:
- extension:
last-update: Wed, 10 Apr 2024 08:54:02 BST
provider: minikube.sigs.k8s.io
version: v1.32.0
name: cluster_info
server: https://192.168.49.2:8443
name: minikube
contexts:
- context:
cluster: minikube
extensions:
- extension:
last-update: Wed, 10 Apr 2024 08:54:02 BST
provider: minikube.sigs.k8s.io
version: v1.32.0
name: context_info
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /home/remote-user/.minikube/profiles/minikube/client.crt
client-key: /home/remote-user/.minikube/profiles/minikube/client.key

認証ファイルのコピー

先ほどのconfigファイルにclient.key, client.crt, ca.crtというファイルのパスが記載されているのが分かるでしょうか。これらはkubectlがMinikubeに接続する際に認証で使うファイルです。

この3種類のファイルをサーバーからローカルにコピーしてきます。

私はkube/minikube-remoteというフォルダに配置しました。これはローカルマシンの中のどこにあっても問題ないです。

1
2
3
4
5
~/.kube/minikube-remote
├── ca.crt
├── client.crt
└── client.key

ローカルの.kube/configの編集

今度はローカルにある.kube/configに、サーバー上のMinikubeにつなぐ設定を足していきます。

リモートからコピーしてきた.kube/configをローカルで編集していきます。

まずは先ほどの三つの認証ファイルのパスをローカルのパスに直します。

また、cluster.serverをhttps://localhost:8443に変更します。(ポートはなんでもいいです。)

私の場合はローカルのPCにもMinikubeが入っているので、名前が被らないようにminikube-remoteと名前も変えています。

編集後のファイルはこんな感じです。

.kube/config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- cluster:
certificate-authority: /Users/local-user/.kube/minikube-remote/ca.crt
extensions:
- extension:
last-update: Wed, 10 Apr 2024 08:54:02 BST
provider: minikube.sigs.k8s.io
version: v1.32.0
name: cluster_info
server: https://localhost:8443
name: minikube-remote
- context:
cluster: minikube-remote
extensions:
- extension:
last-update: Wed, 10 Apr 2024 08:54:02 BST
provider: minikube.sigs.k8s.io
version: v1.32.0
name: context_info
user: minikube-remote
name: minikube-remote

- name: minikube-remote
user:
client-certificate: /Users/local-user/.kube/minikube-remote/client.crt
client-key: /Users/local-user/.kube/minikube-remote/client.key

あとはこのYamlを既存の.kube/configに足していくだけです。すでにローカルでkubectlを使っていれば、ほかのClusterの設定があると思うので、cluster, context, name のセクションにそれぞれコピーしていってください。

私は手動でマージしたのですが、もっといい方法があるかもです。

SSHトンネルを開く

もう一つやることがあります。先ほど、cluster.serverをhttps://localhost:8443に変更しましたが、これはSSHでポートフォーワーディングをすることで8443ポートをサーバー上のMinikubeのKubernetes APIのポートに繋いでいきます。
リモートの.kube/configのcluster.serverを見てください。

server: https://192.168.49.2:8443
このアドレスはリモートサーバー内からのみアクセス可能なKubernetes APIのアドレスです。
Minikubeはこれを<サーバーのアドレス>:<ポート番号>のかたちでアクセスできるようにDockerのポートを設定しています。

リモートマシンの中でdocker psを実行して、Minikubeのportを見てみてください。

127.0.0.1:32772->22/tcp, 127.0.0.1:32771->2376/tcp, 127.0.0.1:32770->5000/tcp, 127.0.0.1:32769->8443/tcp

いくつかポートの設定がありますが、Kubernetes APIの844332769にマッピングされているようです。ポート開けるのに抵抗がないよって人は直接この32769ポートを開けてしまってもいいと思います。

私はローカルマシンからポートフォワーディングを使ってトンネルで繋げるようにしました。
ssh -L 8443:localhost:32769 <リモートのアドレス>@user

こうすることでローカルマシンのhttps://localhost:8443がリモートマシンのhttps://192.168.49.2:8443 につながりました。

疎通確認

以下のコマンドで接続を試してみます。

1
2
3
4
5
6
7
$kubectl config use-context minikube-remote // contextを入れ替える

$kubectl version // k8sのバージョンを表示させる

Client Version: v1.29.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3

無事にMinikubeにつながったようです。

まとめ

今回はサーバー上のMinikubeにローカルのKubectlからアクセスしました。
おそらくきちんとやるならローカルマシン用に別の認証ファイルを生成するのですが、とりあえず簡単に繋ぐ方法を紹介しました。

それじゃ今日はこの辺で。

関連記事

こちらの記事もおすすめです。

英語を学びたいプログラマが知るべき一冊の本

PR

自分のサーバーが欲しいとき、ドメインが欲しいときお名前.comで!