Skip to content

Commit 56b49c9

Browse files
deads2ksoltysh
authored andcommitted
UPSTREAM: <carry>: kube-apiserver: allow injection of kube-apiserver options
Origin-commit: 33a71aff9bb4e204bf2e15af4cdfb5bd0525ce4e openshift-rebase(v1.24):source=ee6f24dc718
1 parent dd3aeca commit 56b49c9

File tree

7 files changed

+125
-4
lines changed

7 files changed

+125
-4
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package app
2+
3+
import (
4+
"k8s.io/apiserver/pkg/admission"
5+
genericapiserver "k8s.io/apiserver/pkg/server"
6+
clientgoinformers "k8s.io/client-go/informers"
7+
"k8s.io/kubernetes/pkg/master"
8+
)
9+
10+
type KubeAPIServerConfigFunc func(config *genericapiserver.Config, versionedInformers clientgoinformers.SharedInformerFactory, pluginInitializers *[]admission.PluginInitializer) (genericapiserver.DelegationTarget, error)
11+
12+
var OpenShiftKubeAPIServerConfigPatch KubeAPIServerConfigFunc = nil
13+
14+
type KubeAPIServerServerFunc func(server *master.Master) error
15+
16+
func PatchKubeAPIServerConfig(config *genericapiserver.Config, versionedInformers clientgoinformers.SharedInformerFactory, pluginInitializers *[]admission.PluginInitializer) (genericapiserver.DelegationTarget, error) {
17+
if OpenShiftKubeAPIServerConfigPatch == nil {
18+
return genericapiserver.NewEmptyDelegate(), nil
19+
}
20+
21+
return OpenShiftKubeAPIServerConfigPatch(config, versionedInformers, pluginInitializers)
22+
}
23+
24+
var OpenShiftKubeAPIServerServerPatch KubeAPIServerServerFunc = nil
25+
26+
func PatchKubeAPIServerServer(server *master.Master) error {
27+
if OpenShiftKubeAPIServerServerPatch == nil {
28+
return nil
29+
}
30+
31+
return OpenShiftKubeAPIServerServerPatch(server)
32+
}
33+
34+
var StartingDelegate genericapiserver.DelegationTarget = genericapiserver.NewEmptyDelegate()

cmd/kube-apiserver/app/server.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ func CreateServerChain(completedOptions completedServerRunOptions) (*aggregatora
200200
return nil, err
201201
}
202202

203+
if err := PatchKubeAPIServerServer(kubeAPIServer); err != nil {
204+
return nil, err
205+
}
206+
203207
// aggregator comes last in the chain
204208
aggregatorConfig, err := createAggregatorConfig(*kubeAPIServerConfig.GenericConfig, completedOptions.ServerRunOptions, kubeAPIServerConfig.ExtraConfig.VersionedInformers, serviceResolver, kubeAPIServerConfig.ExtraConfig.ProxyTransport, pluginInitializer)
205209
if err != nil {
@@ -355,6 +359,7 @@ func CreateKubeAPIServerConfig(s completedServerRunOptions) (
355359
func buildGenericConfig(
356360
s *options.ServerRunOptions,
357361
proxyTransport *http.Transport,
362+
358363
) (
359364
genericConfig *genericapiserver.Config,
360365
versionedInformers clientgoinformers.SharedInformerFactory,
@@ -476,6 +481,12 @@ func buildGenericConfig(
476481
return
477482
}
478483

484+
StartingDelegate, err = PatchKubeAPIServerConfig(genericConfig, versionedInformers, &pluginInitializers)
485+
if err != nil {
486+
lastErr = fmt.Errorf("failed to patch: %v", err)
487+
return
488+
}
489+
479490
err = s.Admission.ApplyTo(
480491
genericConfig,
481492
versionedInformers,

pkg/kubeapiserver/options/admission.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ func (a *AdmissionOptions) ApplyTo(
116116
return nil
117117
}
118118

119+
a.GenericAdmission.Decorators = append(a.GenericAdmission.Decorators, Decorators...)
120+
119121
if a.PluginNames != nil {
120122
// pass PluginNames to generic AdmissionOptions
121123
a.GenericAdmission.EnablePlugins, a.GenericAdmission.DisablePlugins = computePluginNames(a.PluginNames, a.GenericAdmission.RecommendedPluginOrder)

pkg/kubeapiserver/options/patch.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package options
2+
3+
import "k8s.io/apiserver/pkg/admission"
4+
5+
var RegisterAllAdmissionPlugins = registerAllAdmissionPlugins
6+
7+
var DefaultOffAdmissionPlugins = defaultOffAdmissionPlugins
8+
9+
var Decorators = []admission.Decorator{}

pkg/kubeapiserver/options/plugins.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func RegisterAllAdmissionPlugins(plugins *admission.Plugins) {
139139
}
140140

141141
// DefaultOffAdmissionPlugins get admission plugins off by default for kube-apiserver.
142-
func DefaultOffAdmissionPlugins() sets.String {
142+
func defaultOffAdmissionPlugins() sets.String {
143143
defaultOnPlugins := sets.NewString(
144144
lifecycle.PluginName, // NamespaceLifecycle
145145
limitranger.PluginName, // LimitRanger
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package bootstrappolicy
2+
3+
import (
4+
rbacv1 "k8s.io/api/rbac/v1"
5+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
6+
rbacv1helpers "k8s.io/kubernetes/pkg/apis/rbac/v1"
7+
)
8+
9+
var ClusterRoles = clusterRoles
10+
11+
func OpenshiftClusterRoles() []rbacv1.ClusterRole {
12+
const (
13+
// These are valid under the "nodes" resource
14+
NodeMetricsSubresource = "metrics"
15+
NodeStatsSubresource = "stats"
16+
NodeSpecSubresource = "spec"
17+
NodeLogSubresource = "log"
18+
)
19+
20+
roles := clusterRoles()
21+
roles = append(roles, []rbacv1.ClusterRole{
22+
{
23+
ObjectMeta: metav1.ObjectMeta{
24+
Name: "system:node-admin",
25+
},
26+
Rules: []rbacv1.PolicyRule{
27+
// Allow read-only access to the API objects
28+
rbacv1helpers.NewRule(Read...).Groups(legacyGroup).Resources("nodes").RuleOrDie(),
29+
// Allow all API calls to the nodes
30+
rbacv1helpers.NewRule("proxy").Groups(legacyGroup).Resources("nodes").RuleOrDie(),
31+
rbacv1helpers.NewRule("*").Groups(legacyGroup).Resources("nodes/proxy", "nodes/"+NodeMetricsSubresource, "nodes/"+NodeSpecSubresource, "nodes/"+NodeStatsSubresource, "nodes/"+NodeLogSubresource).RuleOrDie(),
32+
},
33+
},
34+
{
35+
ObjectMeta: metav1.ObjectMeta{
36+
Name: "system:node-reader",
37+
},
38+
Rules: []rbacv1.PolicyRule{
39+
// Allow read-only access to the API objects
40+
rbacv1helpers.NewRule(Read...).Groups(legacyGroup).Resources("nodes").RuleOrDie(),
41+
// Allow read access to node metrics
42+
rbacv1helpers.NewRule("get").Groups(legacyGroup).Resources("nodes/"+NodeMetricsSubresource, "nodes/"+NodeSpecSubresource).RuleOrDie(),
43+
// Allow read access to stats
44+
// Node stats requests are submitted as POSTs. These creates are non-mutating
45+
rbacv1helpers.NewRule("get", "create").Groups(legacyGroup).Resources("nodes/" + NodeStatsSubresource).RuleOrDie(),
46+
// TODO: expose other things like /healthz on the node once we figure out non-resource URL policy across systems
47+
},
48+
},
49+
}...)
50+
51+
addClusterRoleLabel(roles)
52+
return roles
53+
}
54+
55+
var ClusterRoleBindings = clusterRoleBindings
56+
57+
func OpenshiftClusterRoleBindings() []rbacv1.ClusterRoleBinding {
58+
bindings := clusterRoleBindings()
59+
bindings = append(bindings, []rbacv1.ClusterRoleBinding{
60+
rbacv1helpers.NewClusterBinding("system:node-admin").Users("system:master", "system:kube-apiserver").Groups("system:node-admins").BindingOrDie(),
61+
}...)
62+
63+
addClusterRoleBindingLabel(bindings)
64+
return bindings
65+
}

plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ func NodeRules() []rbacv1.PolicyRule {
175175
return nodePolicyRules
176176
}
177177

178-
// ClusterRoles returns the cluster roles to bootstrap an API server with
179-
func ClusterRoles() []rbacv1.ClusterRole {
178+
// clusterRoles returns the cluster roles to bootstrap an API server with
179+
func clusterRoles() []rbacv1.ClusterRole {
180180
roles := []rbacv1.ClusterRole{
181181
{
182182
// a "root" role which can do absolutely anything
@@ -566,7 +566,7 @@ func ClusterRoles() []rbacv1.ClusterRole {
566566
const systemNodeRoleName = "system:node"
567567

568568
// ClusterRoleBindings return default rolebindings to the default roles
569-
func ClusterRoleBindings() []rbacv1.ClusterRoleBinding {
569+
func clusterRoleBindings() []rbacv1.ClusterRoleBinding {
570570
rolebindings := []rbacv1.ClusterRoleBinding{
571571
rbacv1helpers.NewClusterBinding("cluster-admin").Groups(user.SystemPrivilegedGroup).BindingOrDie(),
572572
rbacv1helpers.NewClusterBinding("system:monitoring").Groups(user.MonitoringGroup).BindingOrDie(),

0 commit comments

Comments
 (0)