Skip to content

Commit 73ac756

Browse files
bootstrap 2
1 parent 40115bc commit 73ac756

File tree

6 files changed

+281
-42
lines changed

6 files changed

+281
-42
lines changed

pkg/cmd/server/bootstrappolicy/infra_sa_policy.go

+49
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"k8s.io/kubernetes/pkg/apis/apps"
88
"k8s.io/kubernetes/pkg/apis/autoscaling"
99
"k8s.io/kubernetes/pkg/apis/batch"
10+
"k8s.io/kubernetes/pkg/apis/certificates"
1011
"k8s.io/kubernetes/pkg/apis/extensions"
1112
"k8s.io/kubernetes/pkg/apis/policy"
1213
"k8s.io/kubernetes/pkg/apis/storage"
@@ -67,6 +68,9 @@ const (
6768
InfraPetSetControllerServiceAccountName = "pet-set-controller"
6869
PetSetControllerRoleName = "system:pet-set-controller"
6970

71+
InfraCertificateSigningControllerServiceAccountName = "certificate-signing-controller"
72+
CertificateSigningControllerRoleName = "system:certificate-signing-controller"
73+
7074
InfraUnidlingControllerServiceAccountName = "unidling-controller"
7175
UnidlingControllerRoleName = "system:unidling-controller"
7276

@@ -78,6 +82,9 @@ const (
7882

7983
InfraServiceIngressIPControllerServiceAccountName = "service-ingress-ip-controller"
8084
ServiceIngressIPControllerRoleName = "system:service-ingress-ip-controller"
85+
86+
InfraNodeBootstrapServiceAccountName = "node-bootstrap"
87+
NodeBootstrapRoleName = "system:node-bootstrap"
8188
)
8289

8390
type InfraServiceAccounts struct {
@@ -981,6 +988,30 @@ func init() {
981988
panic(err)
982989
}
983990

991+
err = InfraSAs.addServiceAccount(
992+
InfraCertificateSigningControllerServiceAccountName,
993+
authorizationapi.ClusterRole{
994+
ObjectMeta: kapi.ObjectMeta{
995+
Name: CertificateSigningControllerRoleName,
996+
},
997+
Rules: []authorizationapi.PolicyRule{
998+
{
999+
APIGroups: []string{certificates.GroupName},
1000+
Verbs: sets.NewString("list", "watch"),
1001+
Resources: sets.NewString("certificatesigningrequests"),
1002+
},
1003+
{
1004+
APIGroups: []string{certificates.GroupName},
1005+
Verbs: sets.NewString("update"),
1006+
Resources: sets.NewString("certificatesigningrequests/status", "certificatesigningrequests/approval"),
1007+
},
1008+
},
1009+
},
1010+
)
1011+
if err != nil {
1012+
panic(err)
1013+
}
1014+
9841015
err = InfraSAs.addServiceAccount(
9851016
InfraEndpointControllerServiceAccountName,
9861017
authorizationapi.ClusterRole{
@@ -1050,4 +1081,22 @@ func init() {
10501081
panic(err)
10511082
}
10521083

1084+
err = InfraSAs.addServiceAccount(
1085+
InfraNodeBootstrapServiceAccountName,
1086+
authorizationapi.ClusterRole{
1087+
ObjectMeta: kapi.ObjectMeta{
1088+
Name: NodeBootstrapRoleName,
1089+
},
1090+
Rules: []authorizationapi.PolicyRule{
1091+
{
1092+
APIGroups: []string{certificates.GroupName},
1093+
Verbs: sets.NewString("create", "get"),
1094+
Resources: sets.NewString("certificatesigningrequests"),
1095+
},
1096+
},
1097+
},
1098+
)
1099+
if err != nil {
1100+
panic(err)
1101+
}
10531102
}

pkg/cmd/server/bootstrappolicy/policy.go

+2
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,8 @@ func GetBootstrapClusterRoles() []authorizationapi.ClusterRole {
635635
// TODO: change glusterfs to use DNS lookup so this isn't needed?
636636
// Needed for glusterfs volumes
637637
authorizationapi.NewRule("get").Groups(kapiGroup).Resources("endpoints").RuleOrDie(),
638+
// Nodes are allowed to request CSRs (specifically, request serving certs)
639+
authorizationapi.NewRule("get", "create").Groups(certificates.GroupName).Resources("certificatesigningrequests").RuleOrDie(),
638640
},
639641
},
640642

pkg/cmd/server/kubernetes/master.go

+21
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"k8s.io/kubernetes/pkg/client/typed/dynamic"
3131
kclient "k8s.io/kubernetes/pkg/client/unversioned"
3232
clientadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
33+
certcontroller "k8s.io/kubernetes/pkg/controller/certificates"
3334
"k8s.io/kubernetes/pkg/controller/deployment"
3435
"k8s.io/kubernetes/pkg/controller/garbagecollector/metaonly"
3536
"k8s.io/kubernetes/pkg/master"
@@ -484,3 +485,23 @@ func (c *MasterConfig) createSchedulerConfig() (*scheduler.Config, error) {
484485
// if the config file isn't provided, use the default provider
485486
return configFactory.CreateFromProvider(factory.DefaultProvider)
486487
}
488+
489+
func (c *MasterConfig) RunCertificateSigningController(client *client.Client) {
490+
if len(c.ControllerManager.ApproveAllKubeletCSRsForGroup) == 0 {
491+
return
492+
}
493+
resyncPeriod := kctrlmgr.ResyncPeriod(c.ControllerManager)()
494+
clientset := clientadapter.FromUnversionedClient(client)
495+
approver := certcontroller.NewGroupApprover(clientset.Certificates().CertificateSigningRequests(), c.ControllerManager.ApproveAllKubeletCSRsForGroup, "system:nodes")
496+
certController, err := certcontroller.NewCertificateController(
497+
clientset,
498+
resyncPeriod,
499+
c.ControllerManager.ClusterSigningCertFile,
500+
c.ControllerManager.ClusterSigningKeyFile,
501+
approver,
502+
)
503+
if err != nil {
504+
glog.Fatalf("Failed to start certificate controller: %v", err)
505+
}
506+
go certController.Run(1, utilwait.NeverStop)
507+
}

pkg/cmd/server/kubernetes/master_config.go

+2
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
178178
// Defaults are tested in TestCMServerDefaults
179179
cmserver := cmapp.NewCMServer()
180180
// Adjust defaults
181+
cmserver.ClusterSigningCertFile = ""
182+
cmserver.ClusterSigningKeyFile = ""
181183
cmserver.Address = "" // no healthz endpoint
182184
cmserver.Port = 0 // no healthz endpoint
183185
cmserver.EnableGarbageCollector = false // disabled until we add the controller

pkg/cmd/server/start/start_master.go

+19
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,18 @@ func NewCommandStartMaster(basename string, out, errout io.Writer) (*cobra.Comma
120120
config.KubernetesMasterConfig.MasterIP = ip.String()
121121
}
122122
}
123+
if config.KubernetesMasterConfig != nil {
124+
args := config.KubernetesMasterConfig.ControllerArguments
125+
if args == nil {
126+
args = make(configapi.ExtendedArguments)
127+
config.KubernetesMasterConfig.ControllerArguments = args
128+
}
129+
if len(args["cluster-signing-cert-file"]) == 0 && len(args["cluster-signing-key-file"]) == 0 && len(args["insecure-experimental-approve-all-kubelet-csrs-for-group"]) == 0 {
130+
args["cluster-signing-cert-file"] = []string{admin.DefaultCertFilename(options.MasterArgs.ConfigDir.Value(), admin.CAFilePrefix)}
131+
args["cluster-signing-key-file"] = []string{admin.DefaultKeyFilename(options.MasterArgs.ConfigDir.Value(), admin.CAFilePrefix)}
132+
args["insecure-experimental-approve-all-kubelet-csrs-for-group"] = []string{"system:serviceaccounts:openshift-infra"}
133+
}
134+
}
123135
return nil
124136
}
125137

@@ -645,6 +657,11 @@ func startControllers(oc *origin.MasterConfig, kc *kubernetes.MasterConfig) erro
645657
glog.Fatalf("Could not get client for pet set controller: %v", err)
646658
}
647659

660+
_, _, certificateSigningClient, err := oc.GetServiceAccountClients(bootstrappolicy.InfraCertificateSigningControllerServiceAccountName)
661+
if err != nil {
662+
glog.Fatalf("Could not get client for disruption budget controller: %v", err)
663+
}
664+
648665
namespaceControllerClientConfig, _, namespaceControllerKubeClient, err := oc.GetServiceAccountClients(bootstrappolicy.InfraNamespaceControllerServiceAccountName)
649666
if err != nil {
650667
glog.Fatalf("Could not get client for namespace controller: %v", err)
@@ -695,6 +712,8 @@ func startControllers(oc *origin.MasterConfig, kc *kubernetes.MasterConfig) erro
695712

696713
kc.RunServiceLoadBalancerController(serviceLoadBalancerClient)
697714

715+
kc.RunCertificateSigningController(certificateSigningClient)
716+
698717
appsEnabled := len(configapi.GetEnabledAPIVersionsForGroup(kc.Options, apps.GroupName)) > 0
699718
if appsEnabled {
700719
kc.RunPetSetController(petSetClient)

0 commit comments

Comments
 (0)