インフラ・DevOps
OpenShell Kubernetes Operator
OpenShell Kubernetes Operator (github.com)
要約
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 リフレッシュマテリアル — オペレーターはこれをゲートウェイのリフレッシュ設定にルーティングします。
# 保存された静的認証情報としてではなく、