HN 日本語サマリー

← 一覧へ戻る
インフラ・DevOps

OpenShell Kubernetes Operator

OpenShell Kubernetes Operator (github.com)

7 pointsby xfiler0 コメント

要約

OpenShell Kubernetes Operatorは、OpenShellサンドボックスをKubernetesネイティブに宣言的に管理するためのツールです。kubectl applyを使用して、OpenShellサンドボックスのライフサイクル、プロバイダー、ポリシー、ワークスペースなどをKubernetesリソースとして定義・管理できます。このオペレーターは、Agent Sandbox Kubernetes SIGプロジェクトと連携し、開発やデモ用途に適した迅速なセットアップを提供します。

全文翻訳

OpenShell Kubernetes Operator 宣言的なKubernetesネイティブ制御によるOpenShellサンドボックス管理 — ゲートウェイに直接対話するのではなく、kubectl applyで管理します。ステータス: 初期開発段階。5つのリソースが実装されています: OpenShellSandbox(フルライフサイクル — ファイナライザークリーンアップ、プロビジョニングされたボリューム、インプレースコンバージェンス、ドリフト時の再作成)、OpenShellProvider(Secretからの認証情報、静的コピーまたはゲートウェイ発行のリフレッシュとして同期)、OpenShellPolicy(サンドボックス作成時に適用される再利用可能なポリシー)、OpenShellWorkspace(宣言的なメンバーシップを持つクラスター スコープのテナンシー境界)、およびOpenShellProviderProfile(クラスター スコープのプラットフォーム スコープのプロバイダータイプ定義)。 何をするものか オペレーターは、OpenShellゲートウェイのgRPC APIに対する薄いフロントエンドです。カスタムリソースとして望ましい状態を宣言すると、オペレーターはそれらをゲートウェイ呼び出しに調和させ、ゲートウェイの状態をリソースの.statusにミラーリングします。ゲートウェイを再実装するものではありません。 インストール 前提条件: Agent Sandbox OpenShellゲートウェイは、Agent Sandbox Kubernetes SIGプロジェクト(sandboxes.agents.x-k8s.io)を通じてサンドボックスポッドをプロビジョニングします。そのコントローラーとCRDはクラスター全体で必須です — バンドルされたゲートウェイを使用する場合でも、独自のゲートウェイを使用する場合でも、チャートの前に一度インストールしてください: kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/v0.5.2/sandbox.yaml kubectl -n agent-sandbox-system rollout status deploy/agent-sandbox-controller これがないと、ゲートウェイは起動しますが、そのコンピュートドライバーはサポートされているAgent Sandbox APIバージョンがないとログに記録し、サンドボックスを作成できません。チャートにはバンドルされていません — これは共有クラスターインフラストラクチャ(CRD + コントローラー)であり、そのライフサイクルはこのリリースに tie されるべきではありません。ゲートウェイの後にインストールする場合は、ゲートウェイを再起動して、提供されているAPIを再検出させてください。 チャート 1つのコマンドで、ゲートウェイ、OIDC発行者、およびオペレーターの完全なスタックをインストールし、それらを配線済みで提供します: helm install openshell deploy/charts/openshell-operator \ --namespace openshell-system --create-namespace デフォルト(gateway.bundled=true)では、チャートはサブチャートとしてアップストリームのOpenShellゲートウェイをプルし、オペレーターの管理者ベアラーを発行する小さな静的なOIDC発行者を立ち上げ、TLS経由でオペレーターをゲートウェイに向けます — 外部ゲートウェイ、IdP、または手動設定は不要です。バンドルされたゲートウェイはTLSを自己署名し(cert-manager不要)、一時的なSQLiteストアを使用し、固定のインクラスターIDを取るため、名前空間ごとに1つのリリース、および本番環境ではなく開発/デモ用途を想定しています。 --set gateway.bundled=false --set gateway.endpoint=https://your-gateway:8080 で独自のゲートウェイを使用します。チャートはオペレーター(およびデフォルトで発行者)のみをインストールし、インストールノートには、発行者を信頼するようにゲートウェイを設定するための発行者/オーディエンス/admin_role の値が表示されます。または、バンドルされた発行者の代わりに独自のトークンSecret(auth.byo.tokenSecret)をマウントするために auth.mode=byo を設定します。設計については docs/operator-auth.md を参照してください。 operator.deployStandalone=false は、CRDとRBACのみをインストールします(オペレーターコンテナを elsewhere に埋め込むため。gateway.bundled=false とペアにします)。 高可用性 デフォルトでリーダー選出が有効になっているため、オペレーターのスケーリングは安全です: --set replicaCount=3 は、coordination.k8s.io Lease を競合する3つのレプリカを実行し、ホルダーのみが調和できるようにし、残りは待機状態になるため、ローリングアップデートまたはノード損失はクリーンにフェイルオーバーします。コンテナはポート8080で /healthz (liveness)および /readyz (readiness)を提供し、プローブとして配線されています。readiness はリーダーシップをゲートしないため、スタンバイは準備完了を報告し、ロールアウトを遅延させることはありません。 主要な値: gateway.bundled, gateway.endpoint, gateway.caSecret, auth.mode, auth.oidc.*, image.repository / image.tag, logLevel, crds.install, operator.deployStandalone, replicaCount, leaderElection.enabled, webhook.execConfinement.enabled, resources。 例 完全で自己完結型のセットアップ: 認証情報Secret、ゲートウェイでそれをバインドするOpenShellProvider、サンドボックスを制約するOpenShellPolicy、およびプロバイダーとpolicyRefを介してそれらをまとめるOpenShellSandbox。 # 認証情報はSecret内に存在し、CR上には決して存在しません。参照されることをオプトインします。 apiVersion: v1 kind: Secret metadata: name: anthropic-credentials annotations: openshell.lenshq.io/allow-provider-ref: "true" stringData: ANTHROPIC_API_KEY: sk-ant-... --- apiVersion: openshell.lenshq.io/v1alpha1 kind: OpenShellProvider metadata: name: anthropic spec: type: claude-code # a gateway provider-profile id (exact, not an alias) credentialsSecretRef: name: anthropic-credentials # keys: [] reads all keys --- apiVersion: openshell.lenshq.io/v1alpha1 kind: OpenShellPolicy metadata: name: restricted spec: filesystem: includeWorkdir: true readOnly: ["/etc"] process: runAsUser: sandbox networkPolicies: claude_code: endpoints: - host: api.anthropic.com port: 443 --- apiVersion: openshell.lenshq.io/v1alpha1 kind: OpenShellSandbox metadata: name: my-sandbox spec: image: ghcr.io/nvidia/openshell-community/sandboxes/python:latest environment: LOG_LEVEL: debug providers: - anthropic # the OpenShellProvider above policyRef: restricted # the OpenShellPolicy above, applied at creation gpu: false gpuCount: 1 # GPUs to request when gpu is true (ignored otherwise) logLevel: info # sandbox-runtime log level runtimeClassName: gvisor # RuntimeClass requested from the compute platform resources: # cpu/memory for the sandbox pod (Kubernetes quantities) requests: cpu: "500m" memory: 512Mi limits: cpu: "2" memory: 2Gi labels: # applied to the sandbox's pod team: platform annotations: example.com/owner: platform volumes: # operator-provisioned, persists across recreation - name: work mountPath: /data claim: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi volumeRetention: Retain # keep the PVC when the sandbox is deleted (default) $ kubectl apply -f example.yaml $ kubectl get oss NAME READY PHASE SANDBOX AGE my-sandbox True Ready 3f2b... 30s $ kubectl get osp anthropic NAME TYPE READY AGE anthropic claude True 30s $ kubectl get ospol restricted NAME READY AGE restricted True 30s $ kubectl wait --for=condition=Ready oss/my-sandbox openshellsandbox.openshell.lenshq.io/my-sandbox condition met 以下のセクションでは、各リソースタイプを詳細に説明します。 プロバイダー OpenShellProviderは、ゲートウェイ上で認証情報のセットをバインドします。認証情報の値はリソース上に存在することはありません — オペレーターは同じ名前空間のSecretから読み取り、Secretはアノテーション openshell.lenshq.io/allow-provider-ref: "true" でオプトインする必要があります(上記の例のOpenShellProviderとSecretを参照)。オペレーターはSecretを監視するため、外部ローテーション(external-secrets、Vault)は再同期をトリガーします。 credentialsSecretRef.keys は、Secretのキーのサブセットを選択し(空の場合はすべて読み取ります)、spec.config は非シークレット設定(例: region)をゲートウェイに渡します。 認証情報の処理 同じOpenShellProvider — 追加フィールドなし — は、ゲートウェイがそのタイプに対してサポートする最も強力な認証情報処理を取得します。調和時にオペレーターはプロバイダータイププロファイルを取得し、認証情報ごとに選択します: コピー — 値はゲートウェイに静的キー(例: claude-code)として保存されます。 リフレッシュ — ゲートウェイは、Secretで提供するシードマテリアルから短命のトークンを発行します(OAuth2リフレッシュ / クライアントクレデンシャル、GoogleサービスアカウントJWT)。長命のシードはゲートウェイのリフレッシュストアにのみ存在し、保存された静的認証情報としては存在しません。オペレーターはそれを一度設定し、Secretのローテーション時に再シードします — トークン自体を発行しません。 混合 — 両方を使用するマルチ認証情報プロバイダー。 オペレーターは選択されたティアを .status.credentialMode (Modeプリントカラム)に表示します。 リフレッシュを取得するためにCRに変更はありません — Secretの内容のみが異なり、プロバイダータイプによって決定されます: apiVersion: v1 kind: Secret metadata: name: vertex-credentials annotations: openshell.lenshq.io/allow-provider-ref: "true" stringData: # google-vertex-ai の gcloud_adc_token リフレッシュマテリアル — オペレーターはこれをゲートウェイのリフレッシュ設定にルーティングします。 # 保存された静的認証情報としてではなく、