kind で構築したクラスタの kubeconfig の設定をローカルに追加する

Date: 2021/04/03
Tags: K8s Kind Ansible

Intel NUC 上に kind で作成したクラスタをローカルの Mac で操作するために、kubeconfig の設定を追加できるようにした。

k8s のテスト環境として、kind を使って Intel NUC 上に k8s クラスタを構築している。 kubernetes-sigs/kind: Kubernetes IN Docker - local clusters for testing Kubernetes

NUC の構成管理に Ansible を利用しているので、kubeconfig を取得するための playbook を書いた。

Ansible で kind クラスタの kubeconfig を取得して追加する

playbook

- name: Get kubeconfig
  ansible.builtin.shell: >-
    kind get kubeconfig
    --name "{{ kind_cluster_name }}"
  register: kind_kubeconfig
  check_mode: false
  ignore_errors: true

- name: Copy kubeconfig to local
  ansible.builtin.copy:
    content: "{{ kind_kubeconfig.stdout }}"
    dest: /tmp/kind-kubeconfig
    mode: "0600"
  delegate_to: localhost
  when: kind_kubeconfig.stdout|length >0

- name: Merge kubeconfig
  ansible.builtin.shell: >-
    KUBECONFIG=/tmp/kind-kubeconfig:~/.kube/config
    kubectl config view --flatten
  register: merge_kubeconfig
  check_mode: false
  delegate_to: localhost

- name: Output Merged kubeconfig
  ansible.builtin.copy:
    content: "{{ merge_kubeconfig.stdout }}"
    dest: ~/.kube/config
    mode: "0600"
  delegate_to: localhost
  when: merge_kubeconfig.stdout|length >0

やっていること

  1. kind get kubeconfig の実行結果を register に登録
  2. delegate_to: localhost を使用して、localhost に register の内容をファイルとしてコピー
  3. KUBECONFIG 環境変数に結合したい 2 つの kubeconfig ファイルを指定し、kubeconfig config view --flatten で yaml を出力する
  4. 出力した結果を ~/.kube/config に出力する

実行結果

# contextが設定されていないため、errorになる
~/src/github.com/m1yam0t0/sandbox main*
❯ kubectl cluster-info

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
The connection to the server localhost:8080 was refused - did you specify the right host or port?

# 上記内容の playbook を実行 (make kubeconfig でできるようにしている)
~/src/github.com/m1yam0t0/sandbox main*
❯ make kubeconfig
----- Get kubeconfig -----

PLAY [sandbox] *************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************
ok: [m1yam0t0-nuc]

TASK [kind : Get kubeconfig] ***********************************************************************************************************************************************
changed: [m1yam0t0-nuc]

TASK [kind : Copy kubeconfig to local] *************************************************************************************************************************************
changed: [m1yam0t0-nuc]

TASK [kind : Merge kubeconfig] *********************************************************************************************************************************************
changed: [m1yam0t0-nuc]

TASK [kind : Output Merged kubeconfig] *************************************************************************************************************************************
changed: [m1yam0t0-nuc]

PLAY RECAP *****************************************************************************************************************************************************************
m1yam0t0-nuc               : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


# context が設定され、kind で作成したクラスタの情報が見ることができるように
~/src/github.com/m1yam0t0/sandbox main*
❯ kubectl cluster-info
Kubernetes control plane is running at https://192.168.1.100:6443
KubeDNS is running at https://192.168.1.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

~/src/github.com/m1yam0t0/sandbox main*
❯ kubectl get no
NAME                    STATUS   ROLES                  AGE   VERSION
kind-control-plane   Ready    control-plane,master   65m   v1.20.2
kind-worker          Ready    <none>                 64m   v1.20.2
kind-worker2         Ready    <none>                 64m   v1.20.2
kind-worker3         Ready    <none>                 64m   v1.20.2

kind での kubeconfig の取得について

kind では kind get kubeconfig コマンドが用意されている。このコマンドを実行すると、指定したクラスタの kubeconfig が出力される。

m1yam0t0@m1yam0t0-nuc ~
❯ kind get kubeconfig --name test
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:38227
  name: kind-test
contexts:
- context:
    cluster: kind-test
    user: kind-test
  name: kind-test
current-context: kind-test
kind: Config
preferences: {}
users:
- name: kind-test
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

kind export kubeconfig コマンドで、context の切り替えもできる。kubeconfig に該当の設定がない場合でも追加されるようになっている。

# context が何も設定されていない状態
m1yam0t0@m1yam0t0-nuc ~
❯ kubectl config get-contexts
CURRENT   NAME   CLUSTER   AUTHINFO   NAMESPACE

# kind export kubeconfig で context を設定
m1yam0t0@m1yam0t0-nuc ~
❯ kind export kubeconfig --name test
Set kubectl context to "kind-test"

# 新たに context が追加されている
m1yam0t0@m1yam0t0-nuc ~
❯ kubectl config get-contexts
CURRENT   NAME        CLUSTER     AUTHINFO    NAMESPACE
*         kind-test   kind-test   kind-test

# kubectl で node の一覧も取得できる
m1yam0t0@m1yam0t0-nuc ~
❯ kubectl get no
NAME                 STATUS   ROLES                  AGE   VERSION
test-control-plane   Ready    control-plane,master   48m   v1.20.2

--kubeconfig オプションを設定すると、任意のパスに kubeconfig ファイルを出力できる。 出力されたファイルを他の端末へ転送すれば、そのまま使うこともできる。

※デフォルトだと、kube-apiserver の endpoint が localhost になっているため、リモートからアクセスするために変更する必要はある。

m1yam0t0@m1yam0t0-nuc ~
❯ kind export kubeconfig --name test2 --kubeconfig test2
Set kubectl context to "kind-test2"

m1yam0t0@m1yam0t0-nuc ~
❯ ll test2
-rw------- 1 m1yam0t0 m1yam0t0 5520 Apr  3 05:36 test2

m1yam0t0@m1yam0t0-nuc ~
❯ kubectl --kubeconfig=test2 get no
NAME                  STATUS   ROLES                  AGE   VERSION
test2-control-plane   Ready    control-plane,master   40s   v1.20.2

参考