diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 3613dd9af9..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM golang:1.8-alpine -ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH -ADD .build/dist/linux/amd64/kops-server /go/bin/kops-server -ENTRYPOINT "kops-server" \ No newline at end of file diff --git a/Makefile b/Makefile index f07490e78e..05767ced7b 100644 --- a/Makefile +++ b/Makefile @@ -347,14 +347,18 @@ apimachinery: #cd pkg/apis/kops/ && ~/k8s/bin/codecgen -d 1234 -o types.generated.go instancegroup.go cluster.go federation.go -uas-docker-compile: +# ----------------------------------------------------- +# kops-server + +kops-server-docker-compile: GOOS=linux GOARCH=amd64 go build -a ${EXTRA_BUILDFLAGS} -o .build/dist/linux/amd64/kops-server -ldflags "${EXTRA_LDFLAGS} -X k8s.io/kops-server.Version=${VERSION} -X k8s.io/kops-server.GitVersion=${GITSHA}" k8s.io/kops/cmd/kops-server - -uas-build: +kops-server-build: # Compile the API binary in linux, and copy to local filesystem docker pull golang:${GOVERSION} - docker run --name=kops-api-build-${UNIQUE} -e STATIC_BUILD=yes -e VERSION=${VERSION} -v ${GOPATH}/src:/go/src -v ${MAKEDIR}:/go/src/k8s.io/kops golang:${GOVERSION} make -f /go/src/k8s.io/kops/Makefile uas-docker-compile - docker cp kops-api-build-${UNIQUE}:/go/.build . - docker build -t krisnova/kops:latest . - docker push krisnova/kops:latest + docker run --name=kops-server-build-${UNIQUE} -e STATIC_BUILD=yes -e VERSION=${VERSION} -v ${GOPATH}/src:/go/src -v ${MAKEDIR}:/go/src/k8s.io/kops golang:${GOVERSION} make -f /go/src/k8s.io/kops/Makefile kops-server-docker-compile + docker cp kops-server-build-${UNIQUE}:/go/.build . + docker build -t ${DOCKER_REGISTRY}/kops-server:latest -f images/kops-server/Dockerfile . + +kops-server-push: kops-server-build + docker push ${DOCKER_REGISTRY}/kops-server:latest diff --git a/cmd/kops-server/main.go b/cmd/kops-server/main.go index 90392de1c7..a1de98c0d0 100644 --- a/cmd/kops-server/main.go +++ b/cmd/kops-server/main.go @@ -29,7 +29,6 @@ import ( ) func main() { - flag.Parse() rand.Seed(time.Now().UTC().UnixNano()) logs.InitLogs() @@ -41,6 +40,10 @@ func main() { cmd := server.NewCommandStartKopsServer(os.Stdout, os.Stderr) cmd.Flags().AddGoFlagSet(flag.CommandLine) + + // Avoid glog warnings + flag.CommandLine.Parse([]string{}) + if err := cmd.Execute(); err != nil { cmdutil.CheckErr(err) } diff --git a/federation/apply_federation.go b/federation/apply_federation.go index 7ccec016d6..10cb20a757 100644 --- a/federation/apply_federation.go +++ b/federation/apply_federation.go @@ -21,8 +21,14 @@ import ( crypto_rand "crypto/rand" "crypto/rsa" "fmt" + "strings" + "text/template" + "github.com/golang/glog" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/pkg/api/v1" "k8s.io/kops/federation/model" "k8s.io/kops/federation/targets/kubernetestarget" "k8s.io/kops/federation/tasks" @@ -35,8 +41,6 @@ import ( "k8s.io/kops/upup/pkg/kutil" "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" k8sapiv1 "k8s.io/kubernetes/pkg/api/v1" - "strings" - "text/template" ) type ApplyFederationOperation struct { @@ -143,10 +147,6 @@ func (o *ApplyFederationOperation) Run() error { if err != nil { return err } - k8sClient, err := kubernetes.NewForConfig(federationRestConfig) - if err != nil { - return err - } for _, member := range o.Federation.Spec.Members { glog.V(2).Infof("configuring member cluster %q", member) @@ -155,7 +155,7 @@ func (o *ApplyFederationOperation) Run() error { return fmt.Errorf("error reading cluster %q: %v", member, err) } - clusterName := strings.Replace(cluster.ObjectMeta.Name, ".", "-", -1) + clusterName := strings.Replace(cluster.Name, ".", "-", -1) a := &FederationCluster{ FederationNamespace: o.namespace, @@ -163,7 +163,7 @@ func (o *ApplyFederationOperation) Run() error { ControllerKubernetesClients: controllerKubernetesClients, FederationClient: federationControllerClient, - ClusterSecretName: "secret-" + cluster.ObjectMeta.Name, + ClusterSecretName: "secret-" + cluster.Name, ClusterName: clusterName, ApiserverHostname: cluster.Spec.MasterPublicName, } @@ -175,7 +175,7 @@ func (o *ApplyFederationOperation) Run() error { // Create default namespace glog.V(2).Infof("Ensuring default namespace exists") - if _, err := o.ensureFederationNamespace(k8sClient, "default"); err != nil { + if _, err := o.ensureFederationNamespace(federationControllerClient, "default"); err != nil { return err } @@ -209,7 +209,7 @@ func (o *ApplyFederationOperation) buildApiserverKeypair() *fitasks.Keypair { keypairName := "secret-" + o.apiserverHostName keypair := &fitasks.Keypair{ Name: fi.String(keypairName), - Subject: "cn=" + o.Federation.ObjectMeta.Name, + Subject: "cn=" + o.Federation.Name, Type: "server", } diff --git a/images/kops-server/Dockerfile b/images/kops-server/Dockerfile new file mode 100644 index 0000000000..2454b4cbc5 --- /dev/null +++ b/images/kops-server/Dockerfile @@ -0,0 +1,3 @@ +FROM alpine:3.5 +COPY /.build/dist/linux/amd64/kops-server /kops-server +ENTRYPOINT "/kops-server" \ No newline at end of file diff --git a/pkg/apis/kops/install/install.go b/pkg/apis/kops/install/install.go index cb787f210c..f60a1732ba 100644 --- a/pkg/apis/kops/install/install.go +++ b/pkg/apis/kops/install/install.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops/v1alpha1" "k8s.io/kops/pkg/apis/kops/v1alpha2" + "k8s.io/apimachinery/pkg/util/sets" ) func init() { diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index c3614ddcc7..ac83416b67 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -20,15 +20,34 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/server" - "k8s.io/kubernetes/pkg/version" "k8s.io/kops/pkg/apis/kops" _ "k8s.io/kops/pkg/apis/kops/install" "k8s.io/kops/pkg/apis/kops/v1alpha2" - "k8s.io/kops/pkg/apiserver/registry/cluster" - "k8s.io/kubernetes/pkg/api" + registrycluster "k8s.io/kops/pkg/apiserver/registry/cluster" + //registryinstancegroup "k8s.io/kops/pkg/apiserver/registry/instancegroup" + "k8s.io/kubernetes/pkg/version" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" ) +func init() { + // we need to add the options to empty v1 + // TODO fix the server code to avoid this + metav1.AddToGroupVersion(kops.Scheme, schema.GroupVersion{Version: "v1"}) + + // TODO: keep the generic API server from wanting this + unversioned := schema.GroupVersion{Group: "", Version: "v1"} + kops.Scheme.AddUnversionedTypes(unversioned, + &metav1.Status{}, + &metav1.APIVersions{}, + &metav1.APIGroupList{}, + &metav1.APIGroup{}, + &metav1.APIResourceList{}, + ) +} + type Config struct { GenericConfig *server.Config @@ -71,11 +90,12 @@ func (c completedConfig) New() (*APIDiscoveryServer, error) { GenericAPIServer: genericServer, } - apiGroupInfo := server.NewDefaultAPIGroupInfo(kops.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) + apiGroupInfo := server.NewDefaultAPIGroupInfo(kops.GroupName, kops.Registry, kops.Scheme, kops.ParameterCodec, kops.Codecs) apiGroupInfo.GroupMeta.GroupVersion = v1alpha2.SchemeGroupVersion v1alpha2storage := map[string]rest.Storage{} - v1alpha2storage["clusters"] = cluster.NewREST(c.RESTOptionsGetter) + v1alpha2storage["clusters"] = registrycluster.NewREST(c.RESTOptionsGetter) + //v1alpha2storage["instancegroups"] = registryinstancegroup.NewREST(c.RESTOptionsGetter) apiGroupInfo.VersionedResourcesStorageMap["v1alpha2"] = v1alpha2storage if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil { diff --git a/pkg/apiserver/cmd/server/start.go b/pkg/apiserver/cmd/server/start.go index 02501528ad..60bf7de96d 100644 --- a/pkg/apiserver/cmd/server/start.go +++ b/pkg/apiserver/cmd/server/start.go @@ -19,9 +19,7 @@ package server import ( "io" - "github.com/pborman/uuid" "github.com/spf13/cobra" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/registry/generic" @@ -29,14 +27,12 @@ import ( genericapiserver "k8s.io/apiserver/pkg/server" genericoptions "k8s.io/apiserver/pkg/server/options" "k8s.io/apiserver/pkg/storage/storagebackend" - "k8s.io/kubernetes/pkg/api" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kops/pkg/apiserver" + cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" //"k8s.io/kops/pkg/apis/kops/v1alpha1" - "k8s.io/kops/pkg/apis/kops/v1alpha2" - "github.com/golang/glog" + "k8s.io/kops/pkg/apis/kops" + "k8s.io/kops/pkg/apis/kops/v1alpha2" ) const defaultEtcdPathPrefix = "/registry/kops.kubernetes.io" @@ -55,11 +51,11 @@ type KopsServerOptions struct { // NewCommandStartKopsServer provides a CLI handler for 'start master' command func NewCommandStartKopsServer(out, err io.Writer) *cobra.Command { o := &KopsServerOptions{ - Etcd: genericoptions.NewEtcdOptions( - defaultEtcdPathPrefix, - api.Scheme, - nil, - ), + Etcd: genericoptions.NewEtcdOptions(&storagebackend.Config{ + Prefix: defaultEtcdPathPrefix, + Copier: kops.Scheme, + Codec: nil, + }), //SecureServing: genericoptions.NewSecureServingOptions(), InsecureServing: genericoptions.NewInsecureServingOptions(), Authentication: genericoptions.NewDelegatingAuthenticationOptions(), @@ -69,7 +65,7 @@ func NewCommandStartKopsServer(out, err io.Writer) *cobra.Command { StdErr: err, } o.Etcd.StorageConfig.Type = storagebackend.StorageTypeETCD2 - o.Etcd.StorageConfig.Codec = api.Codecs.LegacyCodec(v1alpha2.SchemeGroupVersion) + o.Etcd.StorageConfig.Codec = kops.Codecs.LegacyCodec(v1alpha2.SchemeGroupVersion) //o.SecureServing.ServingOptions.BindPort = 443 cmd := &cobra.Command{ @@ -106,7 +102,7 @@ func (o KopsServerOptions) RunKopsServer() error { // return fmt.Errorf("error creating self-signed certificates: %v", err) //} - genericAPIServerConfig := genericapiserver.NewConfig().WithSerializer(api.Codecs) + genericAPIServerConfig := genericapiserver.NewConfig().WithSerializer(kops.Codecs) //if err := o.SecureServing.ApplyTo(genericAPIServerConfig); err != nil { // return err @@ -122,11 +118,12 @@ func (o KopsServerOptions) RunKopsServer() error { // return err //} - var err error - privilegedLoopbackToken := uuid.NewRandom().String() - if genericAPIServerConfig.LoopbackClientConfig, err = genericAPIServerConfig.SecureServingInfo.NewSelfClientConfig(privilegedLoopbackToken); err != nil { - return err - } + //var err error + //privilegedLoopbackToken := uuid.NewRandom().String() + //loopbackCert := []byte(nil) + //if genericAPIServerConfig.LoopbackClientConfig, err = genericAPIServerConfig.SecureServingInfo.NewLoopbackClientConfig(privilegedLoopbackToken, loopbackCert); err != nil { + // return err + //} config := apiserver.Config{ GenericConfig: genericAPIServerConfig, diff --git a/pkg/apiserver/registry/cluster/etcd.go b/pkg/apiserver/registry/cluster/etcd.go index 24b2bf3177..b2a4e42eb2 100644 --- a/pkg/apiserver/registry/cluster/etcd.go +++ b/pkg/apiserver/registry/cluster/etcd.go @@ -20,7 +20,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" - "k8s.io/kubernetes/pkg/api" "k8s.io/kops/pkg/apis/kops" ) @@ -33,7 +32,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against kops Clusters. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, + Copier: kops.Scheme, NewFunc: func() runtime.Object { return &kops.Cluster{} }, @@ -41,7 +40,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { return &kops.ClusterList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { - return obj.(*kops.Cluster).ObjectMeta.Name, nil + return obj.(*kops.Cluster).Name, nil }, PredicateFunc: MatchCluster, QualifiedResource: kops.Resource("clusters"), diff --git a/pkg/apiserver/registry/cluster/strategy.go b/pkg/apiserver/registry/cluster/strategy.go index e355979033..3babe70c59 100644 --- a/pkg/apiserver/registry/cluster/strategy.go +++ b/pkg/apiserver/registry/cluster/strategy.go @@ -27,7 +27,6 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" - kapi "k8s.io/kubernetes/pkg/api" "k8s.io/kops/pkg/apis/kops" ) @@ -37,7 +36,7 @@ type clusterStrategy struct { names.NameGenerator } -var Strategy = clusterStrategy{kapi.Scheme, names.SimpleNameGenerator} +var Strategy = clusterStrategy{kops.Scheme, names.SimpleNameGenerator} func (clusterStrategy) NamespaceScoped() bool { return false @@ -75,7 +74,7 @@ func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { if !ok { return nil, nil, fmt.Errorf("given object is not a Cluster.") } - return labels.Set(cluster.ObjectMeta.Labels), ClusterToSelectableFields(cluster), nil + return labels.Set(cluster.Labels), ClusterToSelectableFields(cluster), nil } // MatchCluster is the filter used by the generic etcd backend to watch events diff --git a/upup/pkg/kutil/kubecfg_builder.go b/upup/pkg/kutil/kubecfg_builder.go index c5d6b71aa0..de490ec9d5 100644 --- a/upup/pkg/kutil/kubecfg_builder.go +++ b/upup/pkg/kutil/kubecfg_builder.go @@ -20,7 +20,7 @@ import ( "fmt" "github.com/golang/glog" - restclient "k8s.io/client-go/rest" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" )