Skip to content

kubectl接続エラーの解決方法

問題概要

Ubuntuシステム更新後、kubectl get pods 実行時に以下のエラーが発生しKubernetesクラスタに接続できなくなる問題が発生します:

E0805 09:59:45.750534  234576 memcache.go:265] couldn’t get current server API group list: Get "http://localhost:3334/api?timeout=32s": EOF

このエラーは通常、以下のいずれかが原因で発生します:

  • Kubernetes設定ファイルの問題
  • サービス起動状態の異常
  • 環境変数や権限設定の不備
  • ネットワーク接続障害

確実な解決策

1. Kubernetes設定ファイルの確認と復元

クラスタ設定ファイルが正しく配置されていない場合の解決法:

bash
# 設定ディレクトリ作成
mkdir -p $HOME/.kube

# 管理者設定をユーザー領域にコピー
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 権限変更
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 適用確認
export KUBECONFIG=$HOME/.kube/config

TIP

KUBECONFIG環境変数を永続化するには~/.bashrcに以下を追加:

bash
echo 'export KUBECONFIG=$HOME/.kube/config' >> ~/.bashrc
source ~/.bashrc

2. コンテキストとクラスタ設定確認

誤ったクラスタを参照している場合の修正:

bash
# 利用可能なコンテキスト一覧表示
kubectl config get-contexts

# 正しいコンテキストに切替
kubectl config use-context <context-name>

コンテキスト切替例

3. kubeletサービスとswap領域のチェック

サービス起動状態が原因の場合:

bash
# swap領域無効化
sudo swapoff -a

# kubelet再起動
sudo systemctl restart kubelet

# ステータス確認
sudo systemctl status kubelet

IMPORTANT

永続的にswapを無効化するには/etc/fstab内のswap行をコメントアウト:

bash
sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

4. sudo実行時の環境変数継承

sudo使用時に環境変数がリセットされる問題の解決:

bash
sudo visudo

以下を追加:

text
Defaults env_keep += "KUBECONFIG"

実行例:

bash
# -Eオプションで環境変数継承
sudo -E kubectl get nodes

クラウド環境別の対応

AWS EKSの場合

bash
aws eks update-kubeconfig \
  --region us-east-1 \
  --name myCluster \
  --profile <プロファイル>

AKSプライベートクラスタ

DNS解決に問題がある場合、ホストファイルにエントリ追加:

text
10.0.1.11 aks-xxx-test-dns-xxxxxx.xxxx-xx-axx-2xxxxxxx.privatelink.eastus.azmk8s.io

minikube環境

bash
# 起動ステータス確認
minikube status

# コンテナランタイム指定起動
minikube start --container-runtime=containerd

その他の対処法

キャッシュクリア

古いキャッシュが原因の場合:

bash
rm -rf ~/.kube/cache

ネットワーク・ファイアウォール確認

必要なポートが開放されているか確認(公式ドキュメント参照):

タイムゾーン設定

時刻同期がずれている場合:

bash
sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd

Docker権限問題

bash
sudo usermod -aG docker $USER
newgrp docker

トラブルシューティングフロー

問題解決の体系的な手順:

  1. 基本コマンドで状態確認

    bash
    kubectl config view
    minikube status
    systemctl status kubelet
  2. ログ診断

    bash
    journalctl -u kubelet -f
    kubectl get events --sort-by='.lastTimestamp'
  3. 詳細出力モード

    bash
    kubectl get pods -v=6  # APIリクエストレベル出力
    kubectl get pods -v=7  # HTTPヘッダー出力
    kubectl get pods -v=8  # ボディコンテンツ出力
  4. ネットワークテスト

    bash
    telnet localhost 6443
    curl -k https://localhost:6443/version
  5. コンポーネント再起動

    bash
    sudo systemctl restart containerd kubelet