Skip to content

Commit 82dc2ac

Browse files
authored
add koord-descheduler (#425)
Signed-off-by: Joseph <joseph.t.lee@outlook.com>
1 parent 1cf37d0 commit 82dc2ac

File tree

12 files changed

+1196
-5
lines changed

12 files changed

+1196
-5
lines changed

.github/workflows/ci.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jobs:
5656
make vet && git add pkg cmd &&
5757
git diff --cached --exit-code || (echo 'Please run "make vet" to verify govet' && exit 1);
5858
- name: Run Go build
59-
run: make build-koordlet build-koord-manager build-koord-scheduler build-koord-runtime-proxy
59+
run: make build-koordlet build-koord-manager build-koord-scheduler build-koord-descheduler build-koord-runtime-proxy
6060
- name: Run Go test
6161
run: make test
6262
- name: Upload coverage to Codecov
@@ -74,7 +74,7 @@ jobs:
7474
strategy:
7575
fail-fast: false
7676
matrix:
77-
target: [koordlet, koord-manager, koord-scheduler]
77+
target: [koordlet, koord-manager, koord-scheduler, koord-descheduler]
7878
env:
7979
GITHUB_REG: ghcr.io
8080
ALIYUN_REG: registry.cn-beijing.aliyuncs.com

.goreleaser.yaml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ builds:
5050
- -X github.com/koordinator-sh/koordinator/pkg/version.buildDate={{ .Date }}
5151
- -X github.com/koordinator-sh/koordinator/pkg/version.gitCommit={{ .Commit }}
5252
- -X github.com/koordinator-sh/koordinator/pkg/version.gitTreeState=clean
53+
- id: koord-descheduler
54+
env:
55+
- CGO_ENABLED=0
56+
goos:
57+
- linux
58+
goarch:
59+
- amd64
60+
main: ./cmd/koord-descheduler
61+
binary: koord-descheduler
62+
ldflags:
63+
- -s -w
64+
- -X github.com/koordinator-sh/koordinator/pkg/version.version={{ .Version }}
65+
- -X github.com/koordinator-sh/koordinator/pkg/version.buildDate={{ .Date }}
66+
- -X github.com/koordinator-sh/koordinator/pkg/version.gitCommit={{ .Commit }}
67+
- -X github.com/koordinator-sh/koordinator/pkg/version.gitTreeState=clean
5368
- id: koordlet
5469
env:
5570
- CGO_ENABLED=1
@@ -138,3 +153,20 @@ dockers:
138153
- koord-scheduler
139154
goos: linux
140155
goarch: amd64
156+
- id: koord-descheduler
157+
image_templates:
158+
- "ghcr.io/{{.ProjectName}}/koord-descheduler:{{ .Version }}"
159+
- "registry.cn-beijing.aliyuncs.com/{{.ProjectName}}/koord-descheduler:{{ .Version }}"
160+
dockerfile: .goreleaser/koord-descheduler.dockerfile
161+
build_flag_templates:
162+
- "--pull"
163+
- "--label=org.opencontainers.image.title=koord-descheduler"
164+
- "--label=org.opencontainers.image.source={{.Env.GIT_URL}}"
165+
- "--label=org.opencontainers.image.created={{.Date}}"
166+
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
167+
- "--label=org.opencontainers.image.version={{.Version}}"
168+
- "--label=org.opencontainers.image.licenses=Apache-2.0"
169+
ids:
170+
- koord-descheduler
171+
goos: linux
172+
goarch: amd64
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
FROM gcr.io/distroless/static:latest
2+
WORKDIR /
3+
COPY koord-descheduler .
4+
ENTRYPOINT ["/koord-descheduler"]

Makefile

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ REG_PWD ?= ""
1212
KOORDLET_IMG ?= "${REG}/${REG_NS}/koordlet:${GIT_BRANCH}-${GIT_COMMIT_ID}"
1313
KOORD_MANAGER_IMG ?= "${REG}/${REG_NS}/koord-manager:${GIT_BRANCH}-${GIT_COMMIT_ID}"
1414
KOORD_SCHEDULER_IMG ?= "${REG}/${REG_NS}/koord-scheduler:${GIT_BRANCH}-${GIT_COMMIT_ID}"
15+
KOORD_DESCHEDULER_IMG ?= "${REG}/${REG_NS}/koord-descheduler:${GIT_BRANCH}-${GIT_COMMIT_ID}"
1516

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

9394
.PHONY: build
94-
build: generate fmt vet lint build-koordlet build-koord-manager build-koord-scheduler build-koord-runtime-proxy
95+
build: generate fmt vet lint build-koordlet build-koord-manager build-koord-scheduler build-koord-descheduler build-koord-runtime-proxy
9596

9697
.PHONY: build-koordlet
9798
build-koordlet: ## Build koordlet binary.
@@ -105,12 +106,16 @@ build-koord-manager: ## Build koord-manager binary.
105106
build-koord-scheduler: ## Build koord-scheduler binary.
106107
go build -o bin/koord-scheduler cmd/koord-scheduler/main.go
107108

109+
.PHONY: build-koord-descheduler
110+
build-koord-descheduler: ## Build koord-descheduler binary.
111+
go build -o bin/koord-descheduler cmd/koord-descheduler/main.go
112+
108113
.PHONY: build-koord-runtime-proxy
109114
build-koord-runtime-proxy: ## Build koord-runtime-proxy binary.
110115
go build -o bin/koord-runtime-proxy cmd/koord-runtime-proxy/main.go
111116

112117
.PHONY: docker-build
113-
docker-build: test docker-build-koordlet docker-build-koord-manager docker-build-koord-scheduler
118+
docker-build: test docker-build-koordlet docker-build-koord-manager docker-build-koord-scheduler docker-build-koord-descheduler
114119

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

132+
.PHONY: docker-build-koord-descheduler
133+
docker-build-koord-descheduler: ## Build docker image with the descheduler.
134+
docker build --pull -t ${KOORD_DESCHEDULER_IMG} -f docker/koord-descheduler.dockerfile .
135+
127136
.PHONY: docker-push
128-
docker-push: docker-push-koordlet docker-push-koord-manager docker-push-koord-scheduler
137+
docker-push: docker-push-koordlet docker-push-koord-manager docker-push-koord-scheduler docker-push-koord-descheduler
129138

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

160+
.PHONY: docker-push-koord-descheduler
161+
docker-push-koord-descheduler: ## Push docker image with the descheduler.
162+
ifneq ($(REG_USER), "")
163+
docker login -u $(REG_USER) -p $(REG_PWD) ${REG}
164+
endif
165+
docker push ${KOORD_DESCHEDULER_IMG}
166+
151167
##@ Deployment
152168

153169
ifndef ignore-not-found
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
Copyright 2022 The Koordinator Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package config
18+
19+
import (
20+
apiserver "k8s.io/apiserver/pkg/server"
21+
"k8s.io/client-go/dynamic/dynamicinformer"
22+
"k8s.io/client-go/informers"
23+
clientset "k8s.io/client-go/kubernetes"
24+
restclient "k8s.io/client-go/rest"
25+
"k8s.io/client-go/tools/events"
26+
"k8s.io/client-go/tools/leaderelection"
27+
ctrl "sigs.k8s.io/controller-runtime"
28+
29+
deschedulerconfig "github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config"
30+
)
31+
32+
// Config has all the context to run a Scheduler
33+
type Config struct {
34+
// ComponentConfig is the scheduler server's configuration object.
35+
ComponentConfig deschedulerconfig.DeschedulerConfiguration
36+
37+
// LoopbackClientConfig is a config for a privileged loopback connection
38+
LoopbackClientConfig *restclient.Config
39+
40+
InsecureServing *apiserver.DeprecatedInsecureServingInfo // nil will disable serving on an insecure port
41+
InsecureMetricsServing *apiserver.DeprecatedInsecureServingInfo // non-nil if metrics should be served independently
42+
SecureServing *apiserver.SecureServingInfo
43+
44+
Manager ctrl.Manager
45+
Client clientset.Interface
46+
KubeConfig *restclient.Config
47+
InformerFactory informers.SharedInformerFactory
48+
DynInformerFactory dynamicinformer.DynamicSharedInformerFactory
49+
50+
// nolint:staticcheck // SA1019 this deprecated field still needs to be used for now. It will be removed once the migration is done.
51+
EventBroadcaster events.EventBroadcasterAdapter
52+
53+
// LeaderElection is optional.
54+
LeaderElection *leaderelection.LeaderElectionConfig
55+
}
56+
57+
type completedConfig struct {
58+
*Config
59+
}
60+
61+
// CompletedConfig same as Config, just to swap private object.
62+
type CompletedConfig struct {
63+
// Embed a private pointer that cannot be instantiated outside of this package.
64+
*completedConfig
65+
}
66+
67+
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
68+
func (c *Config) Complete() CompletedConfig {
69+
cc := completedConfig{c}
70+
return CompletedConfig{&cc}
71+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
Copyright 2022 The Koordinator Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package options
18+
19+
import (
20+
"bytes"
21+
"fmt"
22+
"io"
23+
"os"
24+
25+
"k8s.io/apimachinery/pkg/runtime"
26+
"k8s.io/klog/v2"
27+
28+
deschedulerconfig "github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config"
29+
deschedulerconfigscheme "github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config/scheme"
30+
"github.com/koordinator-sh/koordinator/pkg/descheduler/apis/config/v1alpha2"
31+
)
32+
33+
func loadConfigFromFile(file string) (*deschedulerconfig.DeschedulerConfiguration, error) {
34+
data, err := os.ReadFile(file)
35+
if err != nil {
36+
return nil, err
37+
}
38+
39+
return loadConfig(data)
40+
}
41+
42+
func loadConfig(data []byte) (*deschedulerconfig.DeschedulerConfiguration, error) {
43+
// The UniversalDecoder runs defaulting and returns the internal type by default.
44+
obj, gvk, err := deschedulerconfigscheme.Codecs.UniversalDecoder().Decode(data, nil, nil)
45+
if err != nil {
46+
return nil, err
47+
}
48+
if cfgObj, ok := obj.(*deschedulerconfig.DeschedulerConfiguration); ok {
49+
// the field will be cleared later by API machinery during
50+
// conversion. See DeschedulerConfiguration internal type definition for
51+
// more details.
52+
cfgObj.TypeMeta.APIVersion = gvk.GroupVersion().String()
53+
return cfgObj, nil
54+
}
55+
return nil, fmt.Errorf("couldn't decode as DeschedulerConfiguration, got %s: ", gvk)
56+
}
57+
58+
func encodeConfig(cfg *deschedulerconfig.DeschedulerConfiguration) (*bytes.Buffer, error) {
59+
buf := new(bytes.Buffer)
60+
const mediaType = runtime.ContentTypeYAML
61+
info, ok := runtime.SerializerInfoForMediaType(deschedulerconfigscheme.Codecs.SupportedMediaTypes(), mediaType)
62+
if !ok {
63+
return buf, fmt.Errorf("unable to locate encoder -- %q is not a supported media type", mediaType)
64+
}
65+
66+
var encoder runtime.Encoder
67+
switch cfg.TypeMeta.APIVersion {
68+
case v1alpha2.SchemeGroupVersion.String():
69+
encoder = deschedulerconfigscheme.Codecs.EncoderForVersion(info.Serializer, v1alpha2.SchemeGroupVersion)
70+
default:
71+
encoder = deschedulerconfigscheme.Codecs.EncoderForVersion(info.Serializer, v1alpha2.SchemeGroupVersion)
72+
}
73+
if err := encoder.Encode(cfg, buf); err != nil {
74+
return buf, err
75+
}
76+
return buf, nil
77+
}
78+
79+
// LogOrWriteConfig logs the completed component config and writes it into the given file name as YAML, if either is enabled
80+
func LogOrWriteConfig(fileName string, cfg *deschedulerconfig.DeschedulerConfiguration, completedProfiles []deschedulerconfig.DeschedulerProfile) error {
81+
klogV := klog.V(2)
82+
if !klogV.Enabled() && len(fileName) == 0 {
83+
return nil
84+
}
85+
cfg.Profiles = completedProfiles
86+
87+
buf, err := encodeConfig(cfg)
88+
if err != nil {
89+
return err
90+
}
91+
92+
if klogV.Enabled() {
93+
klogV.InfoS("Using component config", "config", buf.String())
94+
}
95+
96+
if len(fileName) > 0 {
97+
configFile, err := os.Create(fileName)
98+
if err != nil {
99+
return err
100+
}
101+
defer configFile.Close()
102+
if _, err := io.Copy(configFile, buf); err != nil {
103+
return err
104+
}
105+
klog.InfoS("Wrote configuration", "file", fileName)
106+
os.Exit(0)
107+
}
108+
return nil
109+
}

0 commit comments

Comments
 (0)