一键导入
manage-storage
Manage Kube-DC storage resources — create S3 buckets (ObjectBucketClaim), DataVolumes for VMs, and PersistentVolumeClaims for containers.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Manage Kube-DC storage resources — create S3 buckets (ObjectBucketClaim), DataVolumes for VMs, and PersistentVolumeClaims for containers.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Deploy a virtual machine in a Kube-DC project with SSH, cloud-init, optional external access, and an optional gated Dedicated GPU VM profile. Use for ordinary VMs and whole-device GPU VMs that require platform preflight and non-migration safeguards.
Deploy a containerized application to a Kube-DC project with optional database, service exposure, persistent storage, and gated Shared GPU acceleration. Use for Helm or raw CPU workloads and for Shared GPU requests that must go through the platform preview/create API.
Manage Kube-DC managed Kubernetes clusters — scale worker pools, upgrade versions, access kubeconfig, and monitor status. Covers day-2 operations via kubectl patch.
Create and manage Kube-DC DatabaseCredentialPolicy (DBCP) resources — project-scoped CRDs that rotate database passwords on a tenant-chosen schedule and project them into a Kubernetes Secret. Works against KdcDatabase (PostgreSQL via CNPG / MariaDB via mariadb-operator). Use this for application credentials on managed databases. For the database itself use create-database. For TLS use manage-certificates. For application secrets unrelated to databases use manage-secrets.
Create and operate per-project encryption keys (KMSKey) backed by OpenBao Transit. Use for encrypting opaque payloads ≤ 64 KiB directly, or for envelope encryption of larger blobs (files, database fields, message-queue messages). Plaintext NEVER leaves OpenBao — workloads call encrypt/decrypt by referencing the key, not by holding key material. The same KMSKey type powers managed-K8s etcd encryption-at-rest. For storing whole secrets use manage-secrets. For TLS certificates use manage-certificates.
Create and manage Kube-DC ManagedSecrets — project-scoped secrets backed by OpenBao, optionally projected into a Kubernetes Secret via External Secrets Operator. Use this for storing API tokens, OAuth client secrets, signing keys, third-party credentials. For rotated database passwords use manage-database-credentials (the parent KdcDatabase comes from create-database). For encryption keys use manage-kms. For TLS certificates use manage-certificates.
| name | manage-storage |
| description | Manage Kube-DC storage resources — create S3 buckets (ObjectBucketClaim), DataVolumes for VMs, and PersistentVolumeClaims for containers. |
{org}-{project}check-quota skillapiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
name: {bucket-name}
namespace: {project-namespace}
labels:
kube-dc.com/organization: {org} # REQUIRED label
spec:
bucketName: {project-namespace}-{bucket-name}
storageClassName: ceph-bucket
Required: The kube-dc.com/organization label MUST be set.
When OBC is provisioned, Kubernetes creates:
| Resource | Name | Keys |
|---|---|---|
| Secret | {bucket-name} | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY |
| ConfigMap | {bucket-name} | BUCKET_HOST, BUCKET_NAME, BUCKET_PORT, BUCKET_REGION |
containers:
- name: app
envFrom:
- secretRef:
name: {bucket-name}
- configMapRef:
name: {bucket-name}
env:
- name: S3_ENDPOINT
value: "https://s3.kube-dc.cloud"
# Get credentials
export AWS_ACCESS_KEY_ID=$(kubectl get secret {bucket-name} -n {namespace} -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 -d)
export AWS_SECRET_ACCESS_KEY=$(kubectl get secret {bucket-name} -n {namespace} -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 -d)
# Use AWS CLI
aws s3 ls s3://{project-namespace}-{bucket-name}/ --endpoint-url https://s3.kube-dc.cloud
aws s3 cp myfile.txt s3://{project-namespace}-{bucket-name}/ --endpoint-url https://s3.kube-dc.cloud
Pulls the containerdisk via the node's containerd (pullMethod: node) —
faster, cached on the node, and works from any tenant VPC. The URL MUST be
digest-pinned (@sha256:...) — never a bare tag or latest. Ready
digest-pinned refs come from the platform catalog (UI "OS Images");
quay.io/containerdisks/<os> works for standard Linux images.
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
name: {disk-name}
namespace: {project-namespace}
spec:
source:
registry:
url: "docker://quay.io/containerdisks/ubuntu:24.04@sha256:..." # ALWAYS digest-pinned
pullMethod: node
pvc:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: {size} # e.g. 20Gi
storageClassName: local-path
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
name: {disk-name}
namespace: {project-namespace}
spec:
source:
http:
url: "{image-url}"
storage:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: {size} # e.g. 20Gi
storageClassName: local-path
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
name: {disk-name}
namespace: {project-namespace}
spec:
source:
blank: {}
storage:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: {size}
storageClassName: local-path
Add to VM spec:
spec:
template:
spec:
domain:
devices:
disks:
- name: datadisk
disk:
bus: virtio
volumes:
- name: datadisk
dataVolume:
name: {disk-name}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {pvc-name}
namespace: {project-namespace}
spec:
accessModes: [ReadWriteOnce]
storageClassName: local-path
resources:
requests:
storage: {size}
After creating storage resources:
# 1. Check OBC is Bound
kubectl get obc {bucket-name} -n {project-namespace} -o jsonpath='{.status.phase}'
# Expected: Bound
# 2. Verify credential secret was created
kubectl get secret {bucket-name} -n {project-namespace} -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 -d
# Expected: non-empty access key
# 3. Verify ConfigMap was created
kubectl get configmap {bucket-name} -n {project-namespace} -o jsonpath='{.data.BUCKET_NAME}'
# Expected: {project-namespace}-{bucket-name}
# 1. Check import completed
kubectl get dv {disk-name} -n {project-namespace} -o jsonpath='{.status.phase}'
# Expected: Succeeded
# 2. Check PVC was created
kubectl get pvc {disk-name} -n {project-namespace}
# Expected: STATUS=Bound
# 1. Check PVC is Bound
kubectl get pvc {pvc-name} -n {project-namespace} -o jsonpath='{.status.phase}'
# Expected: Bound
Success: Phase is Bound (OBC/PVC) or Succeeded (DataVolume), credentials exist.
Failure: If Pending, check kubectl describe obc|dv|pvc {name} -n {project-namespace} for events.
kube-dc.com/organization: {org} labelhttps://s3.kube-dc.cloud, region: us-east-1storageClassName: local-path (default)@sha256:...) — never a bare tag or latest{namespace}-{name} — must be globally unique