diff --git a/k8s/crds/kops.k8s.io_clusters.yaml b/k8s/crds/kops.k8s.io_clusters.yaml index 6ef2bed599..b65ac13cf4 100644 --- a/k8s/crds/kops.k8s.io_clusters.yaml +++ b/k8s/crds/kops.k8s.io_clusters.yaml @@ -1265,6 +1265,13 @@ spec: image: description: Image is the etcd manager image to use. type: string + listenMetricsURLs: + description: ListenMetricsURLs is the list of URLs to listen + on that will respond to both the /metrics and /health + endpoints + items: + type: string + type: array logLevel: description: LogLevel allows the klog library verbose log level to be set for etcd-manager. The default is 6. https://github.com/google/glog#verbose-logging diff --git a/pkg/apis/kops/cluster.go b/pkg/apis/kops/cluster.go index 450d93457e..f517e08dfa 100644 --- a/pkg/apis/kops/cluster.go +++ b/pkg/apis/kops/cluster.go @@ -680,6 +680,8 @@ type EtcdManagerSpec struct { BackupRetentionDays *uint32 `json:"backupRetentionDays,omitempty"` // DiscoveryPollInterval which is used for discovering other cluster members. The default is 60 seconds. DiscoveryPollInterval *metav1.Duration `json:"discoveryPollInterval,omitempty"` + // ListenMetricsURLs is the list of URLs to listen on that will respond to both the /metrics and /health endpoints + ListenMetricsURLs []string `json:"listenMetricsURLs,omitempty"` // LogLevel allows the klog library verbose log level to be set for etcd-manager. The default is 6. // https://github.com/google/glog#verbose-logging LogLevel *int32 `json:"logLevel,omitempty"` diff --git a/pkg/apis/kops/v1alpha2/cluster.go b/pkg/apis/kops/v1alpha2/cluster.go index ac37cbf89e..c4ae1b51bc 100644 --- a/pkg/apis/kops/v1alpha2/cluster.go +++ b/pkg/apis/kops/v1alpha2/cluster.go @@ -676,6 +676,8 @@ type EtcdManagerSpec struct { BackupRetentionDays *uint32 `json:"backupRetentionDays,omitempty"` // DiscoveryPollInterval which is used for discovering other cluster members. The default is 60 seconds. DiscoveryPollInterval *metav1.Duration `json:"discoveryPollInterval,omitempty"` + // ListenMetricsURLs is the list of URLs to listen on that will respond to both the /metrics and /health endpoints + ListenMetricsURLs []string `json:"listenMetricsURLs,omitempty"` // LogLevel allows the klog library verbose log level to be set for etcd-manager. The default is 6. // https://github.com/google/glog#verbose-logging LogLevel *int32 `json:"logLevel,omitempty"` diff --git a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go index 5c1ab15e0e..81adb46a2f 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go @@ -3586,6 +3586,7 @@ func autoConvert_v1alpha2_EtcdManagerSpec_To_kops_EtcdManagerSpec(in *EtcdManage out.BackupInterval = in.BackupInterval out.BackupRetentionDays = in.BackupRetentionDays out.DiscoveryPollInterval = in.DiscoveryPollInterval + out.ListenMetricsURLs = in.ListenMetricsURLs out.LogLevel = in.LogLevel return nil } @@ -3611,6 +3612,7 @@ func autoConvert_kops_EtcdManagerSpec_To_v1alpha2_EtcdManagerSpec(in *kops.EtcdM out.BackupInterval = in.BackupInterval out.BackupRetentionDays = in.BackupRetentionDays out.DiscoveryPollInterval = in.DiscoveryPollInterval + out.ListenMetricsURLs = in.ListenMetricsURLs out.LogLevel = in.LogLevel return nil } diff --git a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go index b5af7cac15..ea34131979 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go @@ -1912,6 +1912,11 @@ func (in *EtcdManagerSpec) DeepCopyInto(out *EtcdManagerSpec) { *out = new(v1.Duration) **out = **in } + if in.ListenMetricsURLs != nil { + in, out := &in.ListenMetricsURLs, &out.ListenMetricsURLs + *out = make([]string, len(*in)) + copy(*out, *in) + } if in.LogLevel != nil { in, out := &in.LogLevel, &out.LogLevel *out = new(int32) diff --git a/pkg/apis/kops/v1alpha3/cluster.go b/pkg/apis/kops/v1alpha3/cluster.go index 3de7374bee..166f0fbd3f 100644 --- a/pkg/apis/kops/v1alpha3/cluster.go +++ b/pkg/apis/kops/v1alpha3/cluster.go @@ -637,6 +637,8 @@ type EtcdManagerSpec struct { BackupRetentionDays *uint32 `json:"backupRetentionDays,omitempty"` // DiscoveryPollInterval which is used for discovering other cluster members. The default is 60 seconds. DiscoveryPollInterval *metav1.Duration `json:"discoveryPollInterval,omitempty"` + // ListenMetricsURLs is the list of URLs to listen on that will respond to both the /metrics and /health endpoints + ListenMetricsURLs []string `json:"listenMetricsURLs,omitempty"` // LogLevel allows the klog library verbose log level to be set for etcd-manager. The default is 6. // https://github.com/google/glog#verbose-logging LogLevel *int32 `json:"logLevel,omitempty"` diff --git a/pkg/apis/kops/v1alpha3/zz_generated.conversion.go b/pkg/apis/kops/v1alpha3/zz_generated.conversion.go index 7d85f8166b..a2795b5bbe 100644 --- a/pkg/apis/kops/v1alpha3/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha3/zz_generated.conversion.go @@ -3813,6 +3813,7 @@ func autoConvert_v1alpha3_EtcdManagerSpec_To_kops_EtcdManagerSpec(in *EtcdManage out.BackupInterval = in.BackupInterval out.BackupRetentionDays = in.BackupRetentionDays out.DiscoveryPollInterval = in.DiscoveryPollInterval + out.ListenMetricsURLs = in.ListenMetricsURLs out.LogLevel = in.LogLevel return nil } @@ -3838,6 +3839,7 @@ func autoConvert_kops_EtcdManagerSpec_To_v1alpha3_EtcdManagerSpec(in *kops.EtcdM out.BackupInterval = in.BackupInterval out.BackupRetentionDays = in.BackupRetentionDays out.DiscoveryPollInterval = in.DiscoveryPollInterval + out.ListenMetricsURLs = in.ListenMetricsURLs out.LogLevel = in.LogLevel return nil } diff --git a/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go index 48fdd1e137..3419a6635c 100644 --- a/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go @@ -1802,6 +1802,11 @@ func (in *EtcdManagerSpec) DeepCopyInto(out *EtcdManagerSpec) { *out = new(v1.Duration) **out = **in } + if in.ListenMetricsURLs != nil { + in, out := &in.ListenMetricsURLs, &out.ListenMetricsURLs + *out = make([]string, len(*in)) + copy(*out, *in) + } if in.LogLevel != nil { in, out := &in.LogLevel, &out.LogLevel *out = new(int32) diff --git a/pkg/apis/kops/zz_generated.deepcopy.go b/pkg/apis/kops/zz_generated.deepcopy.go index 4fc34e60d7..77b0d9b2bf 100644 --- a/pkg/apis/kops/zz_generated.deepcopy.go +++ b/pkg/apis/kops/zz_generated.deepcopy.go @@ -1949,6 +1949,11 @@ func (in *EtcdManagerSpec) DeepCopyInto(out *EtcdManagerSpec) { *out = new(v1.Duration) **out = **in } + if in.ListenMetricsURLs != nil { + in, out := &in.ListenMetricsURLs, &out.ListenMetricsURLs + *out = make([]string, len(*in)) + copy(*out, *in) + } if in.LogLevel != nil { in, out := &in.LogLevel, &out.LogLevel *out = new(int32) diff --git a/pkg/model/components/etcdmanager/model.go b/pkg/model/components/etcdmanager/model.go index 3101254319..c37d58d287 100644 --- a/pkg/model/components/etcdmanager/model.go +++ b/pkg/model/components/etcdmanager/model.go @@ -541,6 +541,15 @@ func (b *EtcdManagerBuilder) buildPod(etcdCluster kops.EtcdClusterSpec, instance container.Env = append(container.Env, envVar) } + if len(etcdCluster.Manager.ListenMetricsURLs) > 0 { + envVar := v1.EnvVar{ + Name: "ETCD_LISTEN_METRICS_URLS", + Value: strings.Join(etcdCluster.Manager.ListenMetricsURLs, ","), + } + + container.Env = append(container.Env, envVar) + } + for _, envVar := range etcdCluster.Manager.Env { klog.V(2).Infof("overloading ENV var in manifest %s with %s=%s", bundle, envVar.Name, envVar.Value) configOverwrite := v1.EnvVar{