ccictl概述
ccictl介绍
ccictl是类似kubectl的,使用API与CCI 2.0服务进行通信的CLI版本命令行工具。其可胜任管理CCI 2.0集群的多种任务。
针对配置信息,ccictl 在 $HOME/.kubev2 目录中查找一个名为 config 的配置文件。 您可以通过设置 CLICONFIG 环境变量或设置 --cliconfig 参数来指定其他config文件。
本章节主要介绍如何使用ccictl在CCI 2.0中声明式管理应用,本章节还涵盖一些其他的ccictl功能。

CCI 2.0服务侧提供的所有资源所属组和版本(group/version)基本上属于cci/v2,ccictl工具创建,查询,删除等操作的资源的group/version也基本上属于cci/v2,所以直接使用group/version为v1或apps/v1的资源文件作为ccictl的入参,命令执行会失败。
命令分类
大多数 ccictl 命令通常可以分为以下几类:
类型 | 用途 | 描述 |
|---|---|---|
声明式资源管理 | 部署和运维(如 GitOps) | 使用资源管理声明式管理CCI 2.0工作负载。 |
命令式资源管理 | 调试 | 使用命令行参数和标志来管理CCI 2.0工作负载。 |
打印工作负载状态 | 调试 | 打印有关工作负载的信息。 |
与容器交互 | 调试 | 执行、挂接、复制、日志。 |
声明式应用管理
管理资源的首选方法是配合 ccictl apply 命令一起使用名为资源的声明式文件。 此命令读取本地(或远程)文件结构,并修改集群状态以反映声明的意图。

Apply
Apply 是在CCI 2.0集群中管理资源的首选机制。
打印工作负载状态
ccictl 支持通过提供以下命令进行调试:
- 打印 Container 日志
- 打印事件
- 执行到 Container
语法
使用以下语法从终端窗口运行ccictl命令:
ccictl [command] [TYPE] [NAME] [flags]
其中 command、TYPE、NAME 和 flags 分别是:
- command:指定要对一个或多个资源执行的操作,例如 create、get、describe、delete。
- TYPE:指定资源类型。资源类型不区分大小写, 可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:
ccictl get pod pod1 ccictl get pods pod1 ccictl get po pod1
- NAME:指定资源的名称。名称区分大小写。 如果省略名称,则显示所有资源的详细信息。例如:ccictl get pods。
- 要按类型和名称指定资源:
- 要对所有类型相同的资源进行分组,请执行以下操作:TYPE1 name1 name2 name<#>。
- 分别指定多个资源类型:TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>。
- 用一个或多个文件指定资源:-f file1 -f file2 -f file<#>
- 建议使用 YAML 而不是 JSON, 因为 YAML 对用户更友好, 特别是对于配置文件。
- flags: 指定可选的参数。例如,可以使用 -s 或 --server 参数指定 API 服务器的地址和端口。

从命令行指定的参数会覆盖默认值和任何相应的环境变量。
如果您需要帮助,在终端窗口中运行 ccictl help。
操作
下表包含所有ccictl操作的简短描述和普通语法:
操作 | 语法 | 描述 |
|---|---|---|
api-resources | ccictl api-resources [flags] | 列出可用的 API 资源。 |
api-versions | ccictl api-versions [flags] | 列出可用的 API 版本。 |
apply | ccictl apply -f FILENAME [flags] | 从文件或 stdin 对资源应用配置更改。 |
config | ccictl config SUBCOMMAND [flags] | 修改 config 文件。有关详细信息,请参阅各个子命令。 |
create | ccictl create -f FILENAME [flags] | 从文件或 stdin 创建一个或多个资源。 |
delete | ccictl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags] | 基于文件、标准输入或通过指定标签选择器、名称、资源选择器或资源本身,删除资源。 |
describe | ccictl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags] | 显示一个或多个资源的详细状态。 |
edit | ccictl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags] | 使用默认编辑器编辑和更新服务器上一个或多个资源的定义。 |
exec | ccictl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] | 对 Pod 中的容器执行命令。 |
explain | ccictl explain TYPE [--recursive=false] [flags] | 获取多种资源的文档。例如 Pod、Deployment、Service 等。 |
get | ccictl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags] | 列出一个或多个资源。 |
logs | ccictl logs POD [-c CONTAINER] [--follow] [flags] | 打印 Pod 中容器的日志。 |
rollout | ccictl rollout SUBCOMMAND [options] | 管理资源的上线。有效的资源类型:Deployment |
set | ccictl set SUBCOMMAND [options] | 配置应用资源。 |
version | ccictl version [flags] | 显示运行在客户端的 ccictl 版本。 |
资源类型
资源名 | 缩写名 | API版本 | 按命名空间 | 资源类型 |
|---|---|---|---|---|
configmaps | cm | cci/v2 | true | ConfigMap |
deployments | deploy | cci/v2 | true | Deployment |
horizontalpodautoscalers | hpa | cci/v2 | true | HorizontalPodAutoscaler |
namespaces | ns | cci/v2 | false | Namespace |
persistentvolumeclaims | pvc | cci/v2 | true | PersistentVolumeClaim |
persistentvolumes | pv | cci/v2 | false | PersistentVolume |
pods | po | cci/v2 | true | Pod |
replicasets | rs | cci/v2 | true | ReplicaSet |
secrets | - | cci/v2 | true | Secret |
services | svc | cci/v2 | true | Service |
storageclasses | - | cci/v2 | false | StorageClass |
networks | - | yangtse/v2 | true | Network |

资源类型仅表明CCI 2.0支持的所有资源类型,不保证上表所有资源对象都提供GET, POST, PUT, DELETE, PATCH所有API,如replicasets资源对象仅提供命名空间级别的查询API。不同局点的CCI 2.0服务也存在API偏差。
当遇到存在争议的API或者资源类型时,请优先咨询CCI服务接口人,一切解释权归CCI服务所有。
输出选项
输出格式
所有 ccictl 命令的默认输出格式都是人类可读的纯文本格式。要以特定格式在终端窗口输出详细信息, 可以将 -o 或 --output 参数添加到受支持的 ccictl 命令中。
语法
ccictl [command] [TYPE] [NAME] -o <output_format>
支持的输出格式如下:
输出格式 | 描述 |
|---|---|
-o custom-columns=<spec> | 使用逗号分隔的自定义列列表打印表。 |
-o custom-columns-file=<filename> | 使用 <filename> 文件中的自定义列模板打印表。 |
-o json | 输出 JSON 格式的 API 对象 |
-o jsonpath=<template> | 打印 JSONPath 表达式定义的字段 |
-o jsonpath-file=<filename> | 打印 <filename> 文件中 JSONPath 表达式定义的字段。 |
-o name | 仅打印资源名称而不打印任何其他内容。 |
-o wide | 以纯文本格式输出,包含所有附加信息。 |
-o yaml | 输出 YAML 格式的 API 对象。 |
示例
在此示例中,以下命令将单个 Pod 的详细信息输出为 YAML 格式的对象:
ccictl get pod web-pod-13je7 -o yaml
自定义列
要定义自定义列并仅将所需的详细信息输出到表中,可以使用 custom-columns 选项。 您可以选择内联定义自定义列或使用模板文件:-o custom-columns=<spec> 或 -o custom-columns-file=<filename>。
示例:
内联:
ccictl get pods <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
模板文件:
ccictl get pods <pod-name> -o custom-columns-file=template.txt
其中,template.txt 文件包含:
NAME RSRC metadata.name metadata.resourceVersion
运行这两个命令之一的结果类似于:
NAME RSRC example-name 610995
排序列表对象
要将对象排序后输出到终端窗口,可以将 --sort-by 参数添加到支持的 ccictl 命令。 通过使用 --sort-by 参数指定任何数字或字符串字段来对对象进行排序。 要指定字段,请使用 JSONPath 表达式。
语法
ccictl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
示例
要打印按名称排序的 Pod 列表,请运行:
ccictl get pods --sort-by=.metadata.name
示例:常见操作
使用以下示例集来帮助您熟悉运行常用 ccictl 操作:
ccictl apply - 以文件或标准输入为准应用或更新资源。
# 使用 example-service.yaml 中的定义创建 Service。 ccictl apply -f example-service.yaml # 使用 example-deployment.yaml 中的定义创建 deployment。 ccictl apply -f example-deployment.yaml # 使用 <directory> 路径下的任意 .yaml、.yml 或 .json 文件 创建对象。 ccictl apply -f <directory>
ccictl get - 列出一个或多个资源。
# 以纯文本输出格式列出所有 Pod。 ccictl get pods # 以纯文本输出格式列出所有 Pod,并包含附加信息。 ccictl get pods -o wide # 以纯文本输出格式列出所有Pod和 Service。 ccictl get po,services # 列出所有状态为 Pending 的 Pod ccictl get pods --field-selector=status.phase=Pending
ccictl describe - 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。
# 显示名为 <service-name> 的 Service 的详细信息。 ccictl describe svc <service-name> # 显示名为 <pod-name> 的 Pod 的详细信息。 ccictl describe pods/<pod-name> # 显示由名为 <deploy-name> 的工作负载管理的所有 Pod 的详细信息。 ccictl describe pods <deploy-name> # 描述所有的 Pod ccictl describe pods

ccictl get 命令通常用于检索同一资源类别的一个或多个资源。 它具有丰富的参数,允许您使用 -o 或 --output 参数自定义输出格式。 您可以指定 -w 或 --watch 参数以开始监测特定对象的更新。 ccictl describe 命令更侧重于描述指定资源的许多相关方面。它可以调用对 API 服务器 的多个 API 调用来为用户构建视图。 例如,该 ccictl describe pod 命令不仅检索有关Pod的信息,还检索与其关联生成的事件等。
ccictl delete - 基于文件、标准输入或通过指定标签选择器、名称、资源选择器或资源来删除资源。
# 使用 pod.yaml 文件中指定的类型和名称删除 Pod。 ccictl delete -f pod.yaml # 删除所有带有 '<label-key>=<label-value>' 标签的 Pod 和 Service。 ccictl delete pods,services -l <label-key>=<label-value> # 删除所有 Pod,包括未初始化的 Pod。 ccictl delete pods --all
ccictl exec - 对 Pod 中的容器执行命令。
# 从 Pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。 ccictl exec <pod-name> -- date # 运行输出 'date' 获取在 Pod <pod-name> 中容器 <container-name> 的输出。 ccictl exec <pod-name> -c <container-name> -- date # 获取一个交互 TTY 并在 Pod <pod-name> 中运行 /bin/bash。默认情况下,输出来自第一个容器。 ccictl exec -ti <pod-name> -- /bin/bash
ccictl logs - 打印 Pod 中容器的日志。
# 返回 Pod <pod-name> 的日志快照。 ccictl logs <pod-name> # 从 Pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。 ccictl logs -f <pod-name>
JSONPath支持
ccictl 工具支持 JSONPath 模板作为输出格式。
JSONPath 模板由大括号 { 和 } 包起来的 JSONPath 表达式组成。 ccictl 使用 JSONPath 表达式来过滤 JSON 对象中的特定字段并格式化输出。 除了原始的 JSONPath 模板语法,以下函数和语法也是有效的:
- 使用双引号将 JSONPath 表达式内的文本引起来。
- 使用 range,end 运算符来迭代列表。
- 使用负片索引后退列表。负索引不会“环绕”列表, 并且只要 \( ( - index + listLength ) \ge 0 \) 就有效。

- $ 运算符是可选的,因为默认情况下表达式总是从根对象开始。
- 结果对象将作为其 String() 函数输出。
JSONPath 中的函数
给定 JSON 输入:
{
"kind": "List",
"items":[
{
"kind":"None",
"metadata":{
"name":"127.0.0.1",
"labels":{
"kubernetes.io/hostname":"127.0.0.1"
}
},
"status":{
"capacity":{"cpu":"4"},
"addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}]
}
},
{
"kind":"None",
"metadata":{"name":"127.0.0.2"},
"status":{
"capacity":{"cpu":"8"},
"addresses":[
{"type": "LegacyHostIP", "address":"127.0.0.2"},
{"type": "another", "address":"127.0.0.3"}
]
}
}
],
"users":[
{
"name": "myself",
"user": {}
},
{
"name": "e2e",
"user": {"username": "admin", "password": "secret"}
}
]
} 函数 | 描述 | 示例 | 结果 |
|---|---|---|---|
text | 纯文本 | kind is {.kind} | kind is List |
@ | 当前对象 | {@} | 与输入相同 |
. 或 [] | 子运算符 | {.kind}、{['kind']} 或 {['name\.type']} | List |
.. | 递归下降 | {..name} | 127.0.0.1 127.0.0.2 myself e2e |
* | 通配符。获取所有对象 | {.items[*].metadata.name} | [127.0.0.1 127.0.0.2] |
[start:end:step] | 下标运算符 | {.users[0].name} | myself |
[,] | 并集运算符 | {.items[*]['metadata.name', 'status.capacity']} | 127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8] |
?() | 过滤 | {.users[?(@.name=="e2e")].user.password} | secret |
range,end | 迭代列表 | {range .items[*]}[{.metadata.name}, {.status.capacity}] {end} | [127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] |
'' | 引用解释执行字符串 | {range .items[*]}{.metadata.name}{'\t'}{end} | 127.0.0.1 127.0.0.2 |
\ | 转义终止符 | {.items[0].metadata.labels.kubernetes\.io/hostname} | 127.0.0.1 |
通过 ccictl 使用 JSONPath 表达式
使用 ccictl 和 JSONPath 表达式的示例:
ccictl get pods -o json
ccictl get pods -o=jsonpath='{@}'
ccictl get pods -o=jsonpath='{.items[0]}'
ccictl get pods -o=jsonpath='{.items[0].metadata.name}'
ccictl get pods -o=jsonpath="{.items[*]['metadata.name', 'status.capacity']}"
ccictl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'
ccictl get pods -o=jsonpath='{.items[0].metadata.labels.kubernetes\.io/hostname}' JSONPath 中的正则表达式
不支持 JSONPath 正则表达式。如需使用正则表达式进行匹配操作,您可以使用如 jq 之类的工具。
# ccictl 的 JSONpath 输出不支持正则表达式
# 下面的命令不会生效
ccictl get pods -o jsonpath='{.items[?(@.metadata.name=~/^test$/)].metadata.name}'
# 下面的命令可以获得所需的结果
ccictl get pods -o json | jq -r '.items[] | select(.metadata.name | test("test-")).metadata.name' 
