Kubernetesのkubeconfigをいじってみる

5月 18, 2021

jenkinsでkubectl loginして、kubectl deployしようとして、いろいろ検証してみたのでまとめておきます。

すごく簡単にできると思っていたのですが、いろいろ考えなきゃだったので苦労しました。

苦労することになったポイント

苦労することになったポイントは次の2つです。

  1. クラスターが複数あり、それぞれにデプロイしたい
  2. Jenkinsは複数のプロセスで実行される

1つ目はまあ、それぞれのクラスターにログインしてデプロイしていけばいいやーと思っていましたが、、
2つ目にある複数プロセスで実行されるってのがネックになりました。

プロセス1でクラスターAにログインしているときに、プロセス2がクラスターBにログインしようとすると、プロセス1のデプロイがクラスターBになってしまう、、みたいな感じです。

試してみたこと

調べてみると、kubeconfigをうまく使えば解決できそうだったので、試してみました。

kubeconfigとは?

Kubeconfigとは、k2sクラスターのAPIサーバーと通信するためのコマンドラインツールです。

どのクラスターにどのユーザとして接続するか、kubeconfigファイルとして設定を定義します。
そして、kubectlがkubeconfigを読み取って接続先を決めています。

kubeconfigを見てみる

試しに、次のコマンドで現状の設定を読み取ってみました。

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://kubernetes.docker.internal:6443
  name: docker-desktop
contexts:
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-for-desktop
current-context: docker-desktop
kind: Config
preferences: {}
users:
- name: docker-desktop
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

なるほど、、、、
今はクラスター1つになっていますね。

kubeconfigファイルの指定方法

kubeconfigファイルで、クラスターの指定ができるようだ、というのがわかってきました。
なので、クラスターA、B用のkubeconfigファイルをそれぞれ用意しておけばいいのかな?となりました。

Kubectlで--kubeconfigオプションでkubeconfigファイルの指定が可能なようなので、デプロイしたいクラスターに合わせて指定していけばいいような気がしてきました。

指定の仕方は次のような感じです。


kubectl apply -f deploy.yml --kubeconfig=[kubeconfigファイル]

kubeconfigオプション指定がない場合は?

余談ですが、kubeconfigオプション指定をしない場合はどうなっているのか調べてみました。

kubectlは次のようにkubeconfigを探しに行くようです。

  1. —kubeconfigで指定されたファイル
  2. $KUBECONFIG環境変数に指定されたファイル一覧
  3. ~/.kube/config

オプション指定ない場合は、2->3となっていくようですね。
なお、2の場合だと、複数のkubeconfigファイルを見に行ってくれるようです。
クラスターA、クラスターBと環境変数に指定しておいて、kubectl get podsなどとやると、クラスターA、Bのpodを取得することができました。

ITKubernetes

Posted by papa