Make the output of kubectl describe service more informative (#125117)

* kubectl: add internalTrafficPolicy to Service describer

* kubectl: add loadBalancer ipMode to Service describer

* kubectl: fix duplicate IP fields in Service describer

For a LoadBalancer Service, there were two "IP" fields in the output of
`kubectl describe service` if its loadBalancerIP is not empty, which
looks ambiguous.
This commit is contained in:
Quan Tian 2024-06-27 04:09:36 +08:00 committed by GitHub
parent 1d51766c7a
commit 59d90eb17e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 5 deletions

View File

@ -2984,6 +2984,9 @@ func buildIngressString(ingress []corev1.LoadBalancerIngress) string {
} }
if ingress[i].IP != "" { if ingress[i].IP != "" {
buffer.WriteString(ingress[i].IP) buffer.WriteString(ingress[i].IP)
if ingress[i].IPMode != nil {
buffer.WriteString(fmt.Sprintf(" (%s)", *ingress[i].IPMode))
}
} else { } else {
buffer.WriteString(ingress[i].Hostname) buffer.WriteString(ingress[i].Hostname)
} }
@ -3027,7 +3030,7 @@ func describeService(service *corev1.Service, endpointSlices []discoveryv1.Endpo
w.Write(LEVEL_0, "External IPs:\t%v\n", strings.Join(service.Spec.ExternalIPs, ",")) w.Write(LEVEL_0, "External IPs:\t%v\n", strings.Join(service.Spec.ExternalIPs, ","))
} }
if service.Spec.LoadBalancerIP != "" { if service.Spec.LoadBalancerIP != "" {
w.Write(LEVEL_0, "IP:\t%s\n", service.Spec.LoadBalancerIP) w.Write(LEVEL_0, "Desired LoadBalancer IP:\t%s\n", service.Spec.LoadBalancerIP)
} }
if service.Spec.ExternalName != "" { if service.Spec.ExternalName != "" {
w.Write(LEVEL_0, "External Name:\t%s\n", service.Spec.ExternalName) w.Write(LEVEL_0, "External Name:\t%s\n", service.Spec.ExternalName)
@ -3058,6 +3061,9 @@ func describeService(service *corev1.Service, endpointSlices []discoveryv1.Endpo
if service.Spec.ExternalTrafficPolicy != "" { if service.Spec.ExternalTrafficPolicy != "" {
w.Write(LEVEL_0, "External Traffic Policy:\t%s\n", service.Spec.ExternalTrafficPolicy) w.Write(LEVEL_0, "External Traffic Policy:\t%s\n", service.Spec.ExternalTrafficPolicy)
} }
if service.Spec.InternalTrafficPolicy != nil {
w.Write(LEVEL_0, "Internal Traffic Policy:\t%s\n", *service.Spec.InternalTrafficPolicy)
}
if service.Spec.HealthCheckNodePort != 0 { if service.Spec.HealthCheckNodePort != 0 {
w.Write(LEVEL_0, "HealthCheck NodePort:\t%d\n", service.Spec.HealthCheckNodePort) w.Write(LEVEL_0, "HealthCheck NodePort:\t%d\n", service.Spec.HealthCheckNodePort)
} }

View File

@ -710,8 +710,19 @@ func TestDescribeService(t *testing.T) {
LoadBalancerIP: "5.6.7.8", LoadBalancerIP: "5.6.7.8",
SessionAffinity: corev1.ServiceAffinityNone, SessionAffinity: corev1.ServiceAffinityNone,
ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyLocal, ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyLocal,
InternalTrafficPolicy: ptr.To(corev1.ServiceInternalTrafficPolicyCluster),
HealthCheckNodePort: 32222, HealthCheckNodePort: 32222,
}, },
Status: corev1.ServiceStatus{
LoadBalancer: corev1.LoadBalancerStatus{
Ingress: []corev1.LoadBalancerIngress{
{
IP: "5.6.7.8",
IPMode: ptr.To(corev1.LoadBalancerIPModeVIP),
},
},
},
},
}, },
endpointSlices: []*discoveryv1.EndpointSlice{{ endpointSlices: []*discoveryv1.EndpointSlice{{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -742,13 +753,15 @@ func TestDescribeService(t *testing.T) {
IP Families: IPv4 IP Families: IPv4
IP: 1.2.3.4 IP: 1.2.3.4
IPs: <none> IPs: <none>
IP: 5.6.7.8 Desired LoadBalancer IP: 5.6.7.8
LoadBalancer Ingress: 5.6.7.8 (VIP)
Port: port-tcp 8080/TCP Port: port-tcp 8080/TCP
TargetPort: 9527/TCP TargetPort: 9527/TCP
NodePort: port-tcp 31111/TCP NodePort: port-tcp 31111/TCP
Endpoints: 10.244.0.1:9527,10.244.0.2:9527,10.244.0.3:9527 Endpoints: 10.244.0.1:9527,10.244.0.2:9527,10.244.0.3:9527
Session Affinity: None Session Affinity: None
External Traffic Policy: Local External Traffic Policy: Local
Internal Traffic Policy: Cluster
HealthCheck NodePort: 32222 HealthCheck NodePort: 32222
Events: <none> Events: <none>
`)[1:], `)[1:],
@ -775,8 +788,18 @@ func TestDescribeService(t *testing.T) {
LoadBalancerIP: "5.6.7.8", LoadBalancerIP: "5.6.7.8",
SessionAffinity: corev1.ServiceAffinityNone, SessionAffinity: corev1.ServiceAffinityNone,
ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyLocal, ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyLocal,
InternalTrafficPolicy: ptr.To(corev1.ServiceInternalTrafficPolicyLocal),
HealthCheckNodePort: 32222, HealthCheckNodePort: 32222,
}, },
Status: corev1.ServiceStatus{
LoadBalancer: corev1.LoadBalancerStatus{
Ingress: []corev1.LoadBalancerIngress{
{
IP: "5.6.7.8",
},
},
},
},
}, },
endpointSlices: []*discoveryv1.EndpointSlice{ endpointSlices: []*discoveryv1.EndpointSlice{
{ {
@ -827,13 +850,15 @@ func TestDescribeService(t *testing.T) {
IP Families: IPv4 IP Families: IPv4
IP: 1.2.3.4 IP: 1.2.3.4
IPs: <none> IPs: <none>
IP: 5.6.7.8 Desired LoadBalancer IP: 5.6.7.8
LoadBalancer Ingress: 5.6.7.8
Port: port-tcp 8080/TCP Port: port-tcp 8080/TCP
TargetPort: targetPort/TCP TargetPort: targetPort/TCP
NodePort: port-tcp 31111/TCP NodePort: port-tcp 31111/TCP
Endpoints: 10.244.0.1:9527,10.244.0.2:9527,10.244.0.3:9527 + 2 more... Endpoints: 10.244.0.1:9527,10.244.0.2:9527,10.244.0.3:9527 + 2 more...
Session Affinity: None Session Affinity: None
External Traffic Policy: Local External Traffic Policy: Local
Internal Traffic Policy: Local
HealthCheck NodePort: 32222 HealthCheck NodePort: 32222
Events: <none> Events: <none>
`)[1:], `)[1:],
@ -890,7 +915,7 @@ func TestDescribeService(t *testing.T) {
IP Families: IPv4 IP Families: IPv4
IP: 1.2.3.4 IP: 1.2.3.4
IPs: <none> IPs: <none>
IP: 5.6.7.8 Desired LoadBalancer IP: 5.6.7.8
Port: port-tcp 8080/TCP Port: port-tcp 8080/TCP
TargetPort: targetPort/TCP TargetPort: targetPort/TCP
NodePort: port-tcp 31111/TCP NodePort: port-tcp 31111/TCP
@ -939,7 +964,7 @@ func TestDescribeService(t *testing.T) {
IP Families: IPv4 IP Families: IPv4
IP: 1.2.3.4 IP: 1.2.3.4
IPs: 1.2.3.4 IPs: 1.2.3.4
IP: 5.6.7.8 Desired LoadBalancer IP: 5.6.7.8
Port: port-tcp 8080/TCP Port: port-tcp 8080/TCP
TargetPort: targetPort/TCP TargetPort: targetPort/TCP
NodePort: port-tcp 31111/TCP NodePort: port-tcp 31111/TCP