En Kubernetes, ¿es posible mostrar una columna usando un formato de fracción (es decir, X/Y) usando el campo "columnas de impresora adicionales" de un CRD?
Más precisamente, me gustaría que kubectl mostrara la descripción de un campo CR usando el mismo formato que el campo LISTO a continuación:
kubectl get statefulsets.apps <my-statefulset> NAME READY AGE <my-statefulset> 2/2 18m¿Podría proporcionar el contenido de la sección "columnas de impresora adicionales"?
Desafortunadamente, AdditionalPrinterColumns solo admite JsonPath simple, por lo que no podemos usar .status.readyReplicas/.status.replicas en JsonPath y la operación GET está a cargo de kube-apiserver, por lo que no hay participación del operador en la operación GET. Entonces, la forma más fácil que recomendaría es crear un nuevo campo en .status llamado listo con el valor "readyReplicas/replicas" y actualizarlo cada vez que actualice readyReplicas y réplicas.
A continuación, coloque a continuación en AdditionalPrinterColumns
additionalPrinterColumns: - jsonPath: .status.ready name: Ready type: stringPara StatefulSet, utilizan el siguiente código en https://github.com/kubernetes/kubernetes/blob/master/pkg/printers/internalversion/printers.go para imprimir el valor de la columna READY
statefulSetColumnDefinitions := []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Ready", Type: "string", Description: "Number of the pod with ready state"}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."}, {Name: "Images", Type: "string", Priority: 1, 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, options printers.GenerateOptions) ([]metav1.TableRow, error) { rows := make([]metav1.TableRow, 0, 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 }