Skip to content

Commit

Permalink
Modify inappropriate places in the code by github Comment
Browse files Browse the repository at this point in the history
Signed-off-by: 晓杰 <[email protected]>
  • Loading branch information
xiao-jay committed Dec 29, 2022
1 parent b075eac commit 9197106
Show file tree
Hide file tree
Showing 11 changed files with 70 additions and 149 deletions.
77 changes: 0 additions & 77 deletions .github/workflows/controller_test.yaml

This file was deleted.

2 changes: 1 addition & 1 deletion controllers/metering/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

# Image URL to use all building/pushing image targets
IMG ?= ghcr.io/xiao-jay/sealos-metering-controller:dev
IMG ?= ghcr.io/labring/sealos-metering-controller:dev
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
ENVTEST_K8S_VERSION = 1.23

Expand Down
2 changes: 1 addition & 1 deletion controllers/metering/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ ESSD云盘20GiBPL1 0.042/小时

## **一、背景**

sealos cloud是一个多租户的,以k8s为内核的云操作系统,传统的资源隔离级别是虚拟机,而sealos cloud的资源隔离级别是namespace,每个用户都至少有一个自己的namespace用来使用,这样就给怎么计费带来挑战。怎么样计费k8s中 用户使用的cpu、memory等资源?怎么样计费流量等 metering 不可见的资源。
sealos cloud 是一个多租户的,以 k8s 为内核的云操作系统,每个用户都至少有一个自己的 namespace 用来使用,这样就给怎么计费带来挑战。怎么样计费 k8s 中 用户使用的 cpu、memory 等资源?怎么样计费流量等 Metering 不可见的资源。

## 二、需求

Expand Down
10 changes: 10 additions & 0 deletions controllers/metering/api/v1/common_type.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package v1

const (
ExtensionResourcePricePrefix = "extensionresourceprice-"
MeteringPrefix = "metering-"
ResourceQuotaPrefix = "quota-"
METERINGNAMESPACEENV = "METERING_SYSTEM_NAMESPACE"
DEFAULTMETERINGNAMESPACE = "metering-system"
PodResourcePricePrefix = "sealos-pod-controller"
)
4 changes: 0 additions & 4 deletions controllers/metering/api/v1/extensionresourceprice_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

const (
ExtensionResourcePricePrefix = "extensionresourceprice-"
)

// ExtensionResourcePriceSpec defines the desired state of ExtensionResourcePrice
type ExtensionResourcePriceSpec struct {
ResourceName string `json:"resourceName,omitempty"`
Expand Down
8 changes: 4 additions & 4 deletions controllers/metering/api/v1/metering_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,14 @@ func init() {
func DefaultResourceQuota() corev1.ResourceList {
return corev1.ResourceList{
//corev1.ResourceRequestsCPU: resource.MustParse("100"),
corev1.ResourceLimitsCPU: resource.MustParse("10000"),
corev1.ResourceLimitsCPU: resource.MustParse("16"),
//corev1.ResourceRequestsMemory: resource.MustParse("100"),
corev1.ResourceLimitsMemory: resource.MustParse("10000Gi"),
corev1.ResourceLimitsMemory: resource.MustParse("64Gi"),
//For all PVCs, the total demand for storage resources cannot exceed this value
corev1.ResourceRequestsStorage: resource.MustParse("100000Gi"),
corev1.ResourceRequestsStorage: resource.MustParse("100Gi"),
//"limit.storage": resource.MustParse("100Gi"),
//Local ephemeral storage
corev1.ResourceLimitsEphemeralStorage: resource.MustParse("100000Gi"),
corev1.ResourceLimitsEphemeralStorage: resource.MustParse("100Gi"),
//corev1.ResourceRequestsEphemeralStorage: resource.MustParse("100Gi"),
}
}
2 changes: 1 addition & 1 deletion controllers/metering/config/manager/kustomization.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
- name: controller
newName: ghcr.io/xiao-jay/sealos-metering-controller
newName: ghcr.io/labring/sealos-metering-controller
newTag: dev
51 changes: 26 additions & 25 deletions controllers/metering/controllers/metering_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
MeteringPrefix = "metering-"
ResourceQuotaPrefix = "quota-"
METERINGNAMESPACEENV = "METERING_SYSTEM_NAMESPACE"
DEFAULTMETERINGNAMESPACE = "metering-system"
)

// MeteringReconcile reconciles a Metering object
type MeteringReconcile struct {
client.Client
Expand Down Expand Up @@ -81,7 +74,7 @@ func (r *MeteringReconcile) Reconcile(ctx context.Context, req ctrl.Request) (ct
if _, ok := ns.Annotations[userv1.UserAnnotationOwnerKey]; ok {
if ns.DeletionTimestamp != nil {
r.Logger.Info("namespace is deleting,want to delete metering", "namespace", ns.Name)
err := r.DelMetering(ctx, MeteringPrefix+ns.Name, r.MeteringSystemNameSpace)
err := r.DelMetering(ctx, meteringv1.MeteringPrefix+ns.Name, r.MeteringSystemNameSpace)
return ctrl.Result{}, err
}
if err := r.initMetering(ctx, ns); err != nil {
Expand Down Expand Up @@ -129,8 +122,8 @@ func (r *MeteringReconcile) Reconcile(ctx context.Context, req ctrl.Request) (ct
r.Logger.Info("enter update resource used", "resource name: ", req.Name, "resource namespace: ", req.Namespace)
var metering meteringv1.Metering
for resourceName, resourceInfo := range resources.Spec.Resources {
if err := r.Get(ctx, types.NamespacedName{Namespace: r.MeteringSystemNameSpace, Name: MeteringPrefix + resourceInfo.NameSpace}, &metering); err != nil {
r.Logger.Error(err, "get metering failed", "name", MeteringPrefix+resourceInfo.NameSpace)
if err := r.Get(ctx, types.NamespacedName{Namespace: r.MeteringSystemNameSpace, Name: meteringv1.MeteringPrefix + resourceInfo.NameSpace}, &metering); err != nil {
r.Logger.Error(err, "get metering failed", "name", meteringv1.MeteringPrefix+resourceInfo.NameSpace)
continue
}
if _, ok := metering.Spec.Resources[resourceName]; !ok {
Expand Down Expand Up @@ -167,6 +160,10 @@ func (r *MeteringReconcile) Reconcile(ctx context.Context, req ctrl.Request) (ct
return ctrl.Result{}, err
}

if err := r.clearResourceUsed(ctx, &metering); err != nil {
return ctrl.Result{}, err
}

if err := r.syncAccountBalance(ctx, metering.Spec.Owner, totalAccount, metering.Status.SeqID); err != nil {
r.Logger.Error(err, err.Error())
return ctrl.Result{}, fmt.Errorf("meteringName:%v,amount:%v,err:%v", metering.Name, totalAccount, err)
Expand Down Expand Up @@ -209,15 +206,6 @@ func (r *MeteringReconcile) CalculateCost(ctx context.Context, metering *meterin
}
totalAmount += float64(infraAmount)
r.Logger.Info(fmt.Sprintf("meteringNmae %v,resourceMsg: %+v", metering.Name, resourceMsgs), "totalAmount", totalAmount)
if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, metering, func() error {
for _, v := range metering.Spec.Resources {
used := resource.MustParse(v.Used.String())
v.Used.Sub(used)
}
return nil
}); err != nil {
return 0, err
}
return int64(totalAmount), nil
}

Expand Down Expand Up @@ -245,6 +233,19 @@ func (r *MeteringReconcile) calculateInfraCost(ctx context.Context, metering *me
return amount, nil
}

func (r *MeteringReconcile) clearResourceUsed(ctx context.Context, metering *meteringv1.Metering) error {
if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, metering, func() error {
for _, v := range metering.Spec.Resources {
used := resource.MustParse(v.Used.String())
v.Used.Sub(used)
}
return nil
}); err != nil {
return err
}
return nil
}

func (r *MeteringReconcile) updateBillingList(ctx context.Context, amount int64, metering *meteringv1.Metering) error {
//r.Logger.Info("enter metering updateBillingList", "metering name: ", metering.Name, "metering namespace: ", metering.Namespace, "lastupdat Time", metering.Status.LatestUpdateTime)
if err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
Expand Down Expand Up @@ -295,7 +296,7 @@ func (r *MeteringReconcile) initMetering(ctx context.Context, ns corev1.Namespac
func (r *MeteringReconcile) syncMetering(ctx context.Context, ns corev1.Namespace, resourcePrice map[corev1.ResourceName]meteringv1.ResourcePriceAndUsed) error {
metering := meteringv1.Metering{
ObjectMeta: metav1.ObjectMeta{
Name: MeteringPrefix + ns.Name,
Name: meteringv1.MeteringPrefix + ns.Name,
Namespace: r.MeteringSystemNameSpace,
},
}
Expand Down Expand Up @@ -323,7 +324,7 @@ func (r *MeteringReconcile) syncMetering(ctx context.Context, ns corev1.Namespac
func (r *MeteringReconcile) syncResourceQuota(ctx context.Context, metering meteringv1.Metering) error {
quota := &corev1.ResourceQuota{
ObjectMeta: metav1.ObjectMeta{
Name: ResourceQuotaPrefix + metering.Spec.Namespace,
Name: meteringv1.ResourceQuotaPrefix + metering.Spec.Namespace,
Namespace: metering.Spec.Namespace,
},
}
Expand Down Expand Up @@ -398,9 +399,9 @@ func (r *MeteringReconcile) SetupWithManager(mgr ctrl.Manager) error {
r.Logger.V(1).Info("reconcile controller metering")

// get env METERING_SYSTEM_NAMESPACE and METERING_INTERVAL
r.MeteringSystemNameSpace = os.Getenv(METERINGNAMESPACEENV)
if os.Getenv(METERINGNAMESPACEENV) == "" {
r.MeteringSystemNameSpace = DEFAULTMETERINGNAMESPACE
r.MeteringSystemNameSpace = os.Getenv(meteringv1.METERINGNAMESPACEENV)
if os.Getenv(meteringv1.METERINGNAMESPACEENV) == "" {
r.MeteringSystemNameSpace = meteringv1.DEFAULTMETERINGNAMESPACE
}

timeInterval := os.Getenv("METERING_INTERVAL")
Expand All @@ -412,7 +413,7 @@ func (r *MeteringReconcile) SetupWithManager(mgr ctrl.Manager) error {
if r.MeteringInterval == 0 {
r.MeteringInterval = DefaultIntervalInt()
}
r.Logger.Info("metering env", METERINGNAMESPACEENV, r.MeteringSystemNameSpace, "timeinterval:", r.MeteringInterval, "envtimeinterval", os.Getenv("METERING_INTERVAL"))
r.Logger.Info("metering env", meteringv1.METERINGNAMESPACEENV, r.MeteringSystemNameSpace, "timeinterval:", r.MeteringInterval, "envtimeinterval", os.Getenv("METERING_INTERVAL"))
return ctrl.NewControllerManagedBy(mgr).
For(&meteringv1.Metering{}).
Watches(&source.Kind{Type: &corev1.Namespace{}}, &handler.EnqueueRequestForObject{}).
Expand Down
18 changes: 7 additions & 11 deletions controllers/metering/controllers/podresource_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
PodResourcePricePrefix = "sealos-pod-controller"
)

// PodResourceReconciler reconciles a PodResource object
type PodResourceReconciler struct {
client.Client
Expand Down Expand Up @@ -84,7 +80,7 @@ func (r *PodResourceReconciler) CreateOrUpdateExtensionResourcesPrice(ctx contex
extensionResourcesPrice := &meteringv1.ExtensionResourcePrice{
ObjectMeta: metav1.ObjectMeta{
Namespace: r.MeteringSystemNameSpace,
Name: meteringv1.ExtensionResourcePricePrefix + PodResourcePricePrefix,
Name: meteringv1.ExtensionResourcePricePrefix + meteringv1.PodResourcePricePrefix,
},
}

Expand Down Expand Up @@ -128,7 +124,7 @@ func (r *PodResourceReconciler) UpdateResourceUsed(ctx context.Context, obj clie

// storage resource not in pod container, so need to get it from resource quota
resourceQuota := v1.ResourceQuota{}
if err := r.Get(ctx, client.ObjectKey{Name: ResourceQuotaPrefix + pod.Namespace, Namespace: pod.Namespace}, &resourceQuota); err != nil {
if err := r.Get(ctx, client.ObjectKey{Name: meteringv1.ResourceQuotaPrefix + pod.Namespace, Namespace: pod.Namespace}, &resourceQuota); err != nil {
return err
}
//r.Logger.V(1).Info("resourceQuota", "resourceQuota", resourceQuota)
Expand Down Expand Up @@ -216,20 +212,20 @@ func (r *PodResourceReconciler) checkResourceExist(resourceName v1.ResourceName,

func GetResourceName(namespaceName, podName string, containerName string, resourceName v1.ResourceName, seqID int64) string {
if containerName == "" {
return fmt.Sprintf("%s-%s-%s-%s-%v", namespaceName, PodResourcePricePrefix, podName, resourceName, seqID)
return fmt.Sprintf("%s-%s-%s-%s-%v", namespaceName, meteringv1.PodResourcePricePrefix, podName, resourceName, seqID)
}

return fmt.Sprintf("%s-%s-%s-%s-%s-%v", namespaceName, PodResourcePricePrefix, podName, containerName, resourceName, seqID)
return fmt.Sprintf("%s-%s-%s-%s-%s-%v", namespaceName, meteringv1.PodResourcePricePrefix, podName, containerName, resourceName, seqID)
}

// SetupWithManager sets up the controller with the Manager.
func (r *PodResourceReconciler) SetupWithManager(mgr ctrl.Manager) error {
const controllerName = "podResource-controller"
r.Logger = ctrl.Log.WithName(controllerName)
r.Logger.V(1).Info("reconcile podResource-controller")
r.MeteringSystemNameSpace = os.Getenv(METERINGNAMESPACEENV)
if os.Getenv(METERINGNAMESPACEENV) == "" {
r.MeteringSystemNameSpace = DEFAULTMETERINGNAMESPACE
r.MeteringSystemNameSpace = os.Getenv(meteringv1.METERINGNAMESPACEENV)
if os.Getenv(meteringv1.METERINGNAMESPACEENV) == "" {
r.MeteringSystemNameSpace = meteringv1.DEFAULTMETERINGNAMESPACE
}
return ctrl.NewControllerManagedBy(mgr).
For(&meteringv1.PodResource{}).
Expand Down
2 changes: 1 addition & 1 deletion controllers/metering/deploy/manifests/deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ spec:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
image: ghcr.io/xiao-jay/sealos-metering-controller:dev
image: ghcr.io/labring/sealos-metering-controller:dev
imagePullPolicy: Always
livenessProbe:
httpGet:
Expand Down
Loading

0 comments on commit 9197106

Please sign in to comment.