jenkinsでkubectl loginして、kubectl deployしようとして、いろいろ検証してみたのでまとめておきます。
すごく簡単にできると思っていたのですが、いろいろ考えなきゃだったので苦労しました。
苦労することになったポイント
苦労することになったポイントは次の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を探しに行くようです。
- —kubeconfigで指定されたファイル
- $KUBECONFIG環境変数に指定されたファイル一覧
- ~/.kube/config
オプション指定ない場合は、2->3となっていくようですね。
なお、2の場合だと、複数のkubeconfigファイルを見に行ってくれるようです。
クラスターA、クラスターBと環境変数に指定しておいて、kubectl get pods
などとやると、クラスターA、Bのpodを取得することができました。