Kubernetes SD: Rename masters to api_servers in config

This commit is contained in:
Jimmi Dyson 2015-10-24 14:41:14 +01:00 committed by Fabian Reinartz
parent 1faf160a5c
commit 6c299c02c3
7 changed files with 53 additions and 51 deletions

View file

@ -655,7 +655,7 @@ func (c *MarathonSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) erro
// KubernetesSDConfig is the configuration for Kubernetes service discovery. // KubernetesSDConfig is the configuration for Kubernetes service discovery.
type KubernetesSDConfig struct { type KubernetesSDConfig struct {
Masters []URL `yaml:"masters"` APIServers []URL `yaml:"api_servers"`
KubeletPort int `yaml:"kubelet_port,omitempty"` KubeletPort int `yaml:"kubelet_port,omitempty"`
InCluster bool `yaml:"in_cluster,omitempty"` InCluster bool `yaml:"in_cluster,omitempty"`
BasicAuth *BasicAuth `yaml:"basic_auth,omitempty"` BasicAuth *BasicAuth `yaml:"basic_auth,omitempty"`
@ -677,8 +677,8 @@ func (c *KubernetesSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) er
if err != nil { if err != nil {
return err return err
} }
if len(c.Masters) == 0 { if len(c.APIServers) == 0 {
return fmt.Errorf("Kubernetes SD configuration requires at least one Kubernetes master") return fmt.Errorf("Kubernetes SD configuration requires at least one Kubernetes API server")
} }
if len(c.BearerToken) > 0 && len(c.BearerTokenFile) > 0 { if len(c.BearerToken) > 0 && len(c.BearerTokenFile) > 0 {
return fmt.Errorf("at most one of bearer_token & bearer_token_file must be configured") return fmt.Errorf("at most one of bearer_token & bearer_token_file must be configured")

View file

@ -203,7 +203,7 @@ var expectedConf = &Config{
KubernetesSDConfigs: []*KubernetesSDConfig{ KubernetesSDConfigs: []*KubernetesSDConfig{
{ {
Masters: []URL{kubernetesSDHostURL()}, APIServers: []URL{kubernetesSDHostURL()},
BasicAuth: &BasicAuth{ BasicAuth: &BasicAuth{
Username: "myusername", Username: "myusername",
Password: "mypassword", Password: "mypassword",

View file

@ -105,7 +105,7 @@ scrape_configs:
- job_name: service-kubernetes - job_name: service-kubernetes
kubernetes_sd_configs: kubernetes_sd_configs:
- masters: - api_servers:
- 'https://localhost:1234' - 'https://localhost:1234'
basic_auth: basic_auth:

View file

@ -2,7 +2,7 @@ scrape_configs:
- job_name: prometheus - job_name: prometheus
kubernetes_sd_configs: kubernetes_sd_configs:
- masters: - api_servers:
- 'https://localhost:1234' - 'https://localhost:1234'
bearer_token: 1234 bearer_token: 1234

View file

@ -2,7 +2,7 @@ scrape_configs:
- job_name: prometheus - job_name: prometheus
kubernetes_sd_configs: kubernetes_sd_configs:
- masters: - api_servers:
- 'https://localhost:1234' - 'https://localhost:1234'
bearer_token: 1234 bearer_token: 1234

View file

@ -1,5 +1,5 @@
# A scrape configuration for running Prometheus on a Kubernetes cluster. # A scrape configuration for running Prometheus on a Kubernetes cluster.
# This uses separate scrape configs for cluster components (i.e. master, node) # This uses separate scrape configs for cluster components (i.e. API server, node)
# and services to allow each to use different authentication configs. # and services to allow each to use different authentication configs.
# #
# Kubernetes labels will be added as Prometheus labels on metrics via the # Kubernetes labels will be added as Prometheus labels on metrics via the
@ -18,14 +18,14 @@ scrape_configs:
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs: kubernetes_sd_configs:
- masters: - api_servers:
- 'https://kubernetes.default.svc' - 'https://kubernetes.default.svc'
in_cluster: true in_cluster: true
relabel_configs: relabel_configs:
- source_labels: [__meta_kubernetes_role] - source_labels: [__meta_kubernetes_role]
action: keep action: keep
regex: ^(?:master|node)$ regex: ^(?:apiserver|node)$
- action: labelmap - action: labelmap
regex: ^__meta_kubernetes_node_label_(.+)$ regex: ^__meta_kubernetes_node_label_(.+)$
replacement: $1 replacement: $1
@ -49,7 +49,7 @@ scrape_configs:
- job_name: 'kubernetes-services' - job_name: 'kubernetes-services'
kubernetes_sd_configs: kubernetes_sd_configs:
- masters: - api_servers:
- 'https://kubernetes.default.svc' - 'https://kubernetes.default.svc'
in_cluster: true in_cluster: true

View file

@ -49,8 +49,8 @@ const (
serviceAnnotationPrefix = metaLabelPrefix + "service_annotation_" serviceAnnotationPrefix = metaLabelPrefix + "service_annotation_"
// nodesTargetGroupName is the name given to the target group for nodes. // nodesTargetGroupName is the name given to the target group for nodes.
nodesTargetGroupName = "nodes" nodesTargetGroupName = "nodes"
// mastersTargetGroupName is the name given to the target group for masters. // apiServersTargetGroupName is the name given to the target group for API servers.
mastersTargetGroupName = "masters" apiServersTargetGroupName = "apiServers"
// roleLabel is the name for the label containing a target's role. // roleLabel is the name for the label containing a target's role.
roleLabel = metaLabelPrefix + "role" roleLabel = metaLabelPrefix + "role"
@ -70,8 +70,8 @@ type Discovery struct {
client *http.Client client *http.Client
Conf *config.KubernetesSDConfig Conf *config.KubernetesSDConfig
masters []config.URL apiServers []config.URL
mastersMu sync.RWMutex apiServersMu sync.RWMutex
nodesResourceVersion string nodesResourceVersion string
servicesResourceVersion string servicesResourceVersion string
endpointsResourceVersion string endpointsResourceVersion string
@ -90,7 +90,7 @@ func (kd *Discovery) Initialize() error {
return err return err
} }
kd.masters = kd.Conf.Masters kd.apiServers = kd.Conf.APIServers
kd.client = client kd.client = client
kd.nodes = map[string]*Node{} kd.nodes = map[string]*Node{}
kd.services = map[string]map[string]*Service{} kd.services = map[string]map[string]*Service{}
@ -101,12 +101,12 @@ func (kd *Discovery) Initialize() error {
// Sources implements the TargetProvider interface. // Sources implements the TargetProvider interface.
func (kd *Discovery) Sources() []string { func (kd *Discovery) Sources() []string {
sourceNames := make([]string, 0, len(kd.masters)) sourceNames := make([]string, 0, len(kd.apiServers))
for _, master := range kd.masters { for _, apiServer := range kd.apiServers {
sourceNames = append(sourceNames, mastersTargetGroupName+":"+master.Host) sourceNames = append(sourceNames, apiServersTargetGroupName+":"+apiServer.Host)
} }
res, err := kd.queryMasterPath(nodesURL) res, err := kd.queryAPIServerPath(nodesURL)
if err != nil { if err != nil {
// If we can't list nodes then we can't watch them. Assume this is a misconfiguration // If we can't list nodes then we can't watch them. Assume this is a misconfiguration
// & log & return empty. // & log & return empty.
@ -135,7 +135,7 @@ func (kd *Discovery) Sources() []string {
kd.nodes[node.ObjectMeta.Name] = &nodes.Items[idx] kd.nodes[node.ObjectMeta.Name] = &nodes.Items[idx]
} }
res, err = kd.queryMasterPath(servicesURL) res, err = kd.queryAPIServerPath(servicesURL)
if err != nil { if err != nil {
// If we can't list services then we can't watch them. Assume this is a misconfiguration // If we can't list services then we can't watch them. Assume this is a misconfiguration
// & log & return empty. // & log & return empty.
@ -174,7 +174,7 @@ func (kd *Discovery) Sources() []string {
func (kd *Discovery) Run(ch chan<- config.TargetGroup, done <-chan struct{}) { func (kd *Discovery) Run(ch chan<- config.TargetGroup, done <-chan struct{}) {
defer close(ch) defer close(ch)
if tg := kd.updateMastersTargetGroup(); tg != nil { if tg := kd.updateAPIServersTargetGroup(); tg != nil {
select { select {
case ch <- *tg: case ch <- *tg:
case <-done: case <-done:
@ -243,61 +243,63 @@ func (kd *Discovery) Run(ch chan<- config.TargetGroup, done <-chan struct{}) {
} }
} }
func (kd *Discovery) queryMasterPath(path string) (*http.Response, error) { func (kd *Discovery) queryAPIServerPath(path string) (*http.Response, error) {
req, err := http.NewRequest("GET", path, nil) req, err := http.NewRequest("GET", path, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return kd.queryMasterReq(req) return kd.queryAPIServerReq(req)
} }
func (kd *Discovery) queryMasterReq(req *http.Request) (*http.Response, error) { func (kd *Discovery) queryAPIServerReq(req *http.Request) (*http.Response, error) {
// Lock in case we need to rotate masters to request. // Lock in case we need to rotate API servers to request.
kd.mastersMu.Lock() kd.apiServersMu.Lock()
defer kd.mastersMu.Unlock() defer kd.apiServersMu.Unlock()
for i := 0; i < len(kd.masters); i++ { var lastErr error
for i := 0; i < len(kd.apiServers); i++ {
cloneReq := *req cloneReq := *req
cloneReq.URL.Host = kd.masters[0].Host cloneReq.URL.Host = kd.apiServers[0].Host
cloneReq.URL.Scheme = kd.masters[0].Scheme cloneReq.URL.Scheme = kd.apiServers[0].Scheme
res, err := kd.client.Do(&cloneReq) res, err := kd.client.Do(&cloneReq)
if err == nil { if err == nil {
return res, nil return res, nil
} }
kd.rotateMasters() lastErr = err
kd.rotateAPIServers()
} }
return nil, fmt.Errorf("Unable to query any masters") return nil, fmt.Errorf("Unable to query any API servers: %v", lastErr)
} }
func (kd *Discovery) rotateMasters() { func (kd *Discovery) rotateAPIServers() {
if len(kd.masters) > 1 { if len(kd.apiServers) > 1 {
kd.masters = append(kd.masters[1:], kd.masters[0]) kd.apiServers = append(kd.apiServers[1:], kd.apiServers[0])
} }
} }
func (kd *Discovery) updateMastersTargetGroup() *config.TargetGroup { func (kd *Discovery) updateAPIServersTargetGroup() *config.TargetGroup {
tg := &config.TargetGroup{ tg := &config.TargetGroup{
Source: mastersTargetGroupName, Source: apiServersTargetGroupName,
Labels: model.LabelSet{ Labels: model.LabelSet{
roleLabel: model.LabelValue("master"), roleLabel: model.LabelValue("apiserver"),
}, },
} }
for _, master := range kd.masters { for _, apiServer := range kd.apiServers {
masterAddress := master.Host apiServerAddress := apiServer.Host
_, _, err := net.SplitHostPort(masterAddress) _, _, err := net.SplitHostPort(apiServerAddress)
// If error then no port is specified - use default for scheme. // If error then no port is specified - use default for scheme.
if err != nil { if err != nil {
switch master.Scheme { switch apiServer.Scheme {
case "http": case "http":
masterAddress = net.JoinHostPort(masterAddress, "80") apiServerAddress = net.JoinHostPort(apiServerAddress, "80")
case "https": case "https":
masterAddress = net.JoinHostPort(masterAddress, "443") apiServerAddress = net.JoinHostPort(apiServerAddress, "443")
} }
} }
t := model.LabelSet{ t := model.LabelSet{
model.AddressLabel: model.LabelValue(masterAddress), model.AddressLabel: model.LabelValue(apiServerAddress),
model.SchemeLabel: model.LabelValue(master.Scheme), model.SchemeLabel: model.LabelValue(apiServer.Scheme),
} }
tg.Targets = append(tg.Targets, t) tg.Targets = append(tg.Targets, t)
} }
@ -360,7 +362,7 @@ func (kd *Discovery) watchNodes(events chan interface{}, done <-chan struct{}, r
values.Add("watch", "true") values.Add("watch", "true")
values.Add("resourceVersion", kd.nodesResourceVersion) values.Add("resourceVersion", kd.nodesResourceVersion)
req.URL.RawQuery = values.Encode() req.URL.RawQuery = values.Encode()
res, err := kd.queryMasterReq(req) res, err := kd.queryAPIServerReq(req)
if err != nil { if err != nil {
log.Errorf("Failed to watch nodes: %s", err) log.Errorf("Failed to watch nodes: %s", err)
return return
@ -402,7 +404,7 @@ func (kd *Discovery) watchServices(events chan interface{}, done <-chan struct{}
values.Add("resourceVersion", kd.servicesResourceVersion) values.Add("resourceVersion", kd.servicesResourceVersion)
req.URL.RawQuery = values.Encode() req.URL.RawQuery = values.Encode()
res, err := kd.queryMasterReq(req) res, err := kd.queryAPIServerReq(req)
if err != nil { if err != nil {
log.Errorf("Failed to watch services: %s", err) log.Errorf("Failed to watch services: %s", err)
return return
@ -473,7 +475,7 @@ func (kd *Discovery) addService(service *Service) *config.TargetGroup {
namespace[service.ObjectMeta.Name] = service namespace[service.ObjectMeta.Name] = service
endpointURL := fmt.Sprintf(serviceEndpointsURL, service.ObjectMeta.Namespace, service.ObjectMeta.Name) endpointURL := fmt.Sprintf(serviceEndpointsURL, service.ObjectMeta.Namespace, service.ObjectMeta.Name)
res, err := kd.queryMasterPath(endpointURL) res, err := kd.queryAPIServerPath(endpointURL)
if err != nil { if err != nil {
log.Errorf("Error getting service endpoints: %s", err) log.Errorf("Error getting service endpoints: %s", err)
return nil return nil
@ -546,7 +548,7 @@ func (kd *Discovery) watchServiceEndpoints(events chan interface{}, done <-chan
values.Add("resourceVersion", kd.servicesResourceVersion) values.Add("resourceVersion", kd.servicesResourceVersion)
req.URL.RawQuery = values.Encode() req.URL.RawQuery = values.Encode()
res, err := kd.queryMasterReq(req) res, err := kd.queryAPIServerReq(req)
if err != nil { if err != nil {
log.Errorf("Failed to watch service endpoints: %s", err) log.Errorf("Failed to watch service endpoints: %s", err)
return return