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
トラブルシューティングフロー
問題解決の体系的な手順:
基本コマンドで状態確認
bashkubectl config view minikube status systemctl status kubelet
ログ診断
bashjournalctl -u kubelet -f kubectl get events --sort-by='.lastTimestamp'
詳細出力モード
bashkubectl get pods -v=6 # APIリクエストレベル出力 kubectl get pods -v=7 # HTTPヘッダー出力 kubectl get pods -v=8 # ボディコンテンツ出力
ネットワークテスト
bashtelnet localhost 6443 curl -k https://localhost:6443/version
コンポーネント再起動
bashsudo systemctl restart containerd kubelet