Skip to content
This repository was archived by the owner on Jan 29, 2025. It is now read-only.

Commit 65291eb

Browse files
togashidmkillianmuldoon
authored andcommitted
Refactor the files to access client cert/key
Update configure-scheduler.sh to allow certs on mount volume in kube-scheduler pod and copy the client cert/key into it. Update scheduler-extender-configmap.yaml to the new reference values to the cert/key files. Add path for ca cert in the deploy. Required and verify client cert in scheduler.go Co-authored-by: togashidm <togashidm@gmail.com> Co-authored-by: killianmuldoon <killian.muldoon@intel.com>
1 parent 3e592a2 commit 65291eb

File tree

6 files changed

+67
-24
lines changed

6 files changed

+67
-24
lines changed

README.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Note: a shell script that shows these steps can be found [here](deploy/extender-
5151
The extender configuration files can be found under deploy/extender-configuration.
5252
TAS Scheduler Extender needs to be registered with the Kubernetes Scheduler. In order to do this a configmap should be created like the below:
5353
````
54-
apiVersion: v1alpha1
54+
apiVersion: v1
5555
kind: ConfigMap
5656
metadata:
5757
name: scheduler-extender-policy
@@ -63,7 +63,7 @@ data:
6363
"apiVersion" : "v1",
6464
"extenders" : [
6565
{
66-
"urlPrefix": "https://tas-service.default.svc.cluster.local:9001",
66+
"urlPrefix": "https://tas-service.default.svc.cluster.local:9001",
6767
"apiVersion": "v1",
6868
"prioritizeVerb": "scheduler/prioritize",
6969
"filterVerb": "scheduler/filter",
@@ -75,9 +75,14 @@ data:
7575
"ignoredByScheduler": true
7676
}
7777
],
78-
"ignorable": true
79-
}
80-
]
78+
"ignorable": true,
79+
"tlsConfig": {
80+
"insecure": false,
81+
"certFile": "/host/certs/client.crt",
82+
"keyFile" : "/host/certs/client.key"
83+
}
84+
}
85+
]
8186
}
8287
8388
````

cmd/tas-scheduler-extender/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@ package main
22

33
import (
44
"flag"
5-
65
"github.com/intel/telemetry-aware-scheduling/pkg/cache"
76
"github.com/intel/telemetry-aware-scheduling/pkg/scheduler"
87
)
98

109
func main() {
11-
var kubeConfig, port, certFile, keyFile, cacheEndpoint string
10+
var kubeConfig, port, certFile, keyFile, caFile, cacheEndpoint string
1211
var unsafe bool
1312
flag.StringVar(&kubeConfig, "kubeConfig", "/root/.kube/config", "location of kubernetes config file")
1413
flag.StringVar(&port, "port", "9001", "port on which the scheduler extender will listen")
1514
flag.StringVar(&certFile, "cert", "/etc/kubernetes/pki/ca.crt", "cert file extender will use for authentication")
1615
flag.StringVar(&keyFile, "key", "/etc/kubernetes/pki/ca.key", "key file extender will use for authentication")
17-
flag.StringVar(&cacheEndpoint, "cacheEndpoint", "http://127.0.0.1:8111/cache/", "root at which the cache can be reached for reading")
16+
flag.StringVar(&caFile, "cacert", "/etc/kubernetes/pki/ca.crt", "ca file extender will use for authentication")
17+
flag.StringVar(&cacheEndpoint, "cacheEndpoint", "http://localhost:8111/cache/", "root at which the cache can be reached for reading")
1818
flag.BoolVar(&unsafe, "unsafe", false, "unsafe instances of telemetry aware scheduler will be served over simple http.")
1919
flag.Parse()
2020
cacheReader := cache.RemoteClient{}
2121
cacheReader.RegisterEndpoint(cacheEndpoint)
2222
schedulerExtender := scheduler.NewMetricsExtender(&cacheReader)
23-
schedulerExtender.StartServer(port, certFile, keyFile, unsafe)
23+
schedulerExtender.StartServer(port, certFile, keyFile, caFile, unsafe)
2424
}

deploy/extender-configuration/configure-scheduler.sh

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,26 @@ kubectl create clusterrolebinding scheduler-config-map --clusterrole=configmapge
1616
## Remove arguments from Kubernetes Scheduler file if they exist
1717
sed -i '/^ - --policy-configmap/d' $MANIFEST_FILE
1818
sed -i '/^ dnsPolicy: ClusterFirstWithHostNet/d' $MANIFEST_FILE
19+
sed -i '/certs/d' $MANIFEST_FILE
20+
sed -i '/name: certdir/d' $MANIFEST_FILE
21+
sed -i '/hostPath/d' $MANIFEST_FILE
1922

20-
## Add arguments to our kube-scheduler manifest. There are three arguments here:
21-
## 1) Policy configmap namespace as arg to binary.
23+
## Copy client cert/key pair into kube-scheduler
24+
mkdir /etc/certs/
25+
cp /etc/kubernetes/pki/ca.key /etc/certs/client.key
26+
cp /etc/kubernetes/pki/ca.crt /etc/certs/client.crt
27+
28+
## Add arguments to our kube-scheduler manifest. The arguments are:
29+
## 1) Policy configmap extender as arg to binary.
2230
## 2) Policy configmap namespace as arg to binary.
2331
## 3) dnsPolicy as part of Pod spec allowing access to kubernetes services.
32+
## 4) Set autorization certs
2433

2534
sed -e "/ - kube-scheduler/a\\
2635
- --policy-configmap=scheduler-extender-policy\n - --policy-configmap-namespace=kube-system" $MANIFEST_FILE -i
2736
sed -e "/spec/a\\
2837
dnsPolicy: ClusterFirstWithHostNet" $MANIFEST_FILE -i
29-
38+
sed -e "/ readOnly: true/a\\
39+
- mountPath: /host/certs\n name: certdir" $MANIFEST_FILE -i
40+
sed -e "/ volumes:/a\\
41+
- hostPath:\n path: /etc/certs\n name: certdir\n - hostPath:" $MANIFEST_FILE -i

deploy/extender-configuration/scheduler-extender-configmap.yaml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ data:
1010
"apiVersion" : "v1",
1111
"extenders" : [
1212
{
13-
"urlPrefix": "https://tas-service.default.svc.cluster.local:9001",
13+
"urlPrefix": "https://tas-service.default.svc.cluster.local:9001",
1414
"apiVersion": "v1",
1515
"prioritizeVerb": "scheduler/prioritize",
1616
"filterVerb": "scheduler/filter",
@@ -22,7 +22,12 @@ data:
2222
"ignoredByScheduler": true
2323
}
2424
],
25-
"ignorable": true
26-
}
27-
]
28-
}
25+
"ignorable": true,
26+
"tlsConfig": {
27+
"insecure": false,
28+
"certFile": "/host/certs/client.crt",
29+
"keyFile" : "/host/certs/client.key"
30+
}
31+
}
32+
]
33+
}

deploy/tas-deployment.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ spec:
2828
- /extender
2929
- --cert=/tas/cert/tls.crt
3030
- --key=/tas/cert/tls.key
31+
- --cacert=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
3132
image: tas-extender
3233
imagePullPolicy: IfNotPresent
3334
volumeMounts:

pkg/scheduler/scheduler.go

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package scheduler
33

44
import (
55
"crypto/tls"
6+
"crypto/x509"
67
"encoding/json"
78
"errors"
89
"fmt"
10+
"io/ioutil"
911

1012
"github.com/intel/telemetry-aware-scheduling/pkg/cache"
1113
"github.com/intel/telemetry-aware-scheduling/pkg/metrics"
@@ -276,7 +278,7 @@ func checkSymLinks(filename string) error {
276278

277279
// StartServer starts the HTTP server needed for scheduler.
278280
// It registers the handlers and checks for existing telemetry policies.
279-
func (m MetricsExtender) StartServer(port string, certFile string, keyFile string, unsafe bool) {
281+
func (m MetricsExtender) StartServer(port string, certFile string, keyFile string, caFile string, unsafe bool) {
280282
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { m.errorHandler(w, r) })
281283
http.HandleFunc("/scheduler/prioritize", func(w http.ResponseWriter, r *http.Request) { m.Prioritize(w, r) })
282284
http.HandleFunc("/scheduler/filter", func(w http.ResponseWriter, r *http.Request) { m.Filter(w, r) })
@@ -293,23 +295,41 @@ func (m MetricsExtender) StartServer(port string, certFile string, keyFile strin
293295
if err != nil {
294296
panic(err)
295297
}
298+
err = checkSymLinks(caFile)
299+
if err != nil {
300+
panic(err)
301+
}
296302
log.Printf("Extender Now Listening on HTTPS %v", port)
297-
srv := configureSecureServer(port)
303+
srv := configureSecureServer(port, caFile)
298304
log.Fatal(srv.ListenAndServeTLS(certFile, keyFile))
299305
}
300306
log.Printf("Scheduler extender failed %v ", err)
301307
}
302308

303309
//Configuration values including algorithms etc for the TAS scheduling endpoint.
304-
func configureSecureServer(port string) *http.Server {
310+
func configureSecureServer(port string, caFile string) *http.Server {
311+
caCert, err := ioutil.ReadFile(caFile)
312+
if err != nil {
313+
log.Fatal(err)
314+
}
315+
caCertPool := x509.NewCertPool()
316+
caCertPool.AppendCertsFromPEM(caCert)
317+
305318
cfg := &tls.Config{
306-
MinVersion: tls.VersionTLS12,
307-
CurvePreferences: []tls.CurveID{tls.CurveP521, tls.CurveP384, tls.CurveP256},
308-
PreferServerCipherSuites: true,
309-
CipherSuites: []uint16{
319+
MinVersion: tls.VersionTLS12,
320+
CurvePreferences: []tls.CurveID{tls.CurveP521, tls.CurveP384, tls.CurveP256},
321+
ClientCAs: caCertPool,
322+
ClientAuth: tls.RequireAndVerifyClientCert,
323+
PreferServerCipherSuites: true,
324+
InsecureSkipVerify: false,
325+
CipherSuites: []uint16{
326+
// tls 1.2
310327
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
328+
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
329+
// tls 1.3 configuration not supported
311330
},
312331
}
332+
313333
srv := &http.Server{
314334
Addr: ":" + port,
315335
Handler: nil,

0 commit comments

Comments
 (0)