Skip to content

Commit 65f935d

Browse files
authored
Merge pull request kubesphere#3344 from wansir/workspace-quota
support workspace resource quota
2 parents b4b7cc4 + 70fa240 commit 65f935d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+7397
-31
lines changed

cmd/controller-manager/app/server.go

+24-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package app
1818

1919
import (
2020
"fmt"
21+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2122
"k8s.io/apimachinery/pkg/labels"
2223
"kubesphere.io/kubesphere/pkg/controller/application"
2324
"os"
@@ -32,6 +33,7 @@ import (
3233
controllerconfig "kubesphere.io/kubesphere/pkg/apiserver/config"
3334
"kubesphere.io/kubesphere/pkg/controller/namespace"
3435
"kubesphere.io/kubesphere/pkg/controller/network/webhooks"
36+
"kubesphere.io/kubesphere/pkg/controller/quota"
3537
"kubesphere.io/kubesphere/pkg/controller/serviceaccount"
3638
"kubesphere.io/kubesphere/pkg/controller/user"
3739
"kubesphere.io/kubesphere/pkg/controller/workspace"
@@ -194,29 +196,32 @@ func run(s *options.KubeSphereControllerManagerOptions, stopCh <-chan struct{})
194196
klog.Fatalf("unable add APIs to scheme: %v", err)
195197
}
196198

199+
// register common meta types into schemas.
200+
metav1.AddToGroupVersion(mgr.GetScheme(), metav1.SchemeGroupVersion)
201+
197202
workspaceTemplateReconciler := &workspacetemplate.Reconciler{MultiClusterEnabled: s.MultiClusterOptions.Enable}
198203
if err = workspaceTemplateReconciler.SetupWithManager(mgr); err != nil {
199-
klog.Fatal("Unable to create workspace template controller")
204+
klog.Fatalf("Unable to create workspace template controller: %v", err)
200205
}
201206

202207
workspaceReconciler := &workspace.Reconciler{}
203208
if err = workspaceReconciler.SetupWithManager(mgr); err != nil {
204-
klog.Fatal("Unable to create workspace controller")
209+
klog.Fatalf("Unable to create workspace controller: %v", err)
205210
}
206211

207212
workspaceRoleReconciler := &workspacerole.Reconciler{MultiClusterEnabled: s.MultiClusterOptions.Enable}
208213
if err = workspaceRoleReconciler.SetupWithManager(mgr); err != nil {
209-
klog.Fatal("Unable to create workspace role controller")
214+
klog.Fatalf("Unable to create workspace role controller: %v", err)
210215
}
211216

212217
workspaceRoleBindingReconciler := &workspacerolebinding.Reconciler{MultiClusterEnabled: s.MultiClusterOptions.Enable}
213218
if err = workspaceRoleBindingReconciler.SetupWithManager(mgr); err != nil {
214-
klog.Fatal("Unable to create workspace role binding controller")
219+
klog.Fatalf("Unable to create workspace role binding controller: %v", err)
215220
}
216221

217222
namespaceReconciler := &namespace.Reconciler{}
218223
if err = namespaceReconciler.SetupWithManager(mgr); err != nil {
219-
klog.Fatal("Unable to create namespace controller")
224+
klog.Fatalf("Unable to create namespace controller: %v", err)
220225
}
221226

222227
selector, _ := labels.Parse(s.ApplicationSelector)
@@ -227,13 +232,17 @@ func run(s *options.KubeSphereControllerManagerOptions, stopCh <-chan struct{})
227232
ApplicationSelector: selector,
228233
}
229234
if err = applicationReconciler.SetupWithManager(mgr); err != nil {
230-
klog.Fatal("Unable to create application controller")
235+
klog.Fatalf("Unable to create application controller: %v", err)
231236
}
232237

233238
saReconciler := &serviceaccount.Reconciler{}
234-
235239
if err = saReconciler.SetupWithManager(mgr); err != nil {
236-
klog.Fatal("Unable to create ServiceAccount controller")
240+
klog.Fatalf("Unable to create ServiceAccount controller: %v", err)
241+
}
242+
243+
resourceQuotaReconciler := quota.Reconciler{}
244+
if err := resourceQuotaReconciler.SetupWithManager(mgr, quota.DefaultMaxConcurrentReconciles, quota.DefaultResyncPeriod, informerFactory.KubernetesSharedInformerFactory()); err != nil {
245+
klog.Fatalf("Unable to create ResourceQuota controller: %v", err)
237246
}
238247

239248
// TODO(jeff): refactor config with CRD
@@ -263,10 +272,16 @@ func run(s *options.KubeSphereControllerManagerOptions, stopCh <-chan struct{})
263272
hookServer := mgr.GetWebhookServer()
264273

265274
klog.V(2).Info("registering webhooks to the webhook server")
266-
hookServer.Register("/validate-email-iam-kubesphere-io-v1alpha2-user", &webhook.Admission{Handler: &user.EmailValidator{Client: mgr.GetClient()}})
275+
hookServer.Register("/validate-email-iam-kubesphere-io-v1alpha2", &webhook.Admission{Handler: &user.EmailValidator{Client: mgr.GetClient()}})
267276
hookServer.Register("/validate-network-kubesphere-io-v1alpha1", &webhook.Admission{Handler: &webhooks.ValidatingHandler{C: mgr.GetClient()}})
268277
hookServer.Register("/mutate-network-kubesphere-io-v1alpha1", &webhook.Admission{Handler: &webhooks.MutatingHandler{C: mgr.GetClient()}})
269278

279+
resourceQuotaAdmission, err := quota.NewResourceQuotaAdmission(mgr.GetClient(), mgr.GetScheme())
280+
if err != nil {
281+
klog.Fatalf("unable to create resource quota admission: %v", err)
282+
}
283+
hookServer.Register("/validate-quota-kubesphere-io-v1alpha2", &webhook.Admission{Handler: resourceQuotaAdmission})
284+
270285
klog.V(2).Info("registering metrics to the webhook server")
271286
hookServer.Register("/metrics", metrics.Handler())
272287

config/crds/quota.kubesphere.io_resourcequotas.yaml

+170
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/webhook/iam.yaml

+3-18
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ webhooks:
88
clientConfig:
99
caBundle: <caBundle>
1010
service:
11-
name: webhook-service
11+
name: ks-controller-manager
1212
namespace: kubesphere-system
13-
path: /validate-email-iam-kubesphere-io-v1alpha2-user
13+
path: /validate-email-iam-kubesphere-io-v1alpha2
1414
failurePolicy: Fail
1515
name: vemail.iam.kubesphere.io
1616
rules:
@@ -22,19 +22,4 @@ webhooks:
2222
- CREATE
2323
- UPDATE
2424
resources:
25-
- users
26-
27-
---
28-
29-
apiVersion: v1
30-
kind: Service
31-
metadata:
32-
name: webhook-service
33-
namespace: kubesphere-system
34-
spec:
35-
ports:
36-
- port: 443
37-
targetPort: 443
38-
selector:
39-
app: ks-controller-manager
40-
tier: backend
25+
- users
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: ks-controller-manager
5+
namespace: kubesphere-system
6+
spec:
7+
ports:
8+
- port: 443
9+
protocol: TCP
10+
targetPort: 8443
11+
selector:
12+
app: ks-controller-manager
13+
tier: backend

config/webhook/nsnp.yaml config/webhook/network.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ webhooks:
77
- clientConfig:
88
caBundle: <caBundle>
99
service:
10-
name: kubesphere-controller-manager-service
10+
name: ks-controller-manager
1111
namespace: kubesphere-system
12-
path: /validate-nsnp-kubesphere-io-v1alpha1-network
12+
path: /validate-network-kubesphere-io-v1alpha1
1313
failurePolicy: Fail
1414
name: validate.nsnp.kubesphere.io
1515
rules:

config/webhook/quota.yaml

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingWebhookConfiguration
3+
metadata:
4+
name: resourcesquotas.quota.kubesphere.io
5+
webhooks:
6+
- admissionReviewVersions:
7+
- v1beta1
8+
clientConfig:
9+
caBundle: <caBundle>
10+
service:
11+
name: ks-controller-manager
12+
namespace: kubesphere-system
13+
path: /validate-quota-kubesphere-io-v1alpha2
14+
port: 443
15+
failurePolicy: Ignore
16+
matchPolicy: Exact
17+
name: resourcesquotas.quota.kubesphere.io
18+
namespaceSelector: {}
19+
objectSelector: {}
20+
rules:
21+
- apiGroups:
22+
- '*'
23+
apiVersions:
24+
- '*'
25+
operations:
26+
- CREATE
27+
resources:
28+
- pods
29+
scope: '*'
30+
sideEffects: None

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ require (
4343
github.com/google/go-cmp v0.5.0
4444
github.com/google/uuid v1.1.1
4545
github.com/gorilla/websocket v1.4.1
46+
github.com/hashicorp/golang-lru v0.5.4
4647
github.com/json-iterator/go v1.1.10
4748
github.com/kelseyhightower/envconfig v1.4.0 // indirect
4849
github.com/kr/text v0.2.0 // indirect
@@ -733,7 +734,6 @@ replace (
733734
gopkg.in/tchap/go-patricia.v2 => gopkg.in/tchap/go-patricia.v2 v2.2.6
734735
gopkg.in/tomb.v1 => gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
735736
gopkg.in/warnings.v0 => gopkg.in/warnings.v0 v0.1.2
736-
gopkg.in/yaml.v1 => gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0
737737
gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.3.0
738738
gopkg.in/yaml.v3 => gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
739739
gotest.tools => gotest.tools v2.2.0+incompatible

hack/generate_client.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
set -e
44

5-
GV="network:v1alpha1 servicemesh:v1alpha2 tenant:v1alpha1 tenant:v1alpha2 devops:v1alpha1 iam:v1alpha2 devops:v1alpha3 cluster:v1alpha1 storage:v1alpha1 auditing:v1alpha1 types:v1beta1"
5+
GV="network:v1alpha1 servicemesh:v1alpha2 tenant:v1alpha1 tenant:v1alpha2 devops:v1alpha1 iam:v1alpha2 devops:v1alpha3 cluster:v1alpha1 storage:v1alpha1 auditing:v1alpha1 types:v1beta1 quota:v1alpha2"
66

77
rm -rf ./pkg/client
88
./hack/generate_group.sh "client,lister,informer" kubesphere.io/kubesphere/pkg/client kubesphere.io/kubesphere/pkg/apis "$GV" --output-base=./ -h "$PWD/hack/boilerplate.go.txt"

0 commit comments

Comments
 (0)