Skip to content

Commit

Permalink
add koord-descheduler
Browse files Browse the repository at this point in the history
Signed-off-by: Joseph <joseph.t.lee@outlook.com>
  • Loading branch information
eahydra committed Aug 1, 2022
1 parent 1cf37d0 commit 437e145
Show file tree
Hide file tree
Showing 12 changed files with 1,196 additions and 5 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
make vet && git add pkg cmd &&
git diff --cached --exit-code || (echo 'Please run "make vet" to verify govet' && exit 1);
- name: Run Go build
run: make build-koordlet build-koord-manager build-koord-scheduler build-koord-runtime-proxy
run: make build-koordlet build-koord-manager build-koord-scheduler build-koord-descheduler build-koord-runtime-proxy
- name: Run Go test
run: make test
- name: Upload coverage to Codecov
Expand All @@ -74,7 +74,7 @@ jobs:
strategy:
fail-fast: false
matrix:
target: [koordlet, koord-manager, koord-scheduler]
target: [koordlet, koord-manager, koord-scheduler, koord-descheduler]
env:
GITHUB_REG: ghcr.io
ALIYUN_REG: registry.cn-beijing.aliyuncs.com
Expand Down
32 changes: 32 additions & 0 deletions .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,21 @@ builds:
- -X github.com/koordinator-sh/koordinator/pkg/version.buildDate={{ .Date }}
- -X github.com/koordinator-sh/koordinator/pkg/version.gitCommit={{ .Commit }}
- -X github.com/koordinator-sh/koordinator/pkg/version.gitTreeState=clean
- id: koord-descheduler
env:
- CGO_ENABLED=0
goos:
- linux
goarch:
- amd64
main: ./cmd/koord-descheduler
binary: koord-descheduler
ldflags:
- -s -w
- -X github.com/koordinator-sh/koordinator/pkg/version.version={{ .Version }}
- -X github.com/koordinator-sh/koordinator/pkg/version.buildDate={{ .Date }}
- -X github.com/koordinator-sh/koordinator/pkg/version.gitCommit={{ .Commit }}
- -X github.com/koordinator-sh/koordinator/pkg/version.gitTreeState=clean
- id: koordlet
env:
- CGO_ENABLED=1
Expand Down Expand Up @@ -138,3 +153,20 @@ dockers:
- koord-scheduler
goos: linux
goarch: amd64
- id: koord-descheduler
image_templates:
- "ghcr.io/{{.ProjectName}}/koord-descheduler:{{ .Version }}"
- "registry.cn-beijing.aliyuncs.com/{{.ProjectName}}/koord-descheduler:{{ .Version }}"
dockerfile: .goreleaser/koord-descheduler.dockerfile
build_flag_templates:
- "--pull"
- "--label=org.opencontainers.image.title=koord-descheduler"
- "--label=org.opencontainers.image.source={{.Env.GIT_URL}}"
- "--label=org.opencontainers.image.created={{.Date}}"
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
- "--label=org.opencontainers.image.version={{.Version}}"
- "--label=org.opencontainers.image.licenses=Apache-2.0"
ids:
- koord-descheduler
goos: linux
goarch: amd64
4 changes: 4 additions & 0 deletions .goreleaser/koord-descheduler.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM gcr.io/distroless/static:latest
WORKDIR /
COPY koord-descheduler .
ENTRYPOINT ["/koord-descheduler"]
22 changes: 19 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ REG_PWD ?= ""
KOORDLET_IMG ?= "${REG}/${REG_NS}/koordlet:${GIT_BRANCH}-${GIT_COMMIT_ID}"
KOORD_MANAGER_IMG ?= "${REG}/${REG_NS}/koord-manager:${GIT_BRANCH}-${GIT_COMMIT_ID}"
KOORD_SCHEDULER_IMG ?= "${REG}/${REG_NS}/koord-scheduler:${GIT_BRANCH}-${GIT_COMMIT_ID}"
KOORD_DESCHEDULER_IMG ?= "${REG}/${REG_NS}/koord-descheduler:${GIT_BRANCH}-${GIT_COMMIT_ID}"

# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
ENVTEST_K8S_VERSION = 1.23
Expand Down Expand Up @@ -91,7 +92,7 @@ test: manifests generate fmt vet envtest ## Run tests.
##@ Build

.PHONY: build
build: generate fmt vet lint build-koordlet build-koord-manager build-koord-scheduler build-koord-runtime-proxy
build: generate fmt vet lint build-koordlet build-koord-manager build-koord-scheduler build-koord-descheduler build-koord-runtime-proxy

.PHONY: build-koordlet
build-koordlet: ## Build koordlet binary.
Expand All @@ -105,12 +106,16 @@ build-koord-manager: ## Build koord-manager binary.
build-koord-scheduler: ## Build koord-scheduler binary.
go build -o bin/koord-scheduler cmd/koord-scheduler/main.go

.PHONY: build-koord-descheduler
build-koord-descheduler: ## Build koord-descheduler binary.
go build -o bin/koord-descheduler cmd/koord-descheduler/main.go

.PHONY: build-koord-runtime-proxy
build-koord-runtime-proxy: ## Build koord-runtime-proxy binary.
go build -o bin/koord-runtime-proxy cmd/koord-runtime-proxy/main.go

.PHONY: docker-build
docker-build: test docker-build-koordlet docker-build-koord-manager docker-build-koord-scheduler
docker-build: test docker-build-koordlet docker-build-koord-manager docker-build-koord-scheduler docker-build-koord-descheduler

.PHONY: docker-build-koordlet
docker-build-koordlet: ## Build docker image with the koordlet.
Expand All @@ -124,8 +129,12 @@ docker-build-koord-manager: ## Build docker image with the koord-manager.
docker-build-koord-scheduler: ## Build docker image with the scheduler.
docker build --pull -t ${KOORD_SCHEDULER_IMG} -f docker/koord-scheduler.dockerfile .

.PHONY: docker-build-koord-descheduler
docker-build-koord-descheduler: ## Build docker image with the descheduler.
docker build --pull -t ${KOORD_DESCHEDULER_IMG} -f docker/koord-descheduler.dockerfile .

.PHONY: docker-push
docker-push: docker-push-koordlet docker-push-koord-manager docker-push-koord-scheduler
docker-push: docker-push-koordlet docker-push-koord-manager docker-push-koord-scheduler docker-push-koord-descheduler

.PHONY: docker-push-koordlet
docker-push-koordlet: ## Push docker image with the koordlet.
Expand All @@ -148,6 +157,13 @@ ifneq ($(REG_USER), "")
endif
docker push ${KOORD_SCHEDULER_IMG}

.PHONY: docker-push-koord-descheduler
docker-push-koord-descheduler: ## Push docker image with the descheduler.
ifneq ($(REG_USER), "")
docker login -u $(REG_USER) -p $(REG_PWD) ${REG}
endif
docker push ${KOORD_DESCHEDULER_IMG}

##@ Deployment

ifndef ignore-not-found
Expand Down
71 changes: 71 additions & 0 deletions cmd/koord-descheduler/app/config/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
Copyright 2022 The Koordinator Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package config

import (
apiserver "k8s.io/apiserver/pkg/server"
"k8s.io/client-go/dynamic/dynamicinformer"
"k8s.io/client-go/informers"
clientset "k8s.io/client-go/kubernetes"
restclient "k8s.io/client-go/rest"
"k8s.io/client-go/tools/events"
"k8s.io/client-go/tools/leaderelection"
ctrl "sigs.k8s.io/controller-runtime"

deschedulerconfig "github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config"
)

// Config has all the context to run a Scheduler
type Config struct {
// ComponentConfig is the scheduler server's configuration object.
ComponentConfig deschedulerconfig.DeschedulerConfiguration

// LoopbackClientConfig is a config for a privileged loopback connection
LoopbackClientConfig *restclient.Config

InsecureServing *apiserver.DeprecatedInsecureServingInfo // nil will disable serving on an insecure port
InsecureMetricsServing *apiserver.DeprecatedInsecureServingInfo // non-nil if metrics should be served independently
SecureServing *apiserver.SecureServingInfo

Manager ctrl.Manager
Client clientset.Interface
KubeConfig *restclient.Config
InformerFactory informers.SharedInformerFactory
DynInformerFactory dynamicinformer.DynamicSharedInformerFactory

// nolint:staticcheck // SA1019 this deprecated field still needs to be used for now. It will be removed once the migration is done.
EventBroadcaster events.EventBroadcasterAdapter

// LeaderElection is optional.
LeaderElection *leaderelection.LeaderElectionConfig
}

type completedConfig struct {
*Config
}

// CompletedConfig same as Config, just to swap private object.
type CompletedConfig struct {
// Embed a private pointer that cannot be instantiated outside of this package.
*completedConfig
}

// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
func (c *Config) Complete() CompletedConfig {
cc := completedConfig{c}
return CompletedConfig{&cc}
}
109 changes: 109 additions & 0 deletions cmd/koord-descheduler/app/options/configfile.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
Copyright 2022 The Koordinator Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package options

import (
"bytes"
"fmt"
"io"
"os"

"k8s.io/apimachinery/pkg/runtime"
"k8s.io/klog/v2"

deschedulerconfig "github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config"
deschedulerconfigscheme "github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config/scheme"
"github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config/v1alpha2"
)

func loadConfigFromFile(file string) (*deschedulerconfig.DeschedulerConfiguration, error) {
data, err := os.ReadFile(file)
if err != nil {
return nil, err
}

return loadConfig(data)
}

func loadConfig(data []byte) (*deschedulerconfig.DeschedulerConfiguration, error) {
// The UniversalDecoder runs defaulting and returns the internal type by default.
obj, gvk, err := deschedulerconfigscheme.Codecs.UniversalDecoder().Decode(data, nil, nil)
if err != nil {
return nil, err
}
if cfgObj, ok := obj.(*deschedulerconfig.DeschedulerConfiguration); ok {
// the field will be cleared later by API machinery during
// conversion. See DeschedulerConfiguration internal type definition for
// more details.
cfgObj.TypeMeta.APIVersion = gvk.GroupVersion().String()
return cfgObj, nil
}
return nil, fmt.Errorf("couldn't decode as DeschedulerConfiguration, got %s: ", gvk)
}

func encodeConfig(cfg *deschedulerconfig.DeschedulerConfiguration) (*bytes.Buffer, error) {
buf := new(bytes.Buffer)
const mediaType = runtime.ContentTypeYAML
info, ok := runtime.SerializerInfoForMediaType(deschedulerconfigscheme.Codecs.SupportedMediaTypes(), mediaType)
if !ok {
return buf, fmt.Errorf("unable to locate encoder -- %q is not a supported media type", mediaType)
}

var encoder runtime.Encoder
switch cfg.TypeMeta.APIVersion {
case v1alpha2.SchemeGroupVersion.String():
encoder = deschedulerconfigscheme.Codecs.EncoderForVersion(info.Serializer, v1alpha2.SchemeGroupVersion)
default:
encoder = deschedulerconfigscheme.Codecs.EncoderForVersion(info.Serializer, v1alpha2.SchemeGroupVersion)
}
if err := encoder.Encode(cfg, buf); err != nil {
return buf, err
}
return buf, nil
}

// LogOrWriteConfig logs the completed component config and writes it into the given file name as YAML, if either is enabled
func LogOrWriteConfig(fileName string, cfg *deschedulerconfig.DeschedulerConfiguration, completedProfiles []deschedulerconfig.DeschedulerProfile) error {
klogV := klog.V(2)
if !klogV.Enabled() && len(fileName) == 0 {
return nil
}
cfg.Profiles = completedProfiles

buf, err := encodeConfig(cfg)
if err != nil {
return err
}

if klogV.Enabled() {
klogV.InfoS("Using component config", "config", buf.String())
}

if len(fileName) > 0 {
configFile, err := os.Create(fileName)
if err != nil {
return err
}
defer configFile.Close()
if _, err := io.Copy(configFile, buf); err != nil {
return err
}
klog.InfoS("Wrote configuration", "file", fileName)
os.Exit(0)
}
return nil
}
Loading

0 comments on commit 437e145

Please sign in to comment.