0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ProgLog Kubernetes クラスター接続マニュアル

Posted at

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"}}'

注意事項

  1. IPアドレスの動的変更: ポッドが再起動されるとIPアドレスが変更される可能性があります
  2. WSL2環境固有: この手順はWSL2+KIND環境に特化しています
  3. プロキシポッドの制限: 一度に1つの接続のみサポート
  4. セキュリティ: プロダクション環境では適切なネットワークポリシーを設定してください

代替方法

直接クラスター内実行

プロキシが不安定な場合は、クラスター内で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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?