builder icon indicating copy to clipboard operation
builder copied to clipboard

Use a cheaper way to ping the Kubernetes API in the health check endpoint

Open arschles opened this issue 9 years ago • 3 comments

After #149, the health check server (/healthz) will be listing all namespaces in the cluster as a way to ping the Kubernetes API to determine whether it's available. This method of checking availability is more heavyweight than it has to be, since the API server should also have a healthz endpoint. Some code similar to the following should be used to check that endpoint:

// kubeClient is a *(k8s.io/kubernetes/pkg/client/unversioned).Client
res := kubeClient.Get().AbsPath("/healthz").Do()
if res.Error() != nil{
  // not possible to reach the server
}

This idea was first proposed by @aledbf in https://github.com/deis/builder/pull/149/files#r52692363

arschles avatar Feb 12 '16 18:02 arschles

@arschles this is a working version of the check

apiUrl := kubeClient.Get().AbsPath("/healthz").URL()
err := checkApiServer(apiUrl.String(), time.Duration(1*time.Second))
if err != nil {
  // something
}
// checkApiServer checks if is possible to reach the api server or not
func checkApiServer(url string, timeout time.Duration) error {
    // we don't know if the 
    client := http.Client{
        Timeout: timeout,
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        },
    }

    res, err := client.Get(url)
    if err != nil {
        return err
    }
    res.Body.Close()
    return nil
}

aledbf avatar Feb 12 '16 22:02 aledbf

thanks @aledbf

arschles avatar Feb 12 '16 22:02 arschles

This issue was moved to teamhephy/builder#35

Cryptophobia avatar Mar 21 '18 13:03 Cryptophobia