后端与接口
用 hcloud CLI 管理华为云 CCI…
当需要通过命令行创建、查询、更新、删除华为云 CCI(云容器实例)的 Namespace、Network、Deployment、StatefulSet、Pod、EIPPool 并查看日志与状态时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 hcloud CLI 管理华为云 C特定
解决思路
- 先验证环境:运行 `hcloud version`(要求 >= 7.2.2),首次使用执行 `printf "y\n" | hcloud version` 接受隐私声明,再用 `hcloud configure list` 检查凭证是否存在(只看有无,不读取值)。
- 配置凭证(二选一):模式 A 长期 AK/SK 设置 `HUAWEI_CLOUD_AK`、`HUAWEI_CLOUD_SK`、`HUAWEI_CLOUD_REGION`;模式 B 临时 AK/SK 额外设置 `HUAWEI_CLOUD_SECURITY_TOKEN`。绝不在对话、命令或输出中暴露 AK/SK/SecurityToken 值,优先用 profile 或环境变量而非显式参数。
- 按标准顺序执行:1) 创建 Namespace(带 flavor 注解)→ 2) 创建 Network → 3) 创建 Deployment/StatefulSet/Pod → 4) 查询状态与日志 → 5)(可选)创建 EIPPool 提供公网 IP → 6) 清理:删工作负载 → 删 Network → 删 Namespace。
- 创建 Namespace 时必须带 flavor 注解:`--metadata.annotations.namespace-kubernetes-io/flavor=general-computing`(或 `gpu-accelerated`),否则创建失败;命令示例:`hcloud CCI createCoreV1Namespace --metadata.name=<ns-name> --metadata.annotations.namespace-kubernetes-io/flavor=general-computing --cli-region=<region> --cli-output=json`。
- 创建 Network 前先用 `hcloud VPC ListVpcs`、`hcloud VPC ListSubnets` 查询可用 VPC/子网,再用 `hcloud VPC ShowSubnet --vpc_id=<vpc-id> --subnet_id=<subnet-id> --cli-region=<region> --cli-output=json` 获取 neutron_network_id(Network 的 networkID 字段必需)。
- Network 创建必须用 Python 辅助脚本 `python scripts/cci_network_helper.py create --namespace=<ns-name> --name=<network-name> --vpc-id=<vpc-id> --subnet-id=<subnet-id> --network-id=<neutron-network-id> --security-group-id=<sg-id> --region=<region>`,因为 hcloud CLI 无法传递含点号的注解键 `network.alpha.kubernetes.io/default-security-group`,`--cli-jsonInput` 也因 hcloud bug 不生效。
- 注意 Python 辅助脚本使用独立的 `HW_ACCESS_KEY`/`HW_SECRET_KEY`(可选 `HW_SECURITY_TOKEN`)环境变量认证,与 hcloud CLI 凭证源相互独立;需确保这些凭证具备 CCI Network 创建权限(如 `CCI FullAccess`),否则脚本报 403。
- Network 创建后轮询状态直到 Active:`hcloud CCI readNetworkingCciIoV1beta1NamespacedNetworkStatus --name=<network-name> --namespace=<ns-name> --cli-region=<region> --cli-output=json`;列出网络用 `hcloud CCI listNetworkingCciIoV1beta1NamespacedNetwork --namespace=<ns-name> --cli-region=<region> --cli-output=json`。
- Network spec 必填字段:`attachedVPC`、`subnetID`、`networkType`、`networkID`(neutron 网络 ID);必填注解为 `network.alpha.kubernetes.io/default-security-group`(不是 `security-group-id`),值设为安全组 ID。
- 创建 Deployment:`hcloud CCI createAppsV1NamespacedDeployment --namespace=<ns-name> --metadata.name=<deploy-name> --spec.replicas=1 --spec.selector.matchLabels.app=<deploy-name> --spec.template.metadata.labels.app=<deploy-name> --spec.template.spec.containers.1.name=<container-name> --spec.template.spec.containers.1.image=<image> --spec.template.spec.containers.1.resources.limits.cpu=500m --spec.template.spec.containers.1.resources.limits.memory=1Gi --spec.template.spec.containers.1.resources.requests.cpu=500m --spec.template.spec.containers.1.resources.requests.memory=1Gi --cli-region=<region> --cli-output=json`。
- 扩缩容 Deployment:`hcloud CCI patchAppsV1NamespacedDeploymentScale --name=<deploy-name> --namespace=<ns-name> --spec.replicas=<new-replicas> --cli-region=<region>`;查状态:`hcloud CCI readAppsV1NamespacedDeploymentStatus --name=<deploy-name> --namespace=<ns-name> --cli-region=<region> --cli-output=json`。
- 创建 StatefulSet:`hcloud CCI createAppsV1NamespacedStatefulSet --namespace=<ns-name> --metadata.name=<sts-name> --spec.replicas=1 --spec.selector.matchLabels.app=<sts-name> --spec.template.metadata.labels.app=<sts-name> --spec.template.spec.containers.1.name=<container-name> --spec.template.spec.containers.1.image=<image> --spec.template.spec.containers.1.resources.limits.cpu=500m --spec.template.spec.containers.1.resources.limits.memory=1Gi --cli-region=<region> --cli-output=json`;查状态用 `hcloud CCI readAppsV1NamespacedStatefulSetStatus`。
- 创建 Pod:`hcloud CCI createCoreV1NamespacedPod --namespace=<ns-name> --metadata.name=<pod-name> --spec.containers.1.name=<container-name> --spec.containers.1.image=<image> --spec.containers.1.resources.limits.cpu=500m --spec.containers.1.resources.limits.memory=1Gi --cli-region=<region> --cli-output=json`;查状态用 `hcloud CCI readCoreV1NamespacedPodStatus`;查日志用 `hcloud CCI readCoreV1NamespacedPodLog --name=<pod-name> --namespace=<ns-name> --container=<container-name> --cli-region=<region>`。
- 创建 EIPPool:`hcloud CCI createCrdYangtseCniV1NamespacedEIPPool --namespace=<ns-name> --apiVersion=crd.yangtse.cni/v1 --kind=EIPPool --metadata.name=<eippool-name> --spec.amount=1 --spec.eipAttributes.networkType=5_bgp --spec.eipAttributes.ipVersion=4 --spec.eipAttributes.bandwidth.shareType=PER --spec.eipAttributes.bandwidth.size=5 --spec.eipAttributes.bandwidth.chargeMode=bandwidth --spec.eipAttributes.bandwidth.name=<bw-name> --cli-region=<region> --cli-output=json`;`--apiVersion=crd.yangtse.cni/v1` 与 `--kind=EIPPool` 必填,`networkType` 取值 `5_bgp`(动态 BGP)或 `5_gray`(专用负载均衡),自动创建 EIP 时 `chargeMode` 与 `name` 必填。
- 给 Pod 绑定 EIPPool:添加注解 `yangtse.io/eippool=<eippool-name>`,用连字符写法 `--metadata.annotations.yangtse-io/eippool=<eippool-name>`。
- 严格遵守 CCI 资源约束:`resources.limits` 必须等于 `resources.requests`(如都设为 `500m/1Gi`),否则报 "limit and request doesn't equal";必须先创建 Network 再创建工作负载,否则 Pod 会 Pending;VPC 子网 CIDR 不得为 `10.247.0.0/16`(CCI 保留给 Service 网络)。
- 所有破坏性操作(删除 Namespace/Network/Deployment/StatefulSet/Pod/EIPPool)执行两步确认:第一步预览命令、资源详情与风险警告,第二步用户明确确认后才执行;删除 Namespace 会级联删除其下所有资源(Network、Pod、Deployment 等),风险最高。
- 删除顺序:Pod → Deployment/StatefulSet → EIPPool → Network → Namespace。
- 构造任何 CCI 命令前先运行 `hcloud CCI <Operation> --help` 核对参数名(CCI 参数有数百个,help 输出是权威来源);参数遵循 Kubernetes 嵌套点号约定:注解/标签/资源/selector 用 `{*}` 格式,容器数组从 1 开始(`--spec.template.spec.containers.1.name`),命名空间级操作必须带 `--namespace`。
- 输出格式:推荐 `--cli-output=json`,人工查看用 `--cli-output=table`;可用 JMESPath 过滤,如 `--cli-query="{replicas:status.replicas,ready:status.readyReplicas,available:status.availableReplicas}"` 或 `--cli-query="status.phase"`。
- 调试时给任意命令加 `--cli-debug=true` 查看详细请求/响应。
- 查询命名空间资源配额:`hcloud CCI listCoreV1NamespacedResourceQuota --namespace=<ns-name> --cli-region=<region> --cli-output=json`。
- 验证清单:Namespace 用 `readCoreV1Namespace` 期望 status.phase=Active;Network 用 `readNetworkingCciIoV1beta1NamespacedNetworkStatus` 期望 status.phase=Active;Deployment 用 `readAppsV1NamespacedDeploymentStatus` 期望 readyReplicas >= 1;Pod 用 `readCoreV1NamespacedPodStatus` 期望 status.phase=Running。
- 最佳实践:不同团队/项目使用不同 Namespace 隔离避免资源冲突;仅在需要 Pod 公网访问时才按需创建 EIPPool。
- 常见问题速查:Namespace 创建失败→缺 flavor 注解;Network 创建失败(400/403)→缺 VPC/子网/注解/networkID 或凭证权限不足(用 Python 辅助脚本 + 长期 AK/SK 模式 A);Pod 一直 Pending→命名空间无 Network;403→IAM 权限不足;深层嵌套参数报错→用 `--help` 核对参数路径;含点号注解未传递→用 Python 辅助脚本;EIPPool 创建失败(400/422)→缺 apiVersion/kind/networkType;limit/request 不匹配→设为相同值。
适用边界 · 注意事项
- 不使用华为云 CCI 或没有 hcloud CLI(KooCLI >= 7.2.2)及对应 AK/SK 凭证时,本技能不适用。
- 不涉及 CCI 资源(如仅操作 CCE 集群、ECS、OBS 等其他云服务)时不要套用本流程。
- 未获得用户对破坏性操作的明确确认前,不要执行任何删除类命令。