Skip to content

Commit f9b0ce8

Browse files
committed
add kube-apiserver wiring
1 parent ecc5766 commit f9b0ce8

File tree

6 files changed

+244
-30
lines changed

6 files changed

+244
-30
lines changed
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package openshiftkubeapiserver
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"sort"
7+
8+
configapi "github.com/openshift/origin/pkg/cmd/server/apis/config"
9+
)
10+
11+
func ConfigToFlags(kubeAPIServerConfig *configapi.MasterConfig) ([]string, error) {
12+
args := map[string][]string{}
13+
for key, slice := range kubeAPIServerConfig.KubernetesMasterConfig.APIServerArguments {
14+
for _, val := range slice {
15+
args[key] = append(args[key], val)
16+
}
17+
}
18+
19+
host, portString, err := net.SplitHostPort(kubeAPIServerConfig.ServingInfo.BindAddress)
20+
if err != nil {
21+
return nil, err
22+
}
23+
24+
// these flags are overridden by a patch
25+
// admission-control
26+
// authentication-token-webhook-cache-ttl
27+
// authentication-token-webhook-config-file
28+
// authorization-mode
29+
// authorization-policy-file
30+
// authorization-webhook-cache-authorized-ttl
31+
// authorization-webhook-cache-unauthorized-ttl
32+
// authorization-webhook-config-file
33+
// basic-auth-file
34+
// enable-aggregator-routing
35+
// enable-bootstrap-token-auth
36+
// oidc-client-id
37+
// oidc-groups-claim
38+
// oidc-groups-prefix
39+
// oidc-issuer-url
40+
// oidc-required-claim
41+
// oidc-signing-algs
42+
// oidc-username-claim
43+
// oidc-username-prefix
44+
// service-account-lookup
45+
// token-auth-file
46+
47+
// alsologtostderr - don't know whether to change it
48+
// apiserver-count - ignored, hopefully we don't have to fix via patch
49+
// cert-dir - ignored because we set certs
50+
51+
// these flags were never supported via config
52+
// cloud-config
53+
// cloud-provider
54+
// cloud-provider-gce-lb-src-cidrs
55+
// contention-profiling
56+
// default-not-ready-toleration-seconds
57+
// default-unreachable-toleration-seconds
58+
// default-watch-cache-size
59+
// delete-collection-workers
60+
// deserialization-cache-size
61+
// enable-garbage-collector
62+
// etcd-compaction-interval
63+
// etcd-count-metric-poll-period
64+
// etcd-servers-overrides
65+
// experimental-encryption-provider-config
66+
// feature-gates
67+
// http2-max-streams-per-connection
68+
// insecure-bind-address
69+
// kubelet-timeout
70+
// log-backtrace-at
71+
// log-dir
72+
// log-flush-frequency
73+
// logtostderr
74+
// master-service-namespace
75+
// max-connection-bytes-per-sec
76+
// profiling
77+
// request-timeout
78+
// runtime-config
79+
// service-account-api-audiences
80+
// service-account-issuer
81+
// service-account-key-file
82+
// service-account-max-token-expiration
83+
// service-account-signing-key-file
84+
// stderrthreshold
85+
// storage-versions
86+
// target-ram-mb
87+
// v
88+
// version
89+
// vmodule
90+
// watch-cache
91+
// watch-cache-sizes
92+
93+
// TODO, we need to set these in order to enable the right admission plugins in each of the servers
94+
// TODO this is needed for a viable cluster up
95+
//setIfUnset(args, "admission-control-config-file", "AdmissionConfiguration file")
96+
//setIfUnset(args, "disable-admission-plugins", "AdmissionConfiguration file")
97+
//setIfUnset(args, "enable-admission-plugins", "AdmissionConfiguration file")
98+
99+
setIfUnset(args, "allow-privileged", "true")
100+
setIfUnset(args, "anonymous-auth", "false")
101+
setIfUnset(args, "authorization-mode", "RBAC") // overridden later, but this runs the poststarthook for bootstrapping RBAC
102+
for flag, value := range auditFlags(kubeAPIServerConfig) {
103+
setIfUnset(args, flag, value...)
104+
}
105+
setIfUnset(args, "bind-address", host)
106+
setIfUnset(args, "client-ca-file", kubeAPIServerConfig.ServingInfo.ClientCA)
107+
setIfUnset(args, "cors-allowed-origins", kubeAPIServerConfig.CORSAllowedOrigins...)
108+
setIfUnset(args, "enable-logs-handler", "false")
109+
setIfUnset(args, "enable-swagger-ui", "true")
110+
setIfUnset(args, "endpoint-reconciler-type", "lease")
111+
setIfUnset(args, "etcd-cafile", kubeAPIServerConfig.EtcdClientInfo.CA)
112+
setIfUnset(args, "etcd-certfile", kubeAPIServerConfig.EtcdClientInfo.ClientCert.CertFile)
113+
setIfUnset(args, "etcd-keyfile", kubeAPIServerConfig.EtcdClientInfo.ClientCert.KeyFile)
114+
setIfUnset(args, "etcd-prefix", kubeAPIServerConfig.EtcdStorageConfig.KubernetesStoragePrefix)
115+
setIfUnset(args, "etcd-servers", kubeAPIServerConfig.EtcdClientInfo.URLs...)
116+
setIfUnset(args, "insecure-port", "0")
117+
setIfUnset(args, "kubelet-certificate-authority", kubeAPIServerConfig.KubeletClientInfo.CA)
118+
setIfUnset(args, "kubelet-client-certificate", kubeAPIServerConfig.KubeletClientInfo.ClientCert.CertFile)
119+
setIfUnset(args, "kubelet-client-key", kubeAPIServerConfig.KubeletClientInfo.ClientCert.KeyFile)
120+
setIfUnset(args, "kubelet-https", "true")
121+
setIfUnset(args, "kubelet-preferred-address-types", "Hostname", "InternalIP", "ExternalIP")
122+
setIfUnset(args, "kubelet-read-only-port", "0")
123+
setIfUnset(args, "kubernetes-service-node-port", "0")
124+
setIfUnset(args, "max-mutating-requests-inflight", fmt.Sprintf("%d", kubeAPIServerConfig.ServingInfo.MaxRequestsInFlight/2))
125+
setIfUnset(args, "max-requests-inflight", fmt.Sprintf("%d", kubeAPIServerConfig.ServingInfo.MaxRequestsInFlight))
126+
setIfUnset(args, "min-request-timeout", fmt.Sprintf("%d", kubeAPIServerConfig.ServingInfo.RequestTimeoutSeconds))
127+
setIfUnset(args, "proxy-client-cert-file", kubeAPIServerConfig.AggregatorConfig.ProxyClientInfo.CertFile)
128+
setIfUnset(args, "proxy-client-key-file", kubeAPIServerConfig.AggregatorConfig.ProxyClientInfo.KeyFile)
129+
setIfUnset(args, "requestheader-allowed-names", kubeAPIServerConfig.AuthConfig.RequestHeader.ClientCommonNames...)
130+
setIfUnset(args, "requestheader-client-ca-file", kubeAPIServerConfig.AuthConfig.RequestHeader.ClientCA)
131+
setIfUnset(args, "requestheader-extra-headers-prefix", kubeAPIServerConfig.AuthConfig.RequestHeader.ExtraHeaderPrefixes...)
132+
setIfUnset(args, "requestheader-group-headers", kubeAPIServerConfig.AuthConfig.RequestHeader.GroupHeaders...)
133+
setIfUnset(args, "requestheader-username-headers", kubeAPIServerConfig.AuthConfig.RequestHeader.UsernameHeaders...)
134+
setIfUnset(args, "secure-port", portString)
135+
setIfUnset(args, "service-cluster-ip-range", kubeAPIServerConfig.KubernetesMasterConfig.ServicesSubnet)
136+
setIfUnset(args, "service-node-port-range", kubeAPIServerConfig.KubernetesMasterConfig.ServicesNodePortRange)
137+
setIfUnset(args, "storage-backend", "etcd3")
138+
setIfUnset(args, "storage-media-type", "application/vnd.kubernetes.protobuf")
139+
setIfUnset(args, "tls-cert-file", kubeAPIServerConfig.ServingInfo.ServerCert.CertFile)
140+
setIfUnset(args, "tls-cipher-suites", kubeAPIServerConfig.ServingInfo.CipherSuites...)
141+
setIfUnset(args, "tls-min-version", kubeAPIServerConfig.ServingInfo.MinTLSVersion)
142+
setIfUnset(args, "tls-private-key-file", kubeAPIServerConfig.ServingInfo.ServerCert.KeyFile)
143+
// TODO re-enable SNI for cluster up
144+
// tls-sni-cert-key
145+
setIfUnset(args, "secure-port", portString)
146+
147+
var keys []string
148+
for key := range args {
149+
keys = append(keys, key)
150+
}
151+
sort.Strings(keys)
152+
153+
var arguments []string
154+
for _, key := range keys {
155+
for _, token := range args[key] {
156+
arguments = append(arguments, fmt.Sprintf("--%s=%v", key, token))
157+
}
158+
}
159+
return arguments, nil
160+
}
161+
162+
// currently for cluster up, audit is just broken.
163+
// TODO fix this
164+
func auditFlags(kubeAPIServerConfig *configapi.MasterConfig) map[string][]string {
165+
args := map[string][]string{}
166+
for key, slice := range kubeAPIServerConfig.KubernetesMasterConfig.APIServerArguments {
167+
for _, val := range slice {
168+
args[key] = append(args[key], val)
169+
}
170+
}
171+
172+
return args
173+
}
174+
175+
func setIfUnset(cmdLineArgs map[string][]string, key string, value ...string) {
176+
if _, ok := cmdLineArgs[key]; !ok {
177+
cmdLineArgs[key] = value
178+
}
179+
}

pkg/cmd/openshift-kube-apiserver/openshiftkubeapiserver/patch.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
kexternalinformers "k8s.io/client-go/informers"
1111
"k8s.io/client-go/rest"
1212
"k8s.io/client-go/restmapper"
13+
"k8s.io/kubernetes/cmd/kube-apiserver/app"
1314
internalinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
1415
kinternalinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
1516
"k8s.io/kubernetes/pkg/master"
@@ -43,9 +44,7 @@ type KubeAPIServerServerPatchContext struct {
4344
informerStartFuncs []func(stopCh <-chan struct{})
4445
}
4546

46-
type KubeAPIServerConfigFunc func(config *master.Config, internalInformers internalinformers.SharedInformerFactory, kubeInformers clientgoinformers.SharedInformerFactory, pluginInitializers *[]admission.PluginInitializer, stopCh <-chan struct{}) (genericapiserver.DelegationTarget, error)
47-
48-
func NewOpenShiftKubeAPIServerConfigPatch(delegateAPIServer genericapiserver.DelegationTarget, kubeAPIServerConfig *configapi.MasterConfig) (KubeAPIServerConfigFunc, *KubeAPIServerServerPatchContext) {
47+
func NewOpenShiftKubeAPIServerConfigPatch(delegateAPIServer genericapiserver.DelegationTarget, kubeAPIServerConfig *configapi.MasterConfig) (app.KubeAPIServerConfigFunc, *KubeAPIServerServerPatchContext) {
4948
patchContext := &KubeAPIServerServerPatchContext{
5049
postStartHooks: map[string]genericapiserver.PostStartHookFunc{},
5150
}
Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package openshift_kube_apiserver
22

33
import (
4+
"fmt"
5+
46
"github.com/golang/glog"
57

68
kerrors "k8s.io/apimachinery/pkg/api/errors"
79
utilwait "k8s.io/apimachinery/pkg/util/wait"
8-
"k8s.io/client-go/pkg/version"
9-
aggregatorinstall "k8s.io/kube-aggregator/pkg/apis/apiregistration/install"
10-
"k8s.io/kubernetes/pkg/api/legacyscheme"
10+
genericapiserver "k8s.io/apiserver/pkg/server"
11+
"k8s.io/kubernetes/cmd/kube-apiserver/app"
1112
"k8s.io/kubernetes/pkg/capabilities"
1213
kubelettypes "k8s.io/kubernetes/pkg/kubelet/types"
1314

15+
"github.com/openshift/origin/pkg/cmd/openshift-kube-apiserver/openshiftkubeapiserver"
1416
configapi "github.com/openshift/origin/pkg/cmd/server/apis/config"
1517
"github.com/openshift/origin/pkg/cmd/server/apis/config/validation"
16-
"github.com/openshift/origin/pkg/cmd/server/origin"
17-
"github.com/openshift/origin/pkg/cmd/util/variable"
1818
)
1919

2020
func RunOpenShiftKubeAPIServerServer(masterConfig *configapi.MasterConfig) error {
@@ -28,11 +28,6 @@ func RunOpenShiftKubeAPIServerServer(masterConfig *configapi.MasterConfig) error
2828
},
2929
})
3030

31-
// install aggregator types into the scheme so that "normal" RESTOptionsGetters can work for us.
32-
// done in Start() prior to doing any other initialization so we don't mutate the scheme after it is being used by clients in other goroutines.
33-
// TODO: make scheme threadsafe and do this as part of aggregator config building
34-
aggregatorinstall.Install(legacyscheme.Scheme)
35-
3631
validationResults := validation.ValidateMasterConfig(masterConfig, nil)
3732
if len(validationResults.Warnings) != 0 {
3833
for _, warning := range validationResults.Warnings {
@@ -43,22 +38,22 @@ func RunOpenShiftKubeAPIServerServer(masterConfig *configapi.MasterConfig) error
4338
return kerrors.NewInvalid(configapi.Kind("MasterConfig"), "master-config.yaml", validationResults.Errors)
4439
}
4540

46-
informers := origin.InformerAccess(nil) // use real kube-apiserver loopback client with secret token instead of that from masterConfig.MasterClients.OpenShiftLoopbackKubeConfig
47-
openshiftConfig, err := origin.BuildMasterConfig(*masterConfig, informers)
41+
configPatchFn, serverPatchContext := openshiftkubeapiserver.NewOpenShiftKubeAPIServerConfigPatch(genericapiserver.NewEmptyDelegate(), masterConfig)
42+
app.OpenShiftKubeAPIServerConfigPatch = configPatchFn
43+
app.OpenShiftKubeAPIServerServerPatch = serverPatchContext.PatchServer
44+
45+
cmd := app.NewAPIServerCommand(utilwait.NeverStop)
46+
args, err := openshiftkubeapiserver.ConfigToFlags(masterConfig)
4847
if err != nil {
4948
return err
5049
}
51-
52-
glog.Infof("Starting master on %s (%s)", masterConfig.ServingInfo.BindAddress, version.Get().String())
53-
glog.Infof("Public master address is %s", masterConfig.MasterPublicURL)
54-
imageTemplate := variable.NewDefaultImageTemplate()
55-
imageTemplate.Format = masterConfig.ImageConfig.Format
56-
imageTemplate.Latest = masterConfig.ImageConfig.Latest
57-
glog.Infof("Using images from %q", imageTemplate.ExpandOrDie("<component>"))
58-
59-
if err := openshiftConfig.RunKubeAPIServer(utilwait.NeverStop); err != nil {
50+
if err := cmd.ParseFlags(args); err != nil {
51+
return err
52+
}
53+
glog.Infof("`kube-apiserver %v`", args)
54+
if err := cmd.RunE(cmd, nil); err != nil {
6055
return err
6156
}
6257

63-
return nil
58+
return fmt.Errorf("`kube-apiserver %v` exited", args)
6459
}

vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/apiextensions.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/patch_openshift.go

Lines changed: 33 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/server.go

Lines changed: 9 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)