Kubernetesで「The connection to the server localhost:8443 was refused」を修正する

beginner☸️ Kubernetes2026-03-29| Kubernetes(全バージョン)、kubectl CLI、Linux/macOS/Windows、Minikube・kind・kubeadmクラスター対応

Error Message

The connection to the server localhost:8443 was refused
#kubernetes#apiserver#kubectl#connection

何が起きているか

kubectl コマンドを実行すると、次のエラーが表示されます:

The connection to the server localhost:8443 was refused - did you specify the right host or port?

kubectllocalhost:8443 にある Kubernetes API サーバーへの接続を試みていますが、そこでは何もリッスンしていません。原因は主に3つです:クラスターが起動していない、kubectl に有効な kubeconfig がない、または間違ったエンドポイントを指している。ポート 8443 は Minikube のデフォルトで、kubeadm クラスターは 6443 を使用します。kubeadm 環境で localhost:8443 が表示される場合は、kubeconfig が古いか設定ミスであることがほぼ確実です。

素早い診断

何かに触れる前に原因を絞り込みましょう。以下の4つの確認で95%のケースに対応できます。

1. 現在のコンテキストを確認する

kubectl config current-context

ここでエラーが出る場合、または見覚えのないコンテキスト名が表示される場合、それ自体が問題の原因であることが多いです。設定されているすべてを一覧表示します:

kubectl config get-contexts

2. kubeconfig の存在を確認する

echo $KUBECONFIG
ls ~/.kube/config

~/.kube/config がない場合、それが答えです。kubectl は設定が見つからないと localhost:8443 にフォールバックしますが、これはほぼ間違いなく誤りです。

3. ローカルクラスター(Minikube / kind)の場合

# Minikube
minikube status

# kind
kind get clusters

クラスターが停止または削除されている場合、kubectl が接続できる API サーバーが存在しません。

4. リモートクラスター(kubeadm / クラウド)の場合

kubectl cluster-info

kubeconfig 内のサーバーアドレスと実際の API サーバーの IP を照合します:

kubectl config view --minify | grep server

シナリオ別の修正方法

シナリオ A: ローカルクラスターが停止している(Minikube / kind)

ほとんどの場合、これが原因です。再起動しましょう:

# Minikube
minikube start

# kind(削除された場合は再作成)
kind create cluster --name my-cluster

Minikube は起動時に ~/.kube/config を自動的に書き換えます。起動したら、正常に動作しているか確認します:

kubectl get nodes

シナリオ B: kubeconfig がないか空の場合

新しいマシン、または設定が誤って削除された場合は再生成します:

# Minikube — kubeconfig を自動的に再生成
minikube update-context

# kubeadm — コントロールプレーンノードから管理者設定をコピー
scp user@control-plane-node:/etc/kubernetes/admin.conf ~/.kube/config
chmod 600 ~/.kube/config

chmod 600 は省略できません。kubectl は誰でも読み取り可能なパーミッションの設定ファイルを暗黙的に拒否します。

クラウドプロバイダーにはそれぞれ専用のコマンドがあります:

# AWS EKS
aws eks update-kubeconfig --region us-east-1 --name my-cluster

# GKE
gcloud container clusters get-credentials my-cluster --zone us-central1-a

# AKS
az aks get-credentials --resource-group my-rg --name my-cluster

シナリオ C: 間違ったコンテキストが選択されている

正しいコンテキストに切り替えます:

kubectl config use-context my-correct-context

デフォルトのコンテキストを恒久的に変更したくない場合は、--context フラグで任意のクラスターに対して一時的にコマンドを実行できます:

kubectl get pods --context=production-cluster

シナリオ D: kubeadm クラスターで API サーバーがダウンしている

コントロールプレーンに SSH 接続し、API サーバーのコンテナが実際に動作しているか確認します:

sudo crictl ps | grep kube-apiserver

# ヒントを得るために kubelet のログを確認
sudo journalctl -u kubelet -n 100

# スタティックポッドのマニフェストがまだ存在するか確認
ls /etc/kubernetes/manifests/kube-apiserver.yaml

ポッドがクラッシュしている場合は、ログを直接取得します:

sudo crictl logs $(sudo crictl ps -a | grep kube-apiserver | awk '{print $1}')

API サーバーがクラッシュする原因として最も多いのは、証明書の期限切れ、etcd のダウン、またはマニフェストフラグのタイプミスです。根本原因を修正すれば、kubelet が自動的にスタティックポッドを再起動します。

シナリオ E: ファイアウォールがポートをブロックしている

サーバーは動作しているが別のマシンから到達できない場合は、設定を疑う前に接続をテストします:

# 直接接続をテスト
telnet <api-server-ip> 6443
# または
curl -k https://<api-server-ip>:6443/healthz

ブロックされている場合はポートを開放します:

# UFW(Ubuntu)
sudo ufw allow 6443/tcp

# firewalld(RHEL/CentOS)
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --reload

念のため繰り返します:kubeadm はデフォルトで 6443 を使用し、8443 ではありません。kubeadm クラスターで localhost:8443 が表示される場合、問題はファイアウォールではなく kubeconfig のサーバー URL です。

シナリオ F: kubeconfig 内のサーバー URL が古い

再構築後に API サーバーが新しい IP に移動した場合は、kubeconfig の URL を直接更新します:

# サーバー URL を更新
kubectl config set-cluster my-cluster --server=https://<new-api-server-ip>:6443

# 変更が反映されたか確認
kubectl config view --minify | grep server

修正の確認

kubectl cluster-info
kubectl get nodes
kubectl get pods -A

正常なクラスターでは、kubectl cluster-info から次のような出力が返されます:

Kubernetes control plane is running at https://<server>:<port>
CoreDNS is running at https://<server>:<port>/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

今後の予防策

  • Minikube ユーザー: 開発環境の起動スクリプトに minikube start を追加しましょう。30秒の起動時間は、作業中にこのエラーを調査するよりはるかにましです。
  • kubeadm クラスター: kube-apiserver を Prometheus + Alertmanager で監視下に置きましょう。開発者が kubectl の不具合に気づく前にアラートを受け取れます。
  • リモートクラスター: kubeconfig はパスワードと同様に扱いましょう。シークレットマネージャーに保存し、aws eks update-kubeconfiggcloud get-credentials をオンボーディングスクリプトに組み込んで、認証情報が静かに期限切れにならないようにしましょう。
  • 複数クラスター: kubectx をインストールしましょう。kubectl config use-context の完全なコマンドの代わりに kubectx production でコンテキストを切り替えると2秒で完了し、「なぜ何も動かないのか」という混乱を一掃できます。

Related Error Notes