Skip to content

Commit

Permalink
Merge pull request #5 from yan234280533/dev-ensurance-2-crane-agent
Browse files Browse the repository at this point in the history
add crane agent , int crane agent it contained the node-qos-ensurance-policy-controller
  • Loading branch information
mfanjie committed Dec 16, 2021
2 parents b21c0dd + a686700 commit cb703b5
Show file tree
Hide file tree
Showing 54 changed files with 3,240 additions and 162 deletions.
24 changes: 20 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ REGISTRY_PASSWORD?=""

# Image URL to use all building/pushing image targets
MANAGER_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/craned:${GIT_VERSION}"
AGENT_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/crane-agent:${GIT_VERSION}"
ADAPTER_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/metric-adapter:${GIT_VERSION}"

# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
Expand Down Expand Up @@ -106,32 +107,40 @@ test: manifests fmt vet goimports ## Run tests.


.PHONY: build
build: craned metric-adapter
build: craned crane-agent metric-adapter

.PHONY: all
all: test lint vet craned metric-adapter
all: test lint vet craned crane-agent metric-adapter

.PHONY: craned
craned: ## Build binary with the crane manager.
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/craned cmd/craned/main.go

.PHONY: crane-agent
crane-agent: ## Build binary with the crane agent.
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/crane-agent cmd/crane-agent/main.go

.PHONY: metric-adapter
metric-adapter: ## Build binary with the metric adapter.
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/metric-adapter cmd/metric-adapter/main.go

.PHONY: images
images: image-craned image-metric-adapter
images: image-craned image-crane-agent image-metric-adapter

.PHONY: image-craned
image-craned: ## Build docker image with the crane manager.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=craned -t ${MANAGER_IMG} .

.PHONY: image-crane-agent
image-crane-agent: test ## Build docker image with the crane manager.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=crane-agent -t ${AGENT_IMG} .

.PHONY: image-metric-adapter
image-metric-adapter: ## Build docker image with the metric adapter.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=metric-adapter -t ${ADAPTER_IMG} .

.PHONY: push-images
push-images: push-image-craned push-image-metric-adapter
push-images: push-image-craned push-image-crane-agent push-image-metric-adapter

.PHONY: push-image-craned
push-image-craned: ## Push images.
Expand All @@ -140,6 +149,13 @@ ifneq ($(REGISTRY_USER_NAME), "")
endif
docker push ${MANAGER_IMG}

.PHONY: push-image-crane-agent
push-image-crane-agent: ## Push images.
ifneq ($(REGISTRY_USER_NAME), "")
docker login -u $(REGISTRY_USER_NAME) -p $(REGISTRY_PASSWORD) ${REGISTRY}
endif
docker push ${AGENT_IMG}

.PHONY: push-image-metric-adapter
push-image-metric-adapter: ## Push images.
ifneq ($(REGISTRY_USER_NAME), "")
Expand Down
134 changes: 134 additions & 0 deletions cmd/crane-agent/app/agent.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package app

import (
"context"
"flag"
"fmt"
"os"

"github.com/gocrane/crane/pkg/utils"
"k8s.io/client-go/rest"

ensuaranceapi "github.com/gocrane/api/ensurance/v1alpha1"
ensuaranceset "github.com/gocrane/api/pkg/generated/clientset/versioned"
"github.com/gocrane/crane/cmd/crane-agent/app/options"
"github.com/gocrane/crane/pkg/ensurance/analyzer"
"github.com/gocrane/crane/pkg/ensurance/avoidance"
"github.com/gocrane/crane/pkg/ensurance/executor"
einformer "github.com/gocrane/crane/pkg/ensurance/informer"
"github.com/gocrane/crane/pkg/ensurance/manager"
"github.com/gocrane/crane/pkg/ensurance/statestore"
"github.com/gocrane/crane/pkg/utils/log"
"github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/kubernetes"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
)

var (
scheme = runtime.NewScheme()
)

func init() {
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(ensuaranceapi.AddToScheme(scheme))
//+kubebuilder:scaffold:scheme
}

// NewManagerCommand creates a *cobra.Command object with default parameters
func NewManagerCommand(ctx context.Context) *cobra.Command {
opts := options.NewOptions()

cmd := &cobra.Command{
Use: "crane-agent",
Long: `The crane agent is responsible agent in crane`,
Run: func(cmd *cobra.Command, args []string) {
if err := opts.Complete(); err != nil {
log.Logger().Error(err, "opts complete failed,exit")
os.Exit(255)
}
if err := opts.Validate(); err != nil {
log.Logger().Error(err, "opts validate failed,exit")
os.Exit(255)
}

if err := Run(ctx, opts); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
},
}

cmd.Flags().AddGoFlagSet(flag.CommandLine)
opts.AddFlags(cmd.Flags())
return cmd
}

// Run runs the crane-agent with options. This should never exit.
func Run(ctx context.Context, opts *options.Options) error {

if opts.HostnameOverride == "" {
log.Logger().Error(nil, "HostnameOverride must be set as the k8s node name")
os.Exit(1)
}

log.Logger().V(2).Info(fmt.Sprintf("opts %v", opts))

config, err := rest.InClusterConfig()
if err != nil {
log.Logger().Error(err, "InClusterConfig failed")
}

stop := utils.SetupSignalHandler()

// init context
ec := initializeContext(config, opts, stop)
ec.Run()

// init managers
components := initializeManagers(opts, ec)

// start managers
for _, v := range components {
log.Logger().V(2).Info(fmt.Sprintf("Starting manager %s", v.Name()))
v.Run(ec.GetStop())
}

return nil
}

func initializeManagers(opts *options.Options, ec *einformer.Context) []manager.Manager {
log.Logger().V(2).Info(fmt.Sprintf("initializeManagers"))

var managers []manager.Manager
podInformer := ec.GetPodInformer()
nodeInformer := ec.GetNodeInformer()
nepInformer := ec.GetNepInformer()
avoidanceInformer := ec.GetAvoidanceInformer()

var noticeCh = make(chan executor.AvoidanceExecutor)

// init state store manager
stateStoreManager := statestore.NewStateStoreManager(nepInformer)
managers = append(managers, stateStoreManager)

// init analyzer manager
analyzerManager := analyzer.NewAnalyzerManager(opts.HostnameOverride, podInformer, nodeInformer, nepInformer, avoidanceInformer, stateStoreManager, ec.GetRecorder(), noticeCh)
managers = append(managers, analyzerManager)

// init avoidance manager
avoidanceManager := avoidance.NewAvoidanceManager(ec.GetKubeClient(), opts.HostnameOverride, podInformer, nodeInformer, avoidanceInformer, noticeCh)
managers = append(managers, avoidanceManager)

return managers
}

func initializeContext(config *rest.Config, opts *options.Options, stop <-chan struct{}) *einformer.Context {
log.Logger().V(2).Info(fmt.Sprintf("initializationContext"))

generatedClient := kubernetes.NewForConfigOrDie(config)
clientSet := ensuaranceset.NewForConfigOrDie(config)

return einformer.NewContextWithClient(generatedClient, clientSet, opts.HostnameOverride, stop)
}
31 changes: 31 additions & 0 deletions cmd/crane-agent/app/options/option.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package options

import (
"github.com/spf13/pflag"
)

// Options hold the command-line options about crane manager
type Options struct {
// HostnameOverride is the name of k8s node
HostnameOverride string
}

// NewOptions builds an empty options.
func NewOptions() *Options {
return &Options{}
}

// Complete completes all the required options.
func (o *Options) Complete() error {
return nil
}

// Validate all required options.
func (o *Options) Validate() error {
return nil
}

// AddFlags adds flags to the specified FlagSet.
func (o *Options) AddFlags(flags *pflag.FlagSet) {
flags.StringVar(&o.HostnameOverride, "hostname-override", "", "Which is the name of k8s node be used to filtered.")
}
27 changes: 27 additions & 0 deletions cmd/crane-agent/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package main

import (
"fmt"
"os"

genericapiserver "k8s.io/apiserver/pkg/server"
"k8s.io/component-base/logs"

"github.com/gocrane/crane/cmd/crane-agent/app"
"github.com/gocrane/crane/pkg/utils/log"
)

// crane-agent main.
func main() {
logs.InitLogs()
defer logs.FlushLogs()

log.Init("crane-agent")

ctx := genericapiserver.SetupSignalContext()

if err := app.NewManagerCommand(ctx).Execute(); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
}
5 changes: 3 additions & 2 deletions cmd/craned/app/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"os"
"strings"

"github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/discovery"
Expand All @@ -16,8 +17,6 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"

"github.com/spf13/cobra"

analysisapi "github.com/gocrane/api/analysis/v1alpha1"
autoscalingapi "github.com/gocrane/api/autoscaling/v1alpha1"
predictionapi "github.com/gocrane/api/prediction/v1alpha1"
Expand Down Expand Up @@ -99,9 +98,11 @@ func Run(ctx context.Context, opts *options.Options) error {
log.Logger().Error(err, "failed to add health check endpoint")
return err
}

initializationWebhooks(mgr, opts)
initializationControllers(ctx, mgr, opts)
log.Logger().Info("Starting crane manager")

if err := mgr.Start(ctx); err != nil {
log.Logger().Error(err, "problem running crane manager")
return err
Expand Down
40 changes: 40 additions & 0 deletions deploy/deploy/crane-agent/daemonset.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@

apiVersion: v1
kind: Namespace
metadata:
name: crane-system

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: crane-agent
name: crane-agent
namespace: crane-system
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: crane-agent
template:
metadata:
labels:
app: crane-agent
spec:
containers:
- env:
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
image: docker.io/gocrane/crane-agent:0b506ba
imagePullPolicy: Always
command:
- /crane-agent
- -v=4
name: crane-agent
restartPolicy: Always
priorityClassName: system-node-critical
serviceAccount: crane-agent
Loading

0 comments on commit cb703b5

Please sign in to comment.