kind で構築したクラスタの kubeconfig の設定をローカルに追加する
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
やっていること
kind get kubeconfig
の実行結果を register に登録delegate_to: localhost
を使用して、localhost に register の内容をファイルとしてコピーKUBECONFIG
環境変数に結合したい 2 つの kubeconfig ファイルを指定し、kubeconfig config view --flatten
で yaml を出力する- 出力した結果を
~/.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