kubernetes+prometheus自動伸縮の設計と実現(三)
9959 ワード
まだ最後のものが残っていますが、クエリーのインタフェースで、prometheus転送の場所を提供しています.最初のblogでは、カスタム指標収集器によるcustom-metricsインタフェースの呼び出しについて説明しました.このインタフェースの実装を見てみると、まずk 8 sに基づく孵化プロジェクトであるgithubが必要である.com/kubernetes-incubator/custom-metrics-apiserver彼はカスタムサービスインタフェースを提供しています.私たちは自分で実現すればいいです.もちろん、他の監視も自分で実現すればいいです.まず、このプロジェクトがサービスの登録インタフェースのgithubを起動したら見てみましょう.com/kubernetes-incubator/custom-metrics-apiserver/pkg/apiserver/apiserver.go,
InstallCustomMetricsAPIでgithubを登録する.com/kubernetes-incubator/custom-metrics-apiserver/pkg/apiserver/cmapis.go,
k 8 s apiの登録に詳しい人は、k 8 s apiの登録と同じようによく知っているに違いありません.上のcustom_metrics.GroupNameはcustom-metricsです.metrics.k8s.io,okはapiについて登録すれば,私のポイントではなく,ここで省略する.ポイントはデータ変換のインタフェースgithubです.com/kubernetes-incubator/custom-metrics-apiserver/pkg/provider/interfaces.go
私たちが書くprometheusのproviderももちろん、これらの指標クエリーのインタフェースを実現します.次に具体的なコードを見て、namespaceの下で指標名とlabelのインタフェースを例に挙げます.
これが具体的なインタフェースの実現であり、getMultipleは以下のpkg/custom-provider/providerを具体的に実現する.go
具体的なクエリーはprometheusを呼び出すクエリーapiにほかならない
パッケージデータコードは次のとおりです.
k 8 sに組み立てるのですio/metrics/pkg/apis/custom_metrics/types.go以下で定義するMetricValue List
func (c completedConfig) New(cmProvider provider.CustomMetricsProvider) (*CustomMetricsAdapterServer, error) {
genericServer, err := c.Config.GenericConfig.SkipComplete().New(genericapiserver.EmptyDelegate) // completion is done in Complete, no need for a second time
if err != nil {
return nil, err
}
s := &CustomMetricsAdapterServer{
GenericAPIServer: genericServer,
Provider: cmProvider,
}
if err := s.InstallCustomMetricsAPI(); err != nil {
return nil, err
}
return s, nil
}
InstallCustomMetricsAPIでgithubを登録する.com/kubernetes-incubator/custom-metrics-apiserver/pkg/apiserver/cmapis.go,
groupMeta := registry.GroupOrDie(custom_metrics.GroupName)
...
cmAPI := s.cmAPI(groupMeta, &groupMeta.GroupVersion)
if err := cmAPI.InstallREST(s.GenericAPIServer.Handler.GoRestfulContainer); err != nil {
return err
}
k 8 s apiの登録に詳しい人は、k 8 s apiの登録と同じようによく知っているに違いありません.上のcustom_metrics.GroupNameはcustom-metricsです.metrics.k8s.io,okはapiについて登録すれば,私のポイントではなく,ここで省略する.ポイントはデータ変換のインタフェースgithubです.com/kubernetes-incubator/custom-metrics-apiserver/pkg/provider/interfaces.go
type CustomMetricsProvider interface {
// root
GetRootScopedMetricByName(groupResource schema.GroupResource, name string, metricName string) (*custom_metrics.MetricValue, error)
// root label
GetRootScopedMetricBySelector(groupResource schema.GroupResource, selector labels.Selector, metricName string) (*custom_metrics.MetricValueList, error)
// namespace
GetNamespacedMetricByName(groupResource schema.GroupResource, namespace string, name string, metricName string) (*custom_metrics.MetricValue, error)
// namespace label
GetNamespacedMetricBySelector(groupResource schema.GroupResource, namespace string, selector labels.Selector, metricName string) (*custom_metrics.MetricValueList, error)
//
ListAllMetrics() []MetricInfo
}
私たちが書くprometheusのproviderももちろん、これらの指標クエリーのインタフェースを実現します.次に具体的なコードを見て、namespaceの下で指標名とlabelのインタフェースを例に挙げます.
func (p *prometheusProvider) GetNamespacedMetricBySelector(groupResource schema.GroupResource, namespace string, selector labels.Selector, metricName string) (*custom_metrics.MetricValueList, error) {
info := provider.MetricInfo{
GroupResource: groupResource,
Metric: metricName,
Namespaced: true,
}
return p.getMultiple(info, namespace, selector)
}
これが具体的なインタフェースの実現であり、getMultipleは以下のpkg/custom-provider/providerを具体的に実現する.go
//
queryResults, err := p.buildQuery(info, namespace, resourceNames...)
//
p.metricsFor(queryResults, info, matchingObjectsRaw)
具体的なクエリーはprometheusを呼び出すクエリーapiにほかならない
queryResults, err := p.promClient.Query(context.Background(), pmodel.Now(), fullQuery)
パッケージデータコードは次のとおりです.
err := apimeta.EachListItem(list, func(item runtime.Object) error {
objUnstructured := item.(*unstructured.Unstructured)
objName := objUnstructured.GetName()
if _, found := values[objName]; !found {
return nil
}
value, err := p.metricFor(values[objName], info.GroupResource, objUnstructured.GetNamespace(), objName, info.Metric)
if err != nil {
return err
}
res = append(res, *value)
return nil
})
if err != nil {
return nil, err
}
return &custom_metrics.MetricValueList{
Items: res,
}, nil
k 8 sに組み立てるのですio/metrics/pkg/apis/custom_metrics/types.go以下で定義するMetricValue List
type MetricValueList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []MetricValue `json:"items"`
}
type MetricValue struct {
metav1.TypeMeta `json:",inline"`
DescribedObject api.ObjectReference `json:"describedObject"`
//
MetricName string `json:"metricName"`
//
Timestamp metav1.Time `json:"timestamp"`
//
WindowSeconds *int64 `json:"window,omitempty"`
//
Value resource.Quantity `json:"value"`
}