如何解决如何使用自定义资源的分数格式即 X/Y显示 kubectl 列
在 Kubernetes 中,是否可以使用 CRD 的“additionalPrinterColumns”字段使用分数格式(即 X/Y)显示列?
更准确地说,我希望 kubectl
使用与下面的 READY 字段相同的格式来显示 CR 字段的描述:
kubectl get statefulsets.apps <my-statefulset>
NAME READY AGE
<my-statefulset> 2/2 18m
您能否提供“additionalPrinterColumns”部分的内容?
解决方法
不幸的是 additionalPrinterColumns 只支持 Simple JsonPath,所以我们不能在 JsonPath 中使用 .status.readyReplicas/.status.replicas 并且 GET 操作是由 kube-apiserver 处理的,所以在 GET 操作中没有 Operator 的参与。因此,我建议的最简单方法是在 .status 中创建一个名为 ready 且值为“readyReplicas/replicas”的新字段,并在每次更新 readyReplicas 和副本时更新它。
然后放在下面的 additionalPrinterColumns 中
additionalPrinterColumns:
- jsonPath: .status.ready
name: Ready
type: string
对于 StatefulSet,他们在 https://github.com/kubernetes/kubernetes/blob/master/pkg/printers/internalversion/printers.go 中使用以下代码打印 READY 列的值
statefulSetColumnDefinitions := []metav1.TableColumnDefinition{
{Name: "Name",Type: "string",Format: "name",Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},{Name: "Ready",Description: "Number of the pod with ready state"},{Name: "Age",Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},{Name: "Containers",Priority: 1,Description: "Names of each container in the template."},{Name: "Images",Description: "Images referenced by each container in the template."},}
h.TableHandler(statefulSetColumnDefinitions,printStatefulSet)
h.TableHandler(statefulSetColumnDefinitions,printStatefulSetList)
func printStatefulSet(obj *apps.StatefulSet,options printers.GenerateOptions) ([]metav1.TableRow,error) {
row := metav1.TableRow{
Object: runtime.RawExtension{Object: obj},}
desiredReplicas := obj.Spec.Replicas
readyReplicas := obj.Status.ReadyReplicas
createTime := translateTimestampSince(obj.CreationTimestamp)
row.Cells = append(row.Cells,obj.Name,fmt.Sprintf("%d/%d",int64(readyReplicas),int64(desiredReplicas)),createTime)
if options.Wide {
names,images := layoutContainerCells(obj.Spec.Template.Spec.Containers)
row.Cells = append(row.Cells,names,images)
}
return []metav1.TableRow{row},nil
}
func printStatefulSetList(list *apps.StatefulSetList,error) {
rows := make([]metav1.TableRow,len(list.Items))
for i := range list.Items {
r,err := printStatefulSet(&list.Items[i],options)
if err != nil {
return nil,err
}
rows = append(rows,r...)
}
return rows,nil
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。