ProgLog Kubernetes クラスター接続マニュアル
概要
WSL2環境のKINDクラスター上で動作するProgLogサービスに、ローカルのgetserversコマンドでアクセスするための手順書です。
前提条件
- WSL2環境
- KINDクラスターが稼働中
- ProgLogがStatefulSetとしてデプロイされている
- kubectl、Go、busyboxが利用可能
手順
1. 現在の状況確認
# プロジェクトのルートディレクトリに移動
cd ~/proglog
# ポッドの状態確認
kubectl get pods -l app.kubernetes.io/name=proglog -o wide
# サービスの状態確認
kubectl get svc
2. サービスの設定確認と修正
2.1 ポッドのラベルとサービスのセレクター確認
# ポッドのラベルを確認
kubectl get pods --show-labels | grep proglog
# サービスのセレクターを確認
kubectl describe svc proglog-svc
2.2 サービスの修正(エンドポイントが空の場合)
# 既存のサービスを削除
kubectl delete svc proglog-svc
# 正しいセレクターでNodePortサービスを作成
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: proglog-svc
spec:
type: NodePort
selector:
app.kubernetes.io/name: proglog
app.kubernetes.io/instance: proglog
ports:
- port: 8400
targetPort: 8400
protocol: TCP
EOF
2.3 エンドポイント確認
# エンドポイントが正しく作成されたか確認
kubectl get endpoints proglog-svc
# 正常な場合の出力例:
# NAME ENDPOINTS AGE
# proglog-svc 10.244.0.111:8400,10.244.0.113:8400,10.244.0.115:8400 0s
3. プロキシポッドの作成(WSL2+KIND環境での回避策)
3.1 プロキシポッドの作成
# TCPプロキシポッドを作成(proglog-0のIPアドレスを使用)
kubectl run proxy-pod --image=busybox --restart=Never -- \
sh -c "while true; do nc -l -p 8400 -e sh -c 'exec nc 10.244.0.111 8400'; done"
# ポッドが起動するまで待機
kubectl wait --for=condition=Ready pod/proxy-pod --timeout=60s
3.2 ポートフォワードの設定
# プロキシポッド経由でポートフォワード
kubectl port-forward pod/proxy-pod 8400:8400 &
4. getserversコマンドの実行
# プロジェクトのルートディレクトリから実行
cd ~/proglog
go run cmd/getservers/main.go -addr localhost:8400
成功時の出力例
servers:
- id:"proglog-0" rpc_addr:"10.244.0.111:8400" is_leader:true
- id:"proglog-1" rpc_addr:"10.244.0.113:8400"
- id:"proglog-2" rpc_addr:"10.244.0.115:8400"
トラブルシューティング
エンドポイントが空の場合
# サービスのセレクターを確認
kubectl get svc proglog-svc -o yaml | grep -A10 selector
# ポッドのラベルを確認
kubectl get pods proglog-0 -o yaml | grep -A10 labels
# 手順2.2の通りサービスを再作成
プロキシポッドが失敗する場合
# 失敗したポッドを削除
kubectl delete pod proxy-pod
# ポッドを再作成
kubectl run proxy-pod --image=busybox --restart=Never -- \
sh -c "while true; do nc -l -p 8400 -e sh -c 'exec nc 10.244.0.111 8400'; done"
ポートフォワードエラーの場合
# 既存のポートフォワードを停止
pkill -f "kubectl port-forward"
# 再度ポートフォワードを設定
kubectl port-forward pod/proxy-pod 8400:8400 &
ProgLogポッドのIPアドレスが変更された場合
# 現在のproglog-0のIPアドレスを取得
POD_IP=$(kubectl get pod proglog-0 -o jsonpath='{.status.podIP}')
echo "Current Pod IP: $POD_IP"
# プロキシポッドを削除して新しいIPで再作成
kubectl delete pod proxy-pod
kubectl run proxy-pod --image=busybox --restart=Never -- \
sh -c "while true; do nc -l -p 8400 -e sh -c 'exec nc ${POD_IP} 8400'; done"
クリーンアップ
作業完了後、不要なリソースを削除:
# プロキシポッドを削除
kubectl delete pod proxy-pod
# ポートフォワードを停止
pkill -f "kubectl port-forward"
# 必要に応じてNodePortサービスをClusterIPに戻す
kubectl patch svc proglog-svc -p '{"spec":{"type":"ClusterIP"}}'
注意事項
- IPアドレスの動的変更: ポッドが再起動されるとIPアドレスが変更される可能性があります
- WSL2環境固有: この手順はWSL2+KIND環境に特化しています
- プロキシポッドの制限: 一度に1つの接続のみサポート
- セキュリティ: プロダクション環境では適切なネットワークポリシーを設定してください
代替方法
直接クラスター内実行
プロキシが不安定な場合は、クラスター内でgetserversを実行:
# Goコンテナを作成
kubectl run go-client --image=golang:1.19 --restart=Never -- sleep 3600
# コードをコピー
tar czf /tmp/proglog-code.tar.gz --exclude='.git' .
kubectl cp /tmp/proglog-code.tar.gz go-client:/tmp/
# クラスター内で直接実行
kubectl exec go-client -- bash -c "
cd /tmp &&
tar xzf proglog-code.tar.gz &&
go run cmd/getservers/main.go -addr 10.244.0.111:8400
"
# 完了後クリーンアップ
kubectl delete pod go-client