Skip to content

Commit ac835e1

Browse files
committed
Fix heapster client config to make it work when master moves
Previously the heapster client would always talk to the same IP, even when the master moved somewhere. Now it reuses apiserver client and abstracts service proxy. This makes is always work when the apiserver client is correct.
1 parent 8af7465 commit ac835e1

File tree

2 files changed

+37
-19
lines changed

2 files changed

+37
-19
lines changed

src/app/backend/heapsterclient.go

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,40 @@
1515
package main
1616

1717
import (
18-
"bytes"
1918
"log"
2019

2120
client "k8s.io/kubernetes/pkg/client/unversioned"
2221
)
2322

2423
// Clients for making requests to a Heapster instance.
2524
type HeapsterClient interface {
26-
// Creates a new GET http request to heapster.
27-
Get() *client.Request
25+
// Creates a new GET HTTP request to heapster, specified by the path param, to the V1 API
26+
// endpoint. The path param is without the API prefix, e.g.,
27+
// /model/namespaces/default/pod-list/foo/metrics/memory-usage
28+
29+
Get(path string) *client.Request
30+
}
31+
32+
// In-cluster implementation of heapster client. Talks with heapster through service proxy.
33+
type InClusterHeapsterClient struct {
34+
client *client.Client
35+
}
36+
37+
func (c InClusterHeapsterClient) Get(path string) *client.Request {
38+
return c.client.Get().Prefix("proxy").
39+
Namespace("kube-system").
40+
Resource("services").
41+
Name("heapster").
42+
Suffix("/api/v1" + path)
43+
}
44+
45+
// Remote heapster client based implementation. Talks with heapster through raw RESTClient.
46+
type RemoteHeapsterClient struct {
47+
client *client.RESTClient
48+
}
49+
50+
func (c RemoteHeapsterClient) Get(path string) *client.Request {
51+
return c.client.Get().Suffix(path)
2852
}
2953

3054
// Creates new Heapster REST client. When heapsterHost param is empty string the function
@@ -33,21 +57,16 @@ type HeapsterClient interface {
3357
func CreateHeapsterRESTClient(heapsterHost string, apiclient *client.Client) (
3458
HeapsterClient, error) {
3559

36-
cfg := client.Config{}
37-
3860
if heapsterHost == "" {
39-
bufferProxyHost := bytes.NewBufferString("http://")
40-
bufferProxyHost.WriteString(apiclient.RESTClient.Get().URL().Host)
41-
cfg.Host = bufferProxyHost.String()
42-
cfg.Prefix = "/api/v1/proxy/namespaces/kube-system/services/heapster/api"
61+
log.Printf("Creating in-cluster Heapster client")
62+
return InClusterHeapsterClient{client: apiclient}, nil
4363
} else {
44-
cfg.Host = heapsterHost
45-
}
46-
log.Printf("Creating Heapster REST client for %s%s", cfg.Host, cfg.Prefix)
47-
clientFactory := new(ClientFactoryImpl)
48-
heapsterClient, err := clientFactory.New(&cfg)
49-
if err != nil {
50-
return nil, err
64+
cfg := &client.Config{Host: heapsterHost}
65+
restClient, err := client.New(cfg)
66+
if err != nil {
67+
return nil, err
68+
}
69+
log.Printf("Creating remote Heapster client for %s", heapsterHost)
70+
return RemoteHeapsterClient{client: restClient.RESTClient}, nil
5171
}
52-
return heapsterClient.RESTClient, nil
5372
}

src/app/backend/replicationcontrollerpodsmetrics.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@ func createMetricPath(namespace string, podNames []string, metricName string) st
8989

9090
// Retrieves raw metrics from Heapster.
9191
func getRawMetrics(heapsterClient HeapsterClient, metricPath string) ([]byte, error) {
92-
93-
resultRaw, err := heapsterClient.Get().Suffix(metricPath).DoRaw()
92+
resultRaw, err := heapsterClient.Get(metricPath).DoRaw()
9493

9594
if err != nil {
9695
return make([]byte, 0), err

0 commit comments

Comments
 (0)