新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

kubectlで複数のクラスターを切り替える方法

Kubernetesの新しいクラスターを追加したので、kubectlコマンドで切り替えられるように設定しました。

一度設定してしまうといじることはなく、このままだとやり方忘れてしまうので、自分用に設定方法をメモしておきます。

仕組み

Kubernetesを操作するにはkubectlコマンドを使うのですが、kubectlはKubernetesを構築したプラットフォームに非依存で、 Kubernetesをオンプレで作ろうが、GCPで作ろうが、AWSで作ろうが、1つのkubectlコマンドで全てのKubernetesにアクセスできます。

kubectlからクラスターにアクセスするには、アクセス先の「クラスター」とその「ユーザー」の情報が必要です。

kubectlでは、その「クラスター」と「ユーザー」(と「ネームスペース」)を、1つの「コンテキスト」というものでまとめています。

そして、kubectlでコマンドを実行する際、「コンテキスト」からアクセス先の情報を得て、目的のKubernetesにアクセスできるようになります。

さらに、「コンテキスト」は複数作成することができ、「コンテキスト」を切り替えることにより、1つのkubectlで様々なKubernetesクラスターにアクセスできるようになります。

ちなみに、「ネームスペース」は必須ではなく、省略した場合「default」ネームスペースにアクセスします。「ネームスペース」を設定すると、 同じクラスターでも「ネームスペース」を分けた「コンテキスト」を作成することができます。

クラスター・ユーザー情報設定

新しいKukbernetesにアクセスする場合、クラスター・ユーザー情報をkubectlのコンテキストに設定する必要があるのですが、 設定方法はクラスターを構築したプラットフォーム依存です。

例えばGoogle Cloud Platformの場合、下記のようなコマンドで設定します。

gcloud container clusters get-credentials \
    [クラスター名] \
    --project [GCPプロジェクト名] \
    --zone [GCPゾーン名]

コンテキスト一覧を取得するコマンドkubectl config get-contextsを実行してみます。

CURRENT NAME    CLUSTER    AHTHINFO    NAMESPACE
*[context_name]    [cluster_name]    [user_name]

と、新しい「コンテキスト」が作成され、それに「クラスター」と「ユーザー」も自動で設定されています。

クラスター接続テストは下記で行います。

kubectl cluster-info

kubectlコンテキスト関連コマンド

クラスターへのアクセスに必要な設定がコンテキストにされたので、後は使いやすいようにコンテキストを編集していきます。

コンテキスト関連でよく使うコマンドを記載します。

コンテキスト一覧を表示

kubectl config get-contexts

現在のコンテキストを表示

kubectl config current-context

指定したコンテキストをアクティブにする

kubectl config set-context [コンテキスト名]

ネームスペース設定を設定する

設定したいコンテキストをアクティブにしてから下記を実行

kubectl config set-context --current --namespace=[ネームスペース名]

コンテキスト設定ファイルを直接編集する

コンテキストの設定は~/.kube/configファイルに記載されています。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: 
  name: [クラスター1]
- cluster:
    certificate-authority-data:
  name: [クラスター2]
contexts:
- context:
    cluster: [クラスター1]
    user: [ユーザー1]
  name:  [コンテキスト1]
- context:
    cluster: [クラスター2]
    namespace: [ネームスペース1]
    user: [ユーザー2]
  name:  [コンテキスト2]
current-context: [コンテキスト1]
kind: Config
preferences: {}
users:
- name: [ユーザー1]
  user:
    auth-provider:
- name: [ユーザー2]
  user:
    auth-provider:

見れば何となく分かるのですが、「クラスター」と「ユーザー」の定義があって、「コンテキスト」がその「クラスター」と「ユーザー」(および「ネームスペース」)を参照しています。

「コンテキスト」を使いやすいように、色々設定したいところなのですが、kubectlのコンテキスト関連のコマンドはあまり機能豊富ではなく、kubectlコマンドだけでやろうとすると出来ないことが多いです。

幸い、コンテキスト設定ファイルの内容はシンプルなので、コンテキスト設定ファイルを直接編集しました。

注意点

プラットフォームからコンテキストを設定する際、同じ名前の既存の「コンテキスト」「クラスター」「ユーザー」は上書きされてしまいます。

なので、自分で設定ファイルを編集する際は、それらの情報をコピーして、新しい名前で登録して上書きされないようにしておきます。

感想など

コマンドあればそれを使おうと、色々コマンド探したんですけどね。

GCPでコンテキストを追加すると、「コンテキスト」「クラスター」「ユーザー」の名前が長いので短くしたかったのですが、コマンドだけではできず、直接設定ファイルを編集しました。

同じコンテキストのネームスペース違いを作りたかったのですが、ファイルを直接編集すればコピペでできてしまいます。

まぁ、複雑でもないし、直接ファイルを編集するのがお勧めです。