Skip to content

Commit 35dcbe2

Browse files
committed
add kube-apiserver wiring
1 parent e2db510 commit 35dcbe2

File tree

8 files changed

+533
-26
lines changed

8 files changed

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

0 commit comments

Comments
 (0)