This repository has been archived by the owner on Feb 10, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathconfig.go
117 lines (101 loc) · 2.97 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package main
import (
"encoding/base64"
"fmt"
"io/ioutil"
"net"
"os"
"gopkg.in/yaml.v2"
kubeschedulerconfigv1alpha1 "k8s.io/kube-scheduler/config/v1alpha1"
"k8s.io/kubernetes/cmd/kube-scheduler/app/options"
kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config"
kubeschedulerscheme "k8s.io/kubernetes/pkg/scheduler/apis/config/scheme"
)
const (
name = "default"
tokenFile = "/var/run/secrets/kubernetes.io/serviceaccount/token"
rootCAFile = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
)
func WriteInClusterKubeConfig(path string) error {
ca, err := ioutil.ReadFile(rootCAFile)
if err != nil {
return fmt.Errorf("could not read root CA: %w", err)
}
token, err := ioutil.ReadFile(tokenFile)
if err != nil {
return fmt.Errorf("could not read k8s token: %w", err)
}
kubeAPIServer := "https://" + net.JoinHostPort(
os.Getenv("KUBERNETES_SERVICE_HOST"),
os.Getenv("KUBERNETES_SERVICE_PORT"),
)
config := map[string]interface{}{
"apiVersion": "v1",
"kind": "Config",
"current-context": name,
"clusters": []interface{}{
map[string]interface{}{
"name": name,
"cluster": map[string]interface{}{
"certificate-authority-data": base64.StdEncoding.EncodeToString(ca),
"server": kubeAPIServer,
},
},
},
"contexts": []interface{}{
map[string]interface{}{
"name": name,
"context": map[string]interface{}{
"cluster": name,
"user": name,
},
},
},
"users": []interface{}{
map[string]interface{}{
"name": name,
"user": map[string]interface{}{
"token": string(token),
},
},
},
}
out, err := yaml.Marshal(config)
if err != nil {
return fmt.Errorf("could not marshal config: %w", err)
}
if err := ioutil.WriteFile(path, out, 0644); err != nil {
return fmt.Errorf("could not write kubeconfig to %s: %w", path, err)
}
return nil
}
func WriteSchedulerConfig(name, path, kubeConfigPath string) error {
// Create a default config with all fields so we can override them
cfgv1alpha1 := kubeschedulerconfigv1alpha1.KubeSchedulerConfiguration{}
kubeschedulerscheme.Scheme.Default(&cfgv1alpha1)
cfg := kubeschedulerconfig.KubeSchedulerConfiguration{}
if err := kubeschedulerscheme.Scheme.Convert(&cfgv1alpha1, &cfg, nil); err != nil {
return err
}
// Custom name ensures we only target pods with this name
cfg.SchedulerName = name
// The kubeconfig previously written
cfg.ClientConnection.Kubeconfig = kubeConfigPath
// Only running a single replica
cfg.LeaderElection.LeaderElect = false
// Enabled our custom plugin
cfg.Plugins = &kubeschedulerconfig.Plugins{
PreFilter: &kubeschedulerconfig.PluginSet{
Enabled: []kubeschedulerconfig.Plugin{
{Name: "ZonalDistribution"},
},
},
Filter: &kubeschedulerconfig.PluginSet{
Enabled: []kubeschedulerconfig.Plugin{
{Name: "ZonalDistribution"},
},
},
}
// Use the same code path as the scheduler's --write-config-to flag
return options.WriteConfigFile(path, &cfg)
}