背景
Kubernetesエコシステムは多くの企業で広く利用されており、多くの運用・開発担当者が開発環境、テスト環境、プレリリース環境、本番環境など、複数のKubernetesクラスタを同時に管理・保守していると思いますが、現時点でもクラスタを切り替えるために区別名を変更するために別のkubeconfigファイルを介している場合は注意が必要です!もしあなたがまだ別のkubeconfigファイルの名前を変更してクラスタを切り替えているなら、この記事をよく見てください。
原理
k8sの日常的な管理は、kubectlを介して、その本質は、kube-apiserverと通信するためのクライアントであり、kube-apiserverは、認証を行う必要があるため、kubectlユーティリティは、認証情報を格納するkubeconfigファイルが必要です:
- kube-apiserverのCAルート証明書の検証に使用されます。
- kubectl管理者を識別するための証明書と秘密鍵、または一般ユーザーを識別するためのトークン。
kubeconfigはYAML形式の設定ファイルで、主なフィールドは以下の通りです:
- クラスタは配列型で、各要素はk8sクラスタを表します。
- users型は配列で、各要素はアクセス権を持つユーザーを表します。
- コンテキストは配列型で、各要素は使用するクラスタとユーザの組み合わせを表します。
- current-context 現在使用されているコンテキスト
kubectlが複数のクラスタを管理する場合、基本的にクラスタのパラメータとユーザー情報をすべて記録し、それらを1つのコンテキストにまとめます。
ソリューション
複数の環境でクラスタを管理するために、通常はKubernetesクライアントツールkubectlを使って複数のKubernetesクラスタをローカルで管理します。その際、各クラスタ用のkubeconfigファイルを使用する必要があります。 複数のkubeconfigファイルを手動で1つにマージし、kubectxやkubieなどのツールを使用してコンテキストを素早く切り替えて複数のクラスタを管理することを最初に考えますか?kubeconfig設定ファイルを手作業でマージすることは可能ですが、クラスタ数が多い場合やクラスタ環境が頻繁に変更される場合は面倒です。
手動マージ
現在、私はkubeconfig用にks devとprodの環境を持っており、以下の手動でマージされたファイルを使って手動でマージすることができます。
# apiversion
apiVersion: v1
# 複数のクラスターをリスト形式で記録するクラスター・フィールド
clusters:
# ksprod
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcxxxxxxxxxxxxxxxxxx
server: https://..:43
name: ksprod
# kstest
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcxxxxxxxxxxxxxxxxxx
server: https://...:43
name: kstest
# contextクラスターとユーザーを関連付けるフィールド
contexts:
# prodadmin@ksprod
- context:
cluster: ksprod
user: prodadmin
name: prodadmin@ksprod
# testadmin@kstest
- context:
cluster: kstest
user: testadmin
name: testadmin@kstest
# 現在のクラスターは
current-context: prodadmin@ksprod
kind: Config
preferences: {}
# ユーザー・フィールド、リスト形式でユーザーを記録する
users:
# prod環境ユーザー
- name: prodadmin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJUGNvNy9qRzBOSkF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFRxxxxxxxxxxxxxxxxxx
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMDhNMDFWOE5tTXliUUI2bGY4QlAzc1JCZWxhaWJOa2lCQStqUkY2Rxxxxxxxxxxxxxxxxxx
# test環境ユーザー
- name: testadmin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJR1Z3ZXNNTVRDV2t3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFRxxxxxxxxxxxxxxxxxx
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeTVPT20zWEpERTlYTDUzWjh5UFhEQWMybmg0bkFzUDl2NW8xTUNZMxxxxxxxxxxxxxxxxxx
公式の方法
公式には、この問題を解決する方法として、環境変数を設定する方法と、コマンドラインパラメータ表示で指定する方法があります。
環境変数の設定
複数のクラスタのkubeconfigファイルを指定するための環境変数の設定
# 複数のクラスタ用にKubernetesを設定するには:
export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config:$HOME/.kube/mike-local-kubernetes.yaml:$HOME/.kube/dev-kubernetes.yaml:$HOME/.kube/test-kubernetes.yaml:$HOME/.kube/prod-kubernetes.yaml:$HOME/.kube/okteto-kube.yaml
コマンドライン引数による設定ファイルの指定
コマンドライン引数を指定して特定のクラスタのkubeconfigファイルを表示します。
# ローカルクラスタに切り替える
kubectl get pod --kubeconfig=$HOME/.kube/mike-local-kubernetes.yaml
# 開発クラスタに切り替える
kubectl get pod --kubeconfig=$HOME/.kube/dev-kubernetes.yaml
# テストクラスタに切り替える
kubectl get pod --kubeconfig=$HOME/.kube/test-kubernetes.yaml
# 本番クラスタに切り替える
kubectl get pod --kubeconfig=$HOME/.kube/prod-kubernetes.yaml
公式の方法ではありますが、マルチクラスタ管理は実現できます。しかし、複数のクラスタの設定ファイルを増減するために、kubeconfigの設定ファイルを常に行ったり来たりしたり、環境変数を手動で編集したりするのは明らかに面倒です。
次に紹介するのは、この記事の焦点である、よりエレガントなソリューションです。
自動マージツール
手動マージは面倒なので、自動マージツールはないのですか?まさか、あってこれじゃないでしょう。ここでは、これらの優れた自動マージツールの使い方を紹介します。
kubeCM
ツール
KubeCMはGo言語で開発された強力なKubeConfig管理ツールです。複数のKubeConfigファイルを自動的にマージするだけでなく、異なるクラスタ環境の追加、削除、名前の変更など、複数のKubernetesクラスタ環境を簡単に管理できます。
インストール
- バイナリインストール
# 実際の状況に応じて、対応するプラットフォームのバイナリをダウンロードすることができる。
# Linux
$ curl -Lo kubecm.tar.gz https://./////../_..___..gz
# macOS
$ curl -Lo kubecm.tar.gz https://./////../_..___..gz
# Windows
$ curl -Lo kubecm.tar.gz https://./////../_..___..gz
#
# Linux & macOS
$ tar -zxvf kubecm.tar.gz kubecm
$ sudo mv kubecm /usr/local/bin/
# Windows
# 圧縮ソフトのどれを使っても解凍して$PATH
$ unzip kubecm.tar.gz
- mac ワンクリックインストール
$ brew install sunny0826/tap/kubecm
kubeCMの利用
デモ用にkubeconfigdirディレクトリを作成し、そこに複数のクラスタ設定ファイルをコピーします。
$ ll kubeconfigdir
-rw-r--r-- 1 xuel staff 2.1K 7 eks-config
-rw-r--r-- 1 xuel staff 5.3K 7 ks-prod-config
-rw-r--r-- 1 xuel staff 5.3K 7 ks-test-config
-rw-r--r-- 1 xuel staff 7.1K 7 smartops-config-prod
-rw-r--r-- 1 xuel staff 5.3K 7 smartops-config-test
注:ここでの私のKubeconfig設定ファイルがすべて.yamlで終わっていることにお気づきかもしれませんが、これはKubieツールが複数のクラスタを簡単に切り替えられるようにするためです。自分の環境のルールに従ってKubeconfigファイルを管理するだけです。
- KubeCMによる自動マージ
# 指定したディレクトリ内のすべてのkubeconfig設定ファイルを1つにマージする
$ kubecm merge -f mike-kubeconfig
# 指定したディレクトリ内のすべてのkubeconfig設定ファイルを1つにマージし、デフォルトのkubeconfig設定ファイルを上書きする。
$ kubecm merge -f kubeconfigdir -c
Loading kubeconfig file: [kubeconfigdir/eks-config kubeconfigdir/ks-prod-config kubeconfigdir/ks-test-config kubeconfigdir/smartops-config-prod kubeconfigdir/smartops-config-test]
Context Add: eks-config
Context Add: ks-prod-config
Context Add: ks-test-config
Context Add: smartops-config-prod
Context Add: smartops-config-test
注: -cパラメータを使用するかしないかの違いは、-cパラメータを使用すると.kube/configという名前のマージファイルが生成されるのに対し、-cパラメータを使用しない場合は.kube/config.yamlという名前のマージファイルが生成される点です。
- KubeCMによるクラスタ構成の迅速な追加
# KubeCMを使ってクラスタプロファイルを素早く追加する
$ kubecm add -f mike-local-kubernetes.yaml
# KubeCMを使ってクラスタ設定ファイルを素早く追加し、デフォルトの名前空間を指定する。
$ kubecm add -f mike-local-kubernetes.yaml -n test
- KubeCMを使用したクラスタ構成の迅速な削除
# コマンドラインモードでクラスタ構成を削除する
$ kubecm delete mike-local-kubernetes
- KubeCMによるクラスタ構成の迅速な名前変更
# devの名前をtestに変更する
$ kubecm rename -o dev -n test
# 現在のコンテキストの名前をdevに変更する
$ kubecm rename -n dev -c
以上、KubeCMのコマンドラインでの一般的な操作について説明しましたが、コマンドラインをより効率的に利用するため、KubeCMにはSHELL自動補完機能も用意されています。
コマンド完了
- bash
$ kubecm completion bash > ~/.kube/kubecm.bash.inc $ printf " # kubecm shell completion source '$HOME/.kube/kubecm.bash.inc' " >> $HOME/.bash_profile $ source $HOME/.bash_profile
- zsh
# add to $HOME/.zshrc source <(kubecm completion zsh) # or $ kubecm completion zsh > "${fpath[1]}/_kubecm"
KubeCMはコマンドラインモードだけでなく、よりユーザーフレンドリーな対話モードも提供します。
クラスタとnsのインタラクティブな切り替え
リフレクション
今のところ、ローカルでは、複数のクラスタの切り替え、複数のnsの切り替え、インタラクティブな管理、他のクラスタの追加や削除が簡単にできます。もちろん、ここに列挙するまでもなく、他にも優れたツールはたくさんあります。