🤖

kubectl get nodesで The connection to the server xxx was refusedが出た時の対応

2022/06/22に公開2

ケース例

ワーカーノードでkubectl get nodesを実行した際に以下のようになった場合についての対応を示す.

ubuntu@wk-node2:~$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
  • 注意
    • 本記事の対象はコントロールプレーンではない
    • コントロールプレーンでは以下のとおりノード情報が取得できているものとする
ubuntu@cp-node1:~$ kubectl get nodes
NAME              STATUS     ROLES           AGE   VERSION
ip-10-10-10-147   NotReady   control-plane   23h   v1.24.2
wk-node1          NotReady   <none>          23m   v1.24.2
wk-node2          NotReady   <none>          23m   v1.24.2

対応

まず,kubectl config viewを実行して設定状況を確認する.

apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null

上記のように設定が空の場合,以下を実行する.

mkdir -p $HOME/.kube \
  && sudo cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config \
  && sudo chown $(id -u):$(id -g) $HOME/.kube/config

これにより,再度kubectl config viewを実行すると,以下のとおりnullだった要素およびコンテキスト情報が埋められる.

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://xxx.xxx.xxx.xxx:6443
  name: default-cluster
contexts:
- context:
    cluster: default-cluster
    namespace: default
    user: default-auth
  name: default-context
current-context: default-context
kind: Config
preferences: {}
users:
- name: default-auth
  user:
    client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
    client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

事後確認

再度kubectl get nodesを実行し,ノード情報が正常に取得されることを確認する.

ubuntu@wk-node2:~$ kubectl get nodes
NAME              STATUS     ROLES           AGE   VERSION
ip-10-10-10-147   NotReady   control-plane   24h   v1.24.2
wk-node1          NotReady   <none>          99m   v1.24.2
wk-node2          NotReady   <none>          98m   v1.24.2

Discussion

Kazuki Suda (@superbrothers)Kazuki Suda (@superbrothers)
mkdir -p $HOME/.kube \
  && sudo cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config \
  && sudo chown $(id -u):$(id -g) $HOME/.kube/config

ノードの /etc/kubernetes/kubelet.conf はそのノードの kubelet が Kubernetes API を操作する際に使うもので、ユーザがオペレーションのために使うのにはふさわしくなく避けたほうがよいです。kubelet ができる操作は限定されているため、ノードのリストやそのノード上で実行されている Pod の操作等しかできません。

コントロールプレーンノードの /etc/kubernetes/admin.conf を使うか、クラスタで X509 クライアント証明書や OIDC などの認証を有効にして RBAC で必要な権限を付与することが望ましいです。

11000010011100001001

コメントいただきありがとうございます.
実際的な運用においては,コントロールプレーンからadmin.confを持ってきて一時的に.kube/configとして利用しCertificate Signing Requests に従ってX.509の設定をし,その後Using RBAC Authorizationで以ってユーザを妥当な権限を付与したClusterRoleへバインドするのがベターですね.