in pkg/appgw/health_probes.go [220:285]
func (c *appGwConfigBuilder) getProbeForServiceContainer(service *v1.Service, backendID backendIdentifier) *v1.Probe {
// find all the target ports used by the service
allPorts := make(map[int32]interface{})
for _, sp := range service.Spec.Ports {
if sp.Protocol != v1.ProtocolTCP {
continue
}
if backendID.Backend.Service != nil && (fmt.Sprint(sp.Port) == serviceBackendPortToStr(backendID.Backend.Service.Port) ||
sp.Name == serviceBackendPortToStr(backendID.Backend.Service.Port) ||
sp.TargetPort.String() == serviceBackendPortToStr(backendID.Backend.Service.Port)) {
// Matched a service port in the service
if sp.TargetPort.String() == "" {
allPorts[sp.Port] = nil
} else if sp.TargetPort.Type == intstr.Int {
// port is defined as port number
allPorts[sp.TargetPort.IntVal] = nil
} else {
for targetPort := range c.resolvePortName(sp.Name, &backendID) {
allPorts[targetPort] = nil
}
}
}
}
podList := c.k8sContext.ListPodsByServiceSelector(service)
if len(podList) == 0 {
return nil
}
// use the target port to figure out the container and use it's readiness/liveness probe
for _, container := range podList[0].Spec.Containers {
for _, port := range container.Ports {
if _, ok := allPorts[port.ContainerPort]; !ok {
continue
}
// found the container
var probe *v1.Probe
if container.ReadinessProbe != nil && container.ReadinessProbe.HTTPGet != nil {
probe = container.ReadinessProbe
} else if container.LivenessProbe != nil && container.LivenessProbe.HTTPGet != nil {
probe = container.LivenessProbe
}
// if probe port is named, resolve it by going through container port and set it in the probe itself
if probe != nil && probe.HTTPGet.Port.String() != "" && probe.HTTPGet.Port.Type == intstr.String {
for _, port := range container.Ports {
if port.Name == probe.HTTPGet.Port.StrVal {
probe.HTTPGet.Port = intstr.IntOrString{
Type: intstr.Int,
IntVal: port.ContainerPort,
}
break
}
}
}
return probe
}
}
return nil
}