mirror of https://github.com/k3s-io/k3s
Merge pull request #34556 from deads2k/api-24-initialization
Automatic merge from submit-queue split genericapiserver configuration apart so that you can run withou… …t flag options @dims Take a look at this re-slicing of the `genericapiserver.Config` creation. I think this helps composers overall and resolves the chicken/egg problem you were having.pull/6/head
commit
ca9688218d
|
@ -92,6 +92,13 @@ cluster's shared state through which all other components interact.`,
|
||||||
func Run(s *options.APIServer) error {
|
func Run(s *options.APIServer) error {
|
||||||
genericvalidation.VerifyEtcdServersList(s.ServerRunOptions)
|
genericvalidation.VerifyEtcdServersList(s.ServerRunOptions)
|
||||||
genericapiserver.DefaultAndValidateRunOptions(s.ServerRunOptions)
|
genericapiserver.DefaultAndValidateRunOptions(s.ServerRunOptions)
|
||||||
|
genericConfig := genericapiserver.NewConfig(). // create the new config
|
||||||
|
ApplyOptions(s.ServerRunOptions). // apply the options selected
|
||||||
|
Complete() // set default values based on the known values
|
||||||
|
|
||||||
|
if err := genericConfig.MaybeGenerateServingCerts(); err != nil {
|
||||||
|
glog.Fatalf("Failed to generate service certificate: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
capabilities.Initialize(capabilities.Capabilities{
|
capabilities.Initialize(capabilities.Capabilities{
|
||||||
AllowPrivileged: s.AllowPrivileged,
|
AllowPrivileged: s.AllowPrivileged,
|
||||||
|
@ -322,8 +329,6 @@ func Run(s *options.APIServer) error {
|
||||||
glog.Fatalf("Failed to initialize plugins: %v", err)
|
glog.Fatalf("Failed to initialize plugins: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
genericConfig := genericapiserver.NewConfig(s.ServerRunOptions)
|
|
||||||
// TODO: Move the following to generic api server as well.
|
|
||||||
genericConfig.LoopbackClientConfig = selfClientConfig
|
genericConfig.LoopbackClientConfig = selfClientConfig
|
||||||
genericConfig.Authenticator = apiAuthenticator
|
genericConfig.Authenticator = apiAuthenticator
|
||||||
genericConfig.SupportsBasicAuth = len(s.BasicAuthFile) > 0
|
genericConfig.SupportsBasicAuth = len(s.BasicAuthFile) > 0
|
||||||
|
@ -341,7 +346,7 @@ func Run(s *options.APIServer) error {
|
||||||
genericConfig.EnableOpenAPISupport = true
|
genericConfig.EnableOpenAPISupport = true
|
||||||
|
|
||||||
config := &master.Config{
|
config := &master.Config{
|
||||||
GenericConfig: genericConfig,
|
GenericConfig: genericConfig.Config,
|
||||||
|
|
||||||
StorageFactory: storageFactory,
|
StorageFactory: storageFactory,
|
||||||
EnableWatchCache: s.EnableWatchCache,
|
EnableWatchCache: s.EnableWatchCache,
|
||||||
|
|
|
@ -67,10 +67,15 @@ func Run(serverOptions *genericoptions.ServerRunOptions) error {
|
||||||
serverOptions.StorageConfig.ServerList = []string{"http://127.0.0.1:2379"}
|
serverOptions.StorageConfig.ServerList = []string{"http://127.0.0.1:2379"}
|
||||||
genericvalidation.ValidateRunOptions(serverOptions)
|
genericvalidation.ValidateRunOptions(serverOptions)
|
||||||
genericvalidation.VerifyEtcdServersList(serverOptions)
|
genericvalidation.VerifyEtcdServersList(serverOptions)
|
||||||
config := genericapiserver.NewConfig(serverOptions)
|
config := genericapiserver.NewConfig().ApplyOptions(serverOptions).Complete()
|
||||||
|
if err := config.MaybeGenerateServingCerts(); err != nil {
|
||||||
|
// this wasn't treated as fatal for this process before
|
||||||
|
fmt.Printf("Error creating cert: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
config.Authorizer = authorizer.NewAlwaysAllowAuthorizer()
|
config.Authorizer = authorizer.NewAlwaysAllowAuthorizer()
|
||||||
config.Serializer = api.Codecs
|
config.Serializer = api.Codecs
|
||||||
s, err := config.Complete().New()
|
s, err := config.New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error in bringing up the server: %v", err)
|
return fmt.Errorf("Error in bringing up the server: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,13 @@ cluster's shared state through which all other components interact.`,
|
||||||
func Run(s *options.ServerRunOptions) error {
|
func Run(s *options.ServerRunOptions) error {
|
||||||
genericvalidation.VerifyEtcdServersList(s.ServerRunOptions)
|
genericvalidation.VerifyEtcdServersList(s.ServerRunOptions)
|
||||||
genericapiserver.DefaultAndValidateRunOptions(s.ServerRunOptions)
|
genericapiserver.DefaultAndValidateRunOptions(s.ServerRunOptions)
|
||||||
|
genericConfig := genericapiserver.NewConfig(). // create the new config
|
||||||
|
ApplyOptions(s.ServerRunOptions). // apply the options selected
|
||||||
|
Complete() // set default values based on the known values
|
||||||
|
|
||||||
|
if err := genericConfig.MaybeGenerateServingCerts(); err != nil {
|
||||||
|
glog.Fatalf("Failed to generate service certificate: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: register cluster federation resources here.
|
// TODO: register cluster federation resources here.
|
||||||
resourceConfig := genericapiserver.NewResourceConfig()
|
resourceConfig := genericapiserver.NewResourceConfig()
|
||||||
|
@ -211,8 +218,6 @@ func Run(s *options.ServerRunOptions) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Failed to initialize plugins: %v", err)
|
glog.Fatalf("Failed to initialize plugins: %v", err)
|
||||||
}
|
}
|
||||||
genericConfig := genericapiserver.NewConfig(s.ServerRunOptions)
|
|
||||||
// TODO: Move the following to generic api server as well.
|
|
||||||
genericConfig.LoopbackClientConfig = selfClientConfig
|
genericConfig.LoopbackClientConfig = selfClientConfig
|
||||||
genericConfig.Authenticator = apiAuthenticator
|
genericConfig.Authenticator = apiAuthenticator
|
||||||
genericConfig.SupportsBasicAuth = len(s.BasicAuthFile) > 0
|
genericConfig.SupportsBasicAuth = len(s.BasicAuthFile) > 0
|
||||||
|
@ -234,7 +239,7 @@ func Run(s *options.ServerRunOptions) error {
|
||||||
cachesize.SetWatchCacheSizes(s.WatchCacheSizes)
|
cachesize.SetWatchCacheSizes(s.WatchCacheSizes)
|
||||||
}
|
}
|
||||||
|
|
||||||
m, err := genericConfig.Complete().New()
|
m, err := genericConfig.New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ import (
|
||||||
genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation"
|
genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation"
|
||||||
ipallocator "k8s.io/kubernetes/pkg/registry/core/service/ipallocator"
|
ipallocator "k8s.io/kubernetes/pkg/registry/core/service/ipallocator"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
|
certutil "k8s.io/kubernetes/pkg/util/cert"
|
||||||
utilnet "k8s.io/kubernetes/pkg/util/net"
|
utilnet "k8s.io/kubernetes/pkg/util/net"
|
||||||
"k8s.io/kubernetes/pkg/util/sets"
|
"k8s.io/kubernetes/pkg/util/sets"
|
||||||
)
|
)
|
||||||
|
@ -196,63 +197,22 @@ type CertInfo struct {
|
||||||
Generate bool
|
Generate bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConfig(options *options.ServerRunOptions) *Config {
|
// NewConfig returns a Config struct with the default values
|
||||||
longRunningRE := regexp.MustCompile(options.LongRunningRequestRE)
|
func NewConfig() *Config {
|
||||||
|
longRunningRE := regexp.MustCompile(options.DefaultLongRunningRequestRE)
|
||||||
|
|
||||||
var auditWriter io.Writer
|
config := &Config{
|
||||||
if len(options.AuditLogPath) != 0 {
|
MasterCount: 1,
|
||||||
auditWriter = &lumberjack.Logger{
|
ReadWritePort: 6443,
|
||||||
Filename: options.AuditLogPath,
|
ServiceReadWritePort: 443,
|
||||||
MaxAge: options.AuditLogMaxAge,
|
CacheTimeout: 5 * time.Second,
|
||||||
MaxBackups: options.AuditLogMaxBackups,
|
RequestContextMapper: api.NewRequestContextMapper(),
|
||||||
MaxSize: options.AuditLogMaxSize,
|
BuildHandlerChainsFunc: DefaultBuildHandlerChain,
|
||||||
}
|
LegacyAPIGroupPrefixes: sets.NewString(LegacyAPIPrefix),
|
||||||
}
|
|
||||||
|
|
||||||
var secureServingInfo *ServingInfo
|
EnableIndex: true,
|
||||||
if options.SecurePort > 0 {
|
EnableSwaggerSupport: true,
|
||||||
secureServingInfo = &ServingInfo{
|
EnableVersion: true,
|
||||||
BindAddress: net.JoinHostPort(options.BindAddress.String(), strconv.Itoa(options.SecurePort)),
|
|
||||||
ServerCert: CertInfo{
|
|
||||||
CertFile: options.TLSCertFile,
|
|
||||||
KeyFile: options.TLSPrivateKeyFile,
|
|
||||||
},
|
|
||||||
ClientCA: options.ClientCAFile,
|
|
||||||
}
|
|
||||||
if options.TLSCertFile == "" && options.TLSPrivateKeyFile == "" {
|
|
||||||
secureServingInfo.ServerCert.Generate = true
|
|
||||||
secureServingInfo.ServerCert.CertFile = path.Join(options.CertDirectory, "apiserver.crt")
|
|
||||||
secureServingInfo.ServerCert.KeyFile = path.Join(options.CertDirectory, "apiserver.key")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var insecureServingInfo *ServingInfo
|
|
||||||
if options.InsecurePort > 0 {
|
|
||||||
insecureServingInfo = &ServingInfo{
|
|
||||||
BindAddress: net.JoinHostPort(options.InsecureBindAddress.String(), strconv.Itoa(options.InsecurePort)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Config{
|
|
||||||
APIGroupPrefix: options.APIGroupPrefix,
|
|
||||||
CorsAllowedOriginList: options.CorsAllowedOriginList,
|
|
||||||
AuditWriter: auditWriter,
|
|
||||||
EnableGarbageCollection: options.EnableGarbageCollection,
|
|
||||||
EnableIndex: true,
|
|
||||||
EnableProfiling: options.EnableProfiling,
|
|
||||||
EnableSwaggerSupport: true,
|
|
||||||
EnableSwaggerUI: options.EnableSwaggerUI,
|
|
||||||
EnableVersion: true,
|
|
||||||
ExternalHost: options.ExternalHost,
|
|
||||||
KubernetesServiceNodePort: options.KubernetesServiceNodePort,
|
|
||||||
MasterCount: options.MasterCount,
|
|
||||||
MinRequestTimeout: options.MinRequestTimeout,
|
|
||||||
SecureServingInfo: secureServingInfo,
|
|
||||||
InsecureServingInfo: insecureServingInfo,
|
|
||||||
PublicAddress: options.AdvertiseAddress,
|
|
||||||
ReadWritePort: options.SecurePort,
|
|
||||||
ServiceClusterIPRange: &options.ServiceClusterIPRange,
|
|
||||||
ServiceNodePortRange: options.ServiceNodePortRange,
|
|
||||||
OpenAPIConfig: &common.Config{
|
OpenAPIConfig: &common.Config{
|
||||||
ProtocolList: []string{"https"},
|
ProtocolList: []string{"https"},
|
||||||
IgnorePrefixes: []string{"/swaggerapi"},
|
IgnorePrefixes: []string{"/swaggerapi"},
|
||||||
|
@ -268,19 +228,81 @@ func NewConfig(options *options.ServerRunOptions) *Config {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
MaxRequestsInFlight: options.MaxRequestsInFlight,
|
LongRunningFunc: genericfilters.BasicLongRunningRequestCheck(longRunningRE, map[string]string{"watch": "true"}),
|
||||||
LongRunningFunc: genericfilters.BasicLongRunningRequestCheck(longRunningRE, map[string]string{"watch": "true"}),
|
|
||||||
LegacyAPIGroupPrefixes: sets.NewString(LegacyAPIPrefix),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this keeps the defaults in sync
|
||||||
|
defaultOptions := options.NewServerRunOptions()
|
||||||
|
// unset fields that can be overridden to avoid setting values so that we won't end up with lingering values.
|
||||||
|
// TODO we probably want to run the defaults the other way. A default here drives it in the CLI flags
|
||||||
|
defaultOptions.SecurePort = 0
|
||||||
|
defaultOptions.InsecurePort = 0
|
||||||
|
defaultOptions.AuditLogPath = ""
|
||||||
|
return config.ApplyOptions(defaultOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApplyOptions applies the run options to the method receiver and returns self
|
||||||
|
func (c *Config) ApplyOptions(options *options.ServerRunOptions) *Config {
|
||||||
|
if len(options.AuditLogPath) != 0 {
|
||||||
|
c.AuditWriter = &lumberjack.Logger{
|
||||||
|
Filename: options.AuditLogPath,
|
||||||
|
MaxAge: options.AuditLogMaxAge,
|
||||||
|
MaxBackups: options.AuditLogMaxBackups,
|
||||||
|
MaxSize: options.AuditLogMaxSize,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.SecurePort > 0 {
|
||||||
|
secureServingInfo := &ServingInfo{
|
||||||
|
BindAddress: net.JoinHostPort(options.BindAddress.String(), strconv.Itoa(options.SecurePort)),
|
||||||
|
ServerCert: CertInfo{
|
||||||
|
CertFile: options.TLSCertFile,
|
||||||
|
KeyFile: options.TLSPrivateKeyFile,
|
||||||
|
},
|
||||||
|
ClientCA: options.ClientCAFile,
|
||||||
|
}
|
||||||
|
if options.TLSCertFile == "" && options.TLSPrivateKeyFile == "" {
|
||||||
|
secureServingInfo.ServerCert.Generate = true
|
||||||
|
secureServingInfo.ServerCert.CertFile = path.Join(options.CertDirectory, "apiserver.crt")
|
||||||
|
secureServingInfo.ServerCert.KeyFile = path.Join(options.CertDirectory, "apiserver.key")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.SecureServingInfo = secureServingInfo
|
||||||
|
c.ReadWritePort = options.SecurePort
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.InsecurePort > 0 {
|
||||||
|
insecureServingInfo := &ServingInfo{
|
||||||
|
BindAddress: net.JoinHostPort(options.InsecureBindAddress.String(), strconv.Itoa(options.InsecurePort)),
|
||||||
|
}
|
||||||
|
c.InsecureServingInfo = insecureServingInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
c.APIGroupPrefix = options.APIGroupPrefix
|
||||||
|
c.CorsAllowedOriginList = options.CorsAllowedOriginList
|
||||||
|
c.EnableGarbageCollection = options.EnableGarbageCollection
|
||||||
|
c.EnableProfiling = options.EnableProfiling
|
||||||
|
c.EnableSwaggerUI = options.EnableSwaggerUI
|
||||||
|
c.ExternalHost = options.ExternalHost
|
||||||
|
c.KubernetesServiceNodePort = options.KubernetesServiceNodePort
|
||||||
|
c.MasterCount = options.MasterCount
|
||||||
|
c.MinRequestTimeout = options.MinRequestTimeout
|
||||||
|
c.PublicAddress = options.AdvertiseAddress
|
||||||
|
c.ServiceClusterIPRange = &options.ServiceClusterIPRange
|
||||||
|
c.ServiceNodePortRange = options.ServiceNodePortRange
|
||||||
|
c.MaxRequestsInFlight = options.MaxRequestsInFlight
|
||||||
|
|
||||||
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
type completedConfig struct {
|
type completedConfig struct {
|
||||||
*Config
|
*Config
|
||||||
}
|
}
|
||||||
|
|
||||||
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
|
// Complete fills in any fields not set that are required to have valid data and can be derived
|
||||||
|
// from other fields. If you're going to `ApplyOptions`, do that first. It's mutating the receiver.
|
||||||
func (c *Config) Complete() completedConfig {
|
func (c *Config) Complete() completedConfig {
|
||||||
if c.ServiceClusterIPRange == nil {
|
if c.ServiceClusterIPRange == nil || c.ServiceClusterIPRange.IP == nil {
|
||||||
defaultNet := "10.0.0.0/24"
|
defaultNet := "10.0.0.0/24"
|
||||||
glog.Warningf("Network range for service cluster IPs is unspecified. Defaulting to %v.", defaultNet)
|
glog.Warningf("Network range for service cluster IPs is unspecified. Defaulting to %v.", defaultNet)
|
||||||
_, serviceClusterIPRange, err := net.ParseCIDR(defaultNet)
|
_, serviceClusterIPRange, err := net.ParseCIDR(defaultNet)
|
||||||
|
@ -301,9 +323,6 @@ func (c *Config) Complete() completedConfig {
|
||||||
glog.V(4).Infof("Setting GenericAPIServer service IP to %q (read-write).", serviceReadWriteIP)
|
glog.V(4).Infof("Setting GenericAPIServer service IP to %q (read-write).", serviceReadWriteIP)
|
||||||
c.ServiceReadWriteIP = serviceReadWriteIP
|
c.ServiceReadWriteIP = serviceReadWriteIP
|
||||||
}
|
}
|
||||||
if c.ServiceReadWritePort == 0 {
|
|
||||||
c.ServiceReadWritePort = 443
|
|
||||||
}
|
|
||||||
if c.ServiceNodePortRange.Size == 0 {
|
if c.ServiceNodePortRange.Size == 0 {
|
||||||
// TODO: Currently no way to specify an empty range (do we need to allow this?)
|
// TODO: Currently no way to specify an empty range (do we need to allow this?)
|
||||||
// We should probably allow this for clouds that don't require NodePort to do load-balancing (GCE)
|
// We should probably allow this for clouds that don't require NodePort to do load-balancing (GCE)
|
||||||
|
@ -312,19 +331,6 @@ func (c *Config) Complete() completedConfig {
|
||||||
c.ServiceNodePortRange = options.DefaultServiceNodePortRange
|
c.ServiceNodePortRange = options.DefaultServiceNodePortRange
|
||||||
glog.Infof("Node port range unspecified. Defaulting to %v.", c.ServiceNodePortRange)
|
glog.Infof("Node port range unspecified. Defaulting to %v.", c.ServiceNodePortRange)
|
||||||
}
|
}
|
||||||
if c.MasterCount == 0 {
|
|
||||||
// Clearly, there will be at least one GenericAPIServer.
|
|
||||||
c.MasterCount = 1
|
|
||||||
}
|
|
||||||
if c.ReadWritePort == 0 {
|
|
||||||
c.ReadWritePort = 6443
|
|
||||||
}
|
|
||||||
if c.CacheTimeout == 0 {
|
|
||||||
c.CacheTimeout = 5 * time.Second
|
|
||||||
}
|
|
||||||
if c.RequestContextMapper == nil {
|
|
||||||
c.RequestContextMapper = api.NewRequestContextMapper()
|
|
||||||
}
|
|
||||||
if len(c.ExternalHost) == 0 && c.PublicAddress != nil {
|
if len(c.ExternalHost) == 0 && c.PublicAddress != nil {
|
||||||
hostAndPort := c.PublicAddress.String()
|
hostAndPort := c.PublicAddress.String()
|
||||||
if c.ReadWritePort != 0 {
|
if c.ReadWritePort != 0 {
|
||||||
|
@ -332,9 +338,6 @@ func (c *Config) Complete() completedConfig {
|
||||||
}
|
}
|
||||||
c.ExternalHost = hostAndPort
|
c.ExternalHost = hostAndPort
|
||||||
}
|
}
|
||||||
if c.BuildHandlerChainsFunc == nil {
|
|
||||||
c.BuildHandlerChainsFunc = DefaultBuildHandlerChain
|
|
||||||
}
|
|
||||||
return completedConfig{c}
|
return completedConfig{c}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,7 +389,6 @@ func (c completedConfig) New() (*GenericAPIServer, error) {
|
||||||
SecureServingInfo: c.SecureServingInfo,
|
SecureServingInfo: c.SecureServingInfo,
|
||||||
InsecureServingInfo: c.InsecureServingInfo,
|
InsecureServingInfo: c.InsecureServingInfo,
|
||||||
ExternalAddress: c.ExternalHost,
|
ExternalAddress: c.ExternalHost,
|
||||||
ClusterIP: c.PublicAddress,
|
|
||||||
ServiceReadWriteIP: c.ServiceReadWriteIP,
|
ServiceReadWriteIP: c.ServiceReadWriteIP,
|
||||||
ServiceReadWritePort: c.ServiceReadWritePort,
|
ServiceReadWritePort: c.ServiceReadWritePort,
|
||||||
|
|
||||||
|
@ -413,6 +415,25 @@ func (c completedConfig) New() (*GenericAPIServer, error) {
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MaybeGenerateServingCerts generates serving certificates if requested and needed.
|
||||||
|
func (c completedConfig) MaybeGenerateServingCerts() error {
|
||||||
|
// It would be nice to set a fqdn subject alt name, but only the kubelets know, the apiserver is clueless
|
||||||
|
// alternateDNS = append(alternateDNS, "kubernetes.default.svc.CLUSTER.DNS.NAME")
|
||||||
|
if c.SecureServingInfo != nil && c.SecureServingInfo.ServerCert.Generate && !certutil.CanReadCertOrKey(c.SecureServingInfo.ServerCert.CertFile, c.SecureServingInfo.ServerCert.KeyFile) {
|
||||||
|
// TODO (cjcullen): Is ClusterIP the right address to sign a cert with?
|
||||||
|
alternateIPs := []net.IP{c.ServiceReadWriteIP}
|
||||||
|
alternateDNS := []string{"kubernetes.default.svc", "kubernetes.default", "kubernetes", "localhost"}
|
||||||
|
|
||||||
|
if err := certutil.GenerateSelfSignedCert(c.PublicAddress.String(), c.SecureServingInfo.ServerCert.CertFile, c.SecureServingInfo.ServerCert.KeyFile, alternateIPs, alternateDNS); err != nil {
|
||||||
|
return fmt.Errorf("Unable to generate self signed cert: %v", err)
|
||||||
|
} else {
|
||||||
|
glog.Infof("Generated self-signed cert (%s, %s)", c.SecureServingInfo.ServerCert.CertFile, c.SecureServingInfo.ServerCert.KeyFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) (secure, insecure http.Handler) {
|
func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) (secure, insecure http.Handler) {
|
||||||
attributeGetter := apiserverfilters.NewRequestAttributeGetter(c.RequestContextMapper)
|
attributeGetter := apiserverfilters.NewRequestAttributeGetter(c.RequestContextMapper)
|
||||||
|
|
||||||
|
|
|
@ -124,9 +124,6 @@ type GenericAPIServer struct {
|
||||||
// external (public internet) URLs for this GenericAPIServer.
|
// external (public internet) URLs for this GenericAPIServer.
|
||||||
ExternalAddress string
|
ExternalAddress string
|
||||||
|
|
||||||
// ClusterIP is the IP address of the GenericAPIServer within the cluster.
|
|
||||||
ClusterIP net.IP
|
|
||||||
|
|
||||||
// storage contains the RESTful endpoints exposed by this GenericAPIServer
|
// storage contains the RESTful endpoints exposed by this GenericAPIServer
|
||||||
storage map[string]rest.Storage
|
storage map[string]rest.Storage
|
||||||
|
|
||||||
|
@ -225,20 +222,6 @@ func (s *GenericAPIServer) Run() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// It would be nice to set a fqdn subject alt name, but only the kubelets know, the apiserver is clueless
|
|
||||||
// alternateDNS = append(alternateDNS, "kubernetes.default.svc.CLUSTER.DNS.NAME")
|
|
||||||
if s.SecureServingInfo.ServerCert.Generate && !certutil.CanReadCertOrKey(s.SecureServingInfo.ServerCert.CertFile, s.SecureServingInfo.ServerCert.KeyFile) {
|
|
||||||
// TODO (cjcullen): Is ClusterIP the right address to sign a cert with?
|
|
||||||
alternateIPs := []net.IP{s.ServiceReadWriteIP}
|
|
||||||
alternateDNS := []string{"kubernetes.default.svc", "kubernetes.default", "kubernetes", "localhost"}
|
|
||||||
|
|
||||||
if err := certutil.GenerateSelfSignedCert(s.ClusterIP.String(), s.SecureServingInfo.ServerCert.CertFile, s.SecureServingInfo.ServerCert.KeyFile, alternateIPs, alternateDNS); err != nil {
|
|
||||||
glog.Errorf("Unable to generate self signed cert: %v", err)
|
|
||||||
} else {
|
|
||||||
glog.Infof("Using self-signed cert (%s, %s)", s.SecureServingInfo.ServerCert.CertFile, s.SecureServingInfo.ServerCert.KeyFile)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glog.Infof("Serving securely on %s", s.SecureServingInfo.BindAddress)
|
glog.Infof("Serving securely on %s", s.SecureServingInfo.BindAddress)
|
||||||
go func() {
|
go func() {
|
||||||
defer utilruntime.HandleCrash()
|
defer utilruntime.HandleCrash()
|
||||||
|
|
|
@ -50,7 +50,7 @@ import (
|
||||||
func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
|
func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
|
||||||
etcdServer, _ := etcdtesting.NewUnsecuredEtcd3TestClientServer(t)
|
etcdServer, _ := etcdtesting.NewUnsecuredEtcd3TestClientServer(t)
|
||||||
|
|
||||||
config := Config{}
|
config := NewConfig()
|
||||||
config.PublicAddress = net.ParseIP("192.168.10.4")
|
config.PublicAddress = net.ParseIP("192.168.10.4")
|
||||||
config.RequestContextMapper = api.NewRequestContextMapper()
|
config.RequestContextMapper = api.NewRequestContextMapper()
|
||||||
config.ProxyDialer = func(network, addr string) (net.Conn, error) { return nil, nil }
|
config.ProxyDialer = func(network, addr string) (net.Conn, error) { return nil, nil }
|
||||||
|
@ -59,7 +59,7 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion
|
||||||
config.LegacyAPIGroupPrefixes = sets.NewString("/api")
|
config.LegacyAPIGroupPrefixes = sets.NewString("/api")
|
||||||
config.APIGroupPrefix = "/apis"
|
config.APIGroupPrefix = "/apis"
|
||||||
|
|
||||||
return etcdServer, config, assert.New(t)
|
return etcdServer, *config, assert.New(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMaster(t *testing.T) (*GenericAPIServer, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
|
func newMaster(t *testing.T) (*GenericAPIServer, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
|
||||||
|
@ -84,7 +84,6 @@ func TestNew(t *testing.T) {
|
||||||
assert.Equal(s.apiPrefix, config.APIGroupPrefix)
|
assert.Equal(s.apiPrefix, config.APIGroupPrefix)
|
||||||
assert.Equal(s.admissionControl, config.AdmissionControl)
|
assert.Equal(s.admissionControl, config.AdmissionControl)
|
||||||
assert.Equal(s.RequestContextMapper(), config.RequestContextMapper)
|
assert.Equal(s.RequestContextMapper(), config.RequestContextMapper)
|
||||||
assert.Equal(s.ClusterIP, config.PublicAddress)
|
|
||||||
|
|
||||||
// these values get defaulted
|
// these values get defaulted
|
||||||
_, serviceClusterIPRange, _ := net.ParseCIDR("10.0.0.0/24")
|
_, serviceClusterIPRange, _ := net.ParseCIDR("10.0.0.0/24")
|
||||||
|
@ -109,7 +108,7 @@ func TestInstallAPIGroups(t *testing.T) {
|
||||||
config.LegacyAPIGroupPrefixes = sets.NewString("/apiPrefix")
|
config.LegacyAPIGroupPrefixes = sets.NewString("/apiPrefix")
|
||||||
config.APIGroupPrefix = "/apiGroupPrefix"
|
config.APIGroupPrefix = "/apiGroupPrefix"
|
||||||
|
|
||||||
s, err := config.Complete().New()
|
s, err := config.SkipComplete().New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Error in bringing up the server: %v", err)
|
t.Fatalf("Error in bringing up the server: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -179,7 +178,7 @@ func TestCustomHandlerChain(t *testing.T) {
|
||||||
called = true
|
called = true
|
||||||
})
|
})
|
||||||
|
|
||||||
s, err := config.Complete().New()
|
s, err := config.SkipComplete().New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Error in bringing up the server: %v", err)
|
t.Fatalf("Error in bringing up the server: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -235,7 +234,7 @@ func TestNotRestRoutesHaveAuth(t *testing.T) {
|
||||||
config.EnableSwaggerSupport = true
|
config.EnableSwaggerSupport = true
|
||||||
config.EnableVersion = true
|
config.EnableVersion = true
|
||||||
|
|
||||||
s, err := config.Complete().New()
|
s, err := config.SkipComplete().New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Error in bringing up the server: %v", err)
|
t.Fatalf("Error in bringing up the server: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -311,7 +310,6 @@ func TestInstallSwaggerAPI(t *testing.T) {
|
||||||
mux = http.NewServeMux()
|
mux = http.NewServeMux()
|
||||||
server.HandlerContainer = genericmux.NewAPIContainer(mux, nil)
|
server.HandlerContainer = genericmux.NewAPIContainer(mux, nil)
|
||||||
server.ExternalAddress = ""
|
server.ExternalAddress = ""
|
||||||
server.ClusterIP = net.IPv4(10, 10, 10, 10)
|
|
||||||
server.InstallSwaggerAPI()
|
server.InstallSwaggerAPI()
|
||||||
if assert.NotEqual(0, len(ws), "SwaggerAPI not installed.") {
|
if assert.NotEqual(0, len(ws), "SwaggerAPI not installed.") {
|
||||||
assert.Equal("/swaggerapi/", ws[0].RootPath(), "SwaggerAPI did not install to the proper path. %s != /swaggerapi", ws[0].RootPath())
|
assert.Equal("/swaggerapi/", ws[0].RootPath(), "SwaggerAPI did not install to the proper path. %s != /swaggerapi", ws[0].RootPath())
|
||||||
|
|
|
@ -38,7 +38,7 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// TODO: This can be tightened up. It still matches objects named watch or proxy.
|
// TODO: This can be tightened up. It still matches objects named watch or proxy.
|
||||||
defaultLongRunningRequestRE = "(/|^)((watch|proxy)(/|$)|(logs?|portforward|exec|attach)/?$)"
|
DefaultLongRunningRequestRE = "(/|^)((watch|proxy)(/|$)|(logs?|portforward|exec|attach)/?$)"
|
||||||
)
|
)
|
||||||
|
|
||||||
var DefaultServiceNodePortRange = utilnet.PortRange{Base: 30000, Size: 2768}
|
var DefaultServiceNodePortRange = utilnet.PortRange{Base: 30000, Size: 2768}
|
||||||
|
@ -139,7 +139,7 @@ func NewServerRunOptions() *ServerRunOptions {
|
||||||
EnableWatchCache: true,
|
EnableWatchCache: true,
|
||||||
InsecureBindAddress: net.ParseIP("127.0.0.1"),
|
InsecureBindAddress: net.ParseIP("127.0.0.1"),
|
||||||
InsecurePort: 8080,
|
InsecurePort: 8080,
|
||||||
LongRunningRequestRE: defaultLongRunningRequestRE,
|
LongRunningRequestRE: DefaultLongRunningRequestRE,
|
||||||
MasterCount: 1,
|
MasterCount: 1,
|
||||||
MasterServiceNamespace: api.NamespaceDefault,
|
MasterServiceNamespace: api.NamespaceDefault,
|
||||||
MaxRequestsInFlight: 400,
|
MaxRequestsInFlight: 400,
|
||||||
|
|
|
@ -49,7 +49,6 @@ import (
|
||||||
"k8s.io/kubernetes/pkg/client/restclient"
|
"k8s.io/kubernetes/pkg/client/restclient"
|
||||||
openapigen "k8s.io/kubernetes/pkg/generated/openapi"
|
openapigen "k8s.io/kubernetes/pkg/generated/openapi"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver"
|
"k8s.io/kubernetes/pkg/genericapiserver"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver/openapi/common"
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/client"
|
"k8s.io/kubernetes/pkg/kubelet/client"
|
||||||
ipallocator "k8s.io/kubernetes/pkg/registry/core/service/ipallocator"
|
ipallocator "k8s.io/kubernetes/pkg/registry/core/service/ipallocator"
|
||||||
"k8s.io/kubernetes/pkg/registry/registrytest"
|
"k8s.io/kubernetes/pkg/registry/registrytest"
|
||||||
|
@ -71,9 +70,7 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.
|
||||||
server, storageConfig := etcdtesting.NewUnsecuredEtcd3TestClientServer(t)
|
server, storageConfig := etcdtesting.NewUnsecuredEtcd3TestClientServer(t)
|
||||||
|
|
||||||
config := &Config{
|
config := &Config{
|
||||||
GenericConfig: &genericapiserver.Config{
|
GenericConfig: genericapiserver.NewConfig(),
|
||||||
OpenAPIConfig: &common.Config{},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resourceEncoding := genericapiserver.NewDefaultResourceEncodingConfig()
|
resourceEncoding := genericapiserver.NewDefaultResourceEncodingConfig()
|
||||||
|
@ -164,10 +161,6 @@ func TestNew(t *testing.T) {
|
||||||
master, etcdserver, config, assert := newMaster(t)
|
master, etcdserver, config, assert := newMaster(t)
|
||||||
defer etcdserver.Terminate(t)
|
defer etcdserver.Terminate(t)
|
||||||
|
|
||||||
// Verify many of the variables match their config counterparts
|
|
||||||
assert.Equal(master.GenericAPIServer.RequestContextMapper(), config.GenericConfig.RequestContextMapper)
|
|
||||||
assert.Equal(master.GenericAPIServer.ClusterIP, config.GenericConfig.PublicAddress)
|
|
||||||
|
|
||||||
// these values get defaulted
|
// these values get defaulted
|
||||||
_, serviceClusterIPRange, _ := net.ParseCIDR("10.0.0.0/24")
|
_, serviceClusterIPRange, _ := net.ParseCIDR("10.0.0.0/24")
|
||||||
serviceReadWriteIP, _ := ipallocator.GetIndexedIP(serviceClusterIPRange, 1)
|
serviceReadWriteIP, _ := ipallocator.GetIndexedIP(serviceClusterIPRange, 1)
|
||||||
|
|
|
@ -60,8 +60,6 @@ import (
|
||||||
"k8s.io/kubernetes/pkg/master"
|
"k8s.io/kubernetes/pkg/master"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/storage/storagebackend"
|
"k8s.io/kubernetes/pkg/storage/storagebackend"
|
||||||
utilnet "k8s.io/kubernetes/pkg/util/net"
|
|
||||||
"k8s.io/kubernetes/pkg/util/sets"
|
|
||||||
"k8s.io/kubernetes/pkg/util/wait"
|
"k8s.io/kubernetes/pkg/util/wait"
|
||||||
"k8s.io/kubernetes/pkg/watch"
|
"k8s.io/kubernetes/pkg/watch"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/admit"
|
"k8s.io/kubernetes/plugin/pkg/admission/admit"
|
||||||
|
@ -69,7 +67,6 @@ import (
|
||||||
|
|
||||||
"github.com/go-openapi/spec"
|
"github.com/go-openapi/spec"
|
||||||
"github.com/pborman/uuid"
|
"github.com/pborman/uuid"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver/openapi/common"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -346,21 +343,15 @@ func NewMasterConfig() *master.Config {
|
||||||
"",
|
"",
|
||||||
NewSingleContentTypeSerializer(api.Scheme, testapi.Storage.Codec(), runtime.ContentTypeJSON))
|
NewSingleContentTypeSerializer(api.Scheme, testapi.Storage.Codec(), runtime.ContentTypeJSON))
|
||||||
|
|
||||||
|
genericConfig := genericapiserver.NewConfig()
|
||||||
|
genericConfig.APIResourceConfigSource = master.DefaultAPIResourceConfigSource()
|
||||||
|
genericConfig.Authorizer = authorizer.NewAlwaysAllowAuthorizer()
|
||||||
|
genericConfig.AdmissionControl = admit.NewAlwaysAdmit()
|
||||||
|
genericConfig.Serializer = api.Codecs
|
||||||
|
genericConfig.EnableOpenAPISupport = true
|
||||||
|
|
||||||
return &master.Config{
|
return &master.Config{
|
||||||
GenericConfig: &genericapiserver.Config{
|
GenericConfig: genericConfig,
|
||||||
APIResourceConfigSource: master.DefaultAPIResourceConfigSource(),
|
|
||||||
LegacyAPIGroupPrefixes: sets.NewString("/api"),
|
|
||||||
APIGroupPrefix: "/apis",
|
|
||||||
Authorizer: authorizer.NewAlwaysAllowAuthorizer(),
|
|
||||||
AdmissionControl: admit.NewAlwaysAdmit(),
|
|
||||||
Serializer: api.Codecs,
|
|
||||||
// Set those values to avoid annoying warnings in logs.
|
|
||||||
ServiceClusterIPRange: parseCIDROrDie("10.0.0.0/24"),
|
|
||||||
ServiceNodePortRange: utilnet.PortRange{Base: 30000, Size: 2768},
|
|
||||||
EnableVersion: true,
|
|
||||||
EnableOpenAPISupport: true,
|
|
||||||
OpenAPIConfig: &common.Config{},
|
|
||||||
},
|
|
||||||
StorageFactory: storageFactory,
|
StorageFactory: storageFactory,
|
||||||
EnableCoreControllers: true,
|
EnableCoreControllers: true,
|
||||||
EnableWatchCache: true,
|
EnableWatchCache: true,
|
||||||
|
@ -372,8 +363,6 @@ func NewMasterConfig() *master.Config {
|
||||||
func NewIntegrationTestMasterConfig() *master.Config {
|
func NewIntegrationTestMasterConfig() *master.Config {
|
||||||
masterConfig := NewMasterConfig()
|
masterConfig := NewMasterConfig()
|
||||||
masterConfig.EnableCoreControllers = true
|
masterConfig.EnableCoreControllers = true
|
||||||
masterConfig.GenericConfig.EnableIndex = true
|
|
||||||
masterConfig.GenericConfig.EnableVersion = true
|
|
||||||
masterConfig.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4")
|
masterConfig.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4")
|
||||||
masterConfig.GenericConfig.APIResourceConfigSource = master.DefaultAPIResourceConfigSource()
|
masterConfig.GenericConfig.APIResourceConfigSource = master.DefaultAPIResourceConfigSource()
|
||||||
return masterConfig
|
return masterConfig
|
||||||
|
|
Loading…
Reference in New Issue