Azure
kubernetes

Kubernetes の config フィアルをマージする

More than 1 year has passed since last update.

単純な Tips のメモ。

今私は複数のクラスタを切り替えたいと思っている。だから、二つの config ファイルを1つにマージしたい。

configのデフォルト

~/.kube/conf になる。このコンフィグファイルの構造は下記の通り。大きく分けて、clusters, contexts, users に分かれていてそれぞれ複数登録できるようになっている。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:  YOUR_CERTIFICATE_AUTHORITY_DATA
    server: https://sacluster-aksresource-757738-55889d33.hcp.eastus.azmk8s.io:443
  name: sacluster
contexts:
- context:
    cluster: sacluster
    user: clusterUser_AKSresource_sacluster
  name: sacluster
current-context: sacluster
kind: Config
preferences: {}
users:
- name: clusterUser_AKSresource_sacluster
  user:
    client-certificate-data: YOUR_CLIENT_CERTIFICATE
    client-key-data: YOUR_CLIENT_KEY_DATA
    token: YOUR_TOKEN

az aks/acs get-credential

az acs kubernetes get-credentials
コマンド、もしくは、az aks get-credentialsコマンドは、マスターノードに接続して、/home/azureuser/.kube/conf を取ってきて、ローカルの、~/.kube/conf に入れてくれる。既存のものがあるとマージしてくれる。

kubectl config

kubectl config コマンドを使うと、これらの設定ファイルをそうさできる。例えば

$ kubectl config current-context
sacluster

このコマンドで現在選択されているクラスターが選択できる。既存のなくなったクラスターの情報を消したいときは

$ kubectl config delete-cluster YOUR_CLUSTER_NAME
$ kubectl config delete-context YOUR_CULSTER_NAME

残念ながら users のセクションは削除できなさげだったので、手動で実施した。実際にクラスタを作るときは、ユーザは意識していなかったが、acs-engine / aks だと、certificate ベースのものになっている様子だ。

この辺りのは

2つの config ファイルのマージ

Stack Overflow にバッチリのやつがあった。one line kubectl command to merge config file with ~/.kube/config?

KUBECONFIG=~/.kube/config:~/config kubectl config view --flatten

KUBECONFIG には、複数のコンフィグファイルをかける。それに対してkubectl config view でその内容を表示して、--flatten オプションで、全ての内容を表示する。すると、config ファイルと同じものになるという仕組みだ。やってみよう。今回は、ACS と AKS の config をマージする。

$ scp azureuser@sasbrk.japaneast.cloudapp.azure.com:/home/azureuser/.kube/config .

で、config を取得する。acs-engine で作成したものなので、az acs get-credentialsは使えない。
概要を出してみよう。AKS, ACS のが興味深い。

$ KUBECONFIG=~/.kube/config:./config kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://sacluster-aksresource-757738-55889d33.hcp.eastus.azmk8s.io:443
  name: sacluster
- cluster:
    certificate-authority-data: REDACTED
    server: https://sasbrk.japaneast.cloudapp.azure.com
  name: sasbrk
contexts:
- context:
    cluster: sacluster
    user: clusterUser_AKSresource_sacluster
  name: sacluster
- context:
    cluster: sasbrk
    user: sasbrk-admin
  name: sasbrk
current-context: sacluster
kind: Config
preferences: {}
users:
- name: clusterUser_AKSresource_sacluster
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: YOUR_TOKEN_INFO
- name: sasbrk-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

ついにマージする。

$ KUBECONFIG=~/.kube/config:./config kubectl config view --flatten > newconfig
$ mv ~/.kube/config ~/.kube/config_bak
$ cp newconfig ~/.kube/config

動作確認する。

$ kubectl cluster-info
Kubernetes master is running at https://sacluster-aksresource-757738-55889d33.hcp.eastus.azmk8s.io:443
   :
$ kubectl config use-context sasbrk
Switched to context "sasbrk".
$ kubectl  cluster-info
Kubernetes master is running at https://sasbrk.japaneast.cloudapp.azure.com
     :

うむ。いい感じ。