From b91cda365ac1c68318faa8567218e0ab98add18a Mon Sep 17 00:00:00 2001 From: suoxiaocong Date: Thu, 15 Jun 2023 01:08:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/nkd/deploy.go | 21 +++++++++ cmd/nkd/generate.go | 20 +++++++++ cmd/nkd/join.go | 21 +++++++++ cmd/nkd/main.go | 17 +++++++ cmd/nkd/root.go | 21 +++++++++ cmd/nkd/upgrade.go | 21 +++++++++ go.mod | 14 ++++++ go.sum | 14 ++++++ housekeeper/daemon/daemon.go | 0 housekeeper/operator/operator.go | 0 pkg/apimonitor.go | 19 ++++++++ pkg/bootconfig/ignitioncreator.go | 10 +++++ pkg/bootconfig/initconfig.go | 3 ++ pkg/cert/etcd.go | 17 +++++++ pkg/deployer/clusterInfo.go | 40 +++++++++++++++++ pkg/deployer/phase/base.go | 5 +++ pkg/deployer/phase/generate.go | 21 +++++++++ pkg/deployer/phase/init.go | 15 +++++++ pkg/deployer/phase/join.go | 1 + pkg/deployer/playbook/base.go | 28 ++++++++++++ pkg/deployer/playbook/oneshot.go | 15 +++++++ pkg/deployer/playbook/upgrade.go | 6 +++ pkg/deployer/state.go | 5 +++ pkg/deployer/template.go | 10 +++++ pkg/deployer/utils.go | 17 +++++++ pkg/deployer/workflow.go | 74 +++++++++++++++++++++++++++++++ pkg/infra/assets.go | 16 +++++++ pkg/infra/factory.go | 18 ++++++++ pkg/infra/infradeployer.go | 17 +++++++ pkg/infra/initconfig.go | 10 +++++ pkg/infra/openstack.go | 10 +++++ pkg/manager/manager.go | 0 pkg/osimage/osimage.go | 0 pkg/registry/registry.go | 0 34 files changed, 506 insertions(+) create mode 100755 cmd/nkd/deploy.go create mode 100755 cmd/nkd/generate.go create mode 100755 cmd/nkd/join.go create mode 100755 cmd/nkd/main.go create mode 100755 cmd/nkd/root.go create mode 100755 cmd/nkd/upgrade.go create mode 100755 go.mod create mode 100755 go.sum create mode 100644 housekeeper/daemon/daemon.go create mode 100644 housekeeper/operator/operator.go create mode 100755 pkg/apimonitor.go create mode 100755 pkg/bootconfig/ignitioncreator.go create mode 100755 pkg/bootconfig/initconfig.go create mode 100755 pkg/cert/etcd.go create mode 100755 pkg/deployer/clusterInfo.go create mode 100755 pkg/deployer/phase/base.go create mode 100755 pkg/deployer/phase/generate.go create mode 100755 pkg/deployer/phase/init.go create mode 100755 pkg/deployer/phase/join.go create mode 100755 pkg/deployer/playbook/base.go create mode 100755 pkg/deployer/playbook/oneshot.go create mode 100755 pkg/deployer/playbook/upgrade.go create mode 100755 pkg/deployer/state.go create mode 100755 pkg/deployer/template.go create mode 100755 pkg/deployer/utils.go create mode 100755 pkg/deployer/workflow.go create mode 100755 pkg/infra/assets.go create mode 100755 pkg/infra/factory.go create mode 100755 pkg/infra/infradeployer.go create mode 100755 pkg/infra/initconfig.go create mode 100755 pkg/infra/openstack.go create mode 100644 pkg/manager/manager.go create mode 100644 pkg/osimage/osimage.go create mode 100644 pkg/registry/registry.go diff --git a/cmd/nkd/deploy.go b/cmd/nkd/deploy.go new file mode 100755 index 0000000..0caebe6 --- /dev/null +++ b/cmd/nkd/deploy.go @@ -0,0 +1,21 @@ +package main + +import ( + "github.com/spf13/cobra" +) + +var ( + deployCommand = &cobra.Command{ + Use: "deploy [nodes]", + Short: "deploy masters ", + Long: "deploy cluster bootconfig for a new cluster", + RunE: deploy, + Args: cobra.MaximumNArgs(1), + } +) + + +func deploy(command *cobra.Command, args []string) error{ + println("deploy") + return nil +} diff --git a/cmd/nkd/generate.go b/cmd/nkd/generate.go new file mode 100755 index 0000000..961909c --- /dev/null +++ b/cmd/nkd/generate.go @@ -0,0 +1,20 @@ +package main + +import "github.com/spf13/cobra" + +var ( + generateCommand = &cobra.Command{ + Use: "generate [options] [REGISTRY]", + Short: "generate cluster bootconfig", + Long: "generate cluster bootconfig for a new cluster", + RunE: generate, + Args: cobra.MaximumNArgs(1), + } +) + + +func generate(command *cobra.Command, args []string) error{ + println("generate") + return nil +} + diff --git a/cmd/nkd/join.go b/cmd/nkd/join.go new file mode 100755 index 0000000..1a7abf9 --- /dev/null +++ b/cmd/nkd/join.go @@ -0,0 +1,21 @@ +package main + +import ( + "github.com/spf13/cobra" +) + +var ( + joinCommand = &cobra.Command{ + Use: "join [nodes]", + Short: "join nodes ", + Long: "join nodes to cluster", + RunE: join, + Args: cobra.MaximumNArgs(1), + } +) + + +func join(command *cobra.Command, args []string) error{ + println("join") + return nil +} diff --git a/cmd/nkd/main.go b/cmd/nkd/main.go new file mode 100755 index 0000000..66ce32f --- /dev/null +++ b/cmd/nkd/main.go @@ -0,0 +1,17 @@ +package main + +import "github.com/spf13/cobra" + +func addCommands(command *cobra.Command){ + command.AddCommand(generateCommand) + command.AddCommand(deployCommand) + //command.AddCommand(initCommand) + command.AddCommand(joinCommand) + command.AddCommand(upgradeCommand) +} + + +func main() { + addCommands(rootCmd) + _ = rootCmd.Execute() +} diff --git a/cmd/nkd/root.go b/cmd/nkd/root.go new file mode 100755 index 0000000..d8a4995 --- /dev/null +++ b/cmd/nkd/root.go @@ -0,0 +1,21 @@ +package main + +import ( + "github.com/spf13/cobra" +) + +var ( + rootCmd = &cobra.Command{ + Use: "nkd [options]", + Long: "deploy k8s clusters", + SilenceUsage: true, + SilenceErrors: true, + TraverseChildren: true, + //PersistentPreRunE: persistentPreRunE, + //RunE: validate.SubCommandExists, + //PersistentPostRunE: persistentPostRunE, + //Version: version.Version.String(), + DisableFlagsInUseLine: true, + } + +) diff --git a/cmd/nkd/upgrade.go b/cmd/nkd/upgrade.go new file mode 100755 index 0000000..087630f --- /dev/null +++ b/cmd/nkd/upgrade.go @@ -0,0 +1,21 @@ +package main + +import ( + "github.com/spf13/cobra" +) + +var ( + upgradeCommand = &cobra.Command{ + Use: "deploy [nodes]", + Short: "deploy masters ", + Long: "deploy cluster bootconfig for a new cluster", + RunE: upgrade, + Args: cobra.MaximumNArgs(1), + } +) + + +func upgrade(command *cobra.Command, args []string) error{ + println("deploy") + return nil +} diff --git a/go.mod b/go.mod new file mode 100755 index 0000000..0fe9ed1 --- /dev/null +++ b/go.mod @@ -0,0 +1,14 @@ +module gitee.com/openeuler/nestos-kubernetes-deployer + +go 1.18 + +require ( + github.com/lithammer/dedent v1.1.0 + github.com/pkg/errors v0.9.1 + github.com/spf13/cobra v1.7.0 +) + +require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect +) diff --git a/go.sum b/go.sum new file mode 100755 index 0000000..1516f81 --- /dev/null +++ b/go.sum @@ -0,0 +1,14 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/housekeeper/daemon/daemon.go b/housekeeper/daemon/daemon.go new file mode 100644 index 0000000..e69de29 diff --git a/housekeeper/operator/operator.go b/housekeeper/operator/operator.go new file mode 100644 index 0000000..e69de29 diff --git a/pkg/apimonitor.go b/pkg/apimonitor.go new file mode 100755 index 0000000..39d5824 --- /dev/null +++ b/pkg/apimonitor.go @@ -0,0 +1,19 @@ +package pkg + +import "time" + +type ApiMonitor struct { + Endpoint string +} + +func (l ApiMonitor) WaitForClusterReady(timeout time.Duration) { + return +} + +func (l ApiMonitor) WaitForMastersReady(timeout time.Duration){ +} + +func (l ApiMonitor) WaitForWorkersReady(timeout time.Duration){ + return +} + diff --git a/pkg/bootconfig/ignitioncreator.go b/pkg/bootconfig/ignitioncreator.go new file mode 100755 index 0000000..25a8517 --- /dev/null +++ b/pkg/bootconfig/ignitioncreator.go @@ -0,0 +1,10 @@ +package bootconfig + +import "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra" + +type IgnitionAssembler struct { +} + +func (i IgnitionAssembler) Assemble(assets infra.Assets) infra.InitConfig { + return infra.InitConfig{} +} diff --git a/pkg/bootconfig/initconfig.go b/pkg/bootconfig/initconfig.go new file mode 100755 index 0000000..b1be118 --- /dev/null +++ b/pkg/bootconfig/initconfig.go @@ -0,0 +1,3 @@ +package bootconfig + + diff --git a/pkg/cert/etcd.go b/pkg/cert/etcd.go new file mode 100755 index 0000000..93cc24f --- /dev/null +++ b/pkg/cert/etcd.go @@ -0,0 +1,17 @@ +package cert + +import ( + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra" +) + + + +type EtcdCaGenerator struct { +} + +func (e EtcdCaGenerator) GenerateAssets() infra.Assets { + return nil +} + +func init() { +} \ No newline at end of file diff --git a/pkg/deployer/clusterInfo.go b/pkg/deployer/clusterInfo.go new file mode 100755 index 0000000..3964b25 --- /dev/null +++ b/pkg/deployer/clusterInfo.go @@ -0,0 +1,40 @@ +package deployer + + +type ClusterInfo struct { + Name string `yaml:"name"` + ApiEndpoint string `yaml:"api_endpoint"` + Kubernetes Kubernetes `yaml:"kubernetes"` + ClusterCIDR string `yaml:"cluster_cidr"` + PodCIDR string `yaml:"pod_cidr"` + ServiceCIDR string `yaml:"service_cidr"` + InfraDriver string `yaml:"infra_driver"` + OsType string `yaml:"os_type"` + OsImage string `yaml:"os_image"` + OsConfigList []OsConfig `yaml:"os_config_list"` + EtcdType string `yaml:"etcd_type"` +} + +type Kubernetes struct { + KubernetesVersion string `yaml:"kubernetes_version"` +} + +type OsConfig struct { + Roles []string `yaml:"roles"` + DiskSize string `yaml:"disk_size"` + Image string `yaml:"image"` + MemorySize string `yaml:"memory_size"` + Cpus int `yaml:"cpus"` +} + + + + +func ParseFromFile(filename string) ClusterInfo{ + return ClusterInfo{} +} + + +func (* ClusterInfo)GenerateToFile(filename string) error{ + return nil +} \ No newline at end of file diff --git a/pkg/deployer/phase/base.go b/pkg/deployer/phase/base.go new file mode 100755 index 0000000..67d3ce8 --- /dev/null +++ b/pkg/deployer/phase/base.go @@ -0,0 +1,5 @@ +package phase + +type Phase interface { + Do() +} \ No newline at end of file diff --git a/pkg/deployer/phase/generate.go b/pkg/deployer/phase/generate.go new file mode 100755 index 0000000..4d7161e --- /dev/null +++ b/pkg/deployer/phase/generate.go @@ -0,0 +1,21 @@ +package phase + +import "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra" + + +type GeneratePhase struct{ + Mode string // master, node +} + +func (p GeneratePhase)GenerateAssets() infra.Assets{ + //managers = [ + //"etcd", + //"manifests", + //"certs", + //] + //assets = dict() + //for i in managers: + // assets.merge(i.generateAssets()) + //return assets + return infra.Assets{} +} diff --git a/pkg/deployer/phase/init.go b/pkg/deployer/phase/init.go new file mode 100755 index 0000000..b0e860c --- /dev/null +++ b/pkg/deployer/phase/init.go @@ -0,0 +1,15 @@ +package phase + +import "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra" + +type InitPhase struct { +} + +func (p InitPhase) Do() { + generator := infra.GetBootConfigAssembler(clusterInfo.OsType) + masterInitConfig := generator.Assemble(generateInitAssets()) + masterSpec := parseSpecFromClusterInfo(clusterInfo) + _ = infraDeployer.Create(masterSpec, masterInitConfig) + apiMonitor.WaitForMastersReady(0) + +} \ No newline at end of file diff --git a/pkg/deployer/phase/join.go b/pkg/deployer/phase/join.go new file mode 100755 index 0000000..367bfa5 --- /dev/null +++ b/pkg/deployer/phase/join.go @@ -0,0 +1 @@ +package phase diff --git a/pkg/deployer/playbook/base.go b/pkg/deployer/playbook/base.go new file mode 100755 index 0000000..c945088 --- /dev/null +++ b/pkg/deployer/playbook/base.go @@ -0,0 +1,28 @@ +package playbook + +import ( + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/deployer" + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/deployer/phase" +) + +type Playbook struct { + clusterInfo deployer.ClusterInfo + phases []phase.Phase +} + + +func (p Playbook) Start() { + for _, i := range p.phases{ + p.Run(i) + } +} + + +func (p *Playbook) AddPhase(phase phase.Phase){ + p.phases = append(p.phases, phase) +} + + +func (p Playbook) Run(phase phase.Phase) { + +} \ No newline at end of file diff --git a/pkg/deployer/playbook/oneshot.go b/pkg/deployer/playbook/oneshot.go new file mode 100755 index 0000000..d0a498c --- /dev/null +++ b/pkg/deployer/playbook/oneshot.go @@ -0,0 +1,15 @@ +package playbook + +import "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/deployer/phase" + +func OneshotPlaybook() Playbook{ + return Playbook{ + phase.InitPhase{}, + } +} + +//managers = [ +//"etcd", +//"manifests", +//"certs", +//] \ No newline at end of file diff --git a/pkg/deployer/playbook/upgrade.go b/pkg/deployer/playbook/upgrade.go new file mode 100755 index 0000000..db1daaf --- /dev/null +++ b/pkg/deployer/playbook/upgrade.go @@ -0,0 +1,6 @@ +package playbook + +type UpgradePlabook struct { + +} + diff --git a/pkg/deployer/state.go b/pkg/deployer/state.go new file mode 100755 index 0000000..9b7a6f9 --- /dev/null +++ b/pkg/deployer/state.go @@ -0,0 +1,5 @@ +package deployer + +const ( + state_ready = iota +) diff --git a/pkg/deployer/template.go b/pkg/deployer/template.go new file mode 100755 index 0000000..c1d01d1 --- /dev/null +++ b/pkg/deployer/template.go @@ -0,0 +1,10 @@ +package deployer + +import ( + "github.com/pkg/errors" + "strings" + "text/template" + + "github.com/lithammer/dedent" +) + diff --git a/pkg/deployer/utils.go b/pkg/deployer/utils.go new file mode 100755 index 0000000..fc18c22 --- /dev/null +++ b/pkg/deployer/utils.go @@ -0,0 +1,17 @@ +package deployer + +// 通过grpc请求handler完成操作 + +func DownloadFile(content, path string){ + +} + + +func PullImage(){ + +} + + +func WriteConfig(content, path string){ + +} diff --git a/pkg/deployer/workflow.go b/pkg/deployer/workflow.go new file mode 100755 index 0000000..e4e5f4b --- /dev/null +++ b/pkg/deployer/workflow.go @@ -0,0 +1,74 @@ +package deployer + +import ( + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg" + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/deployer/phase" + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra" +) +// TODO 断点续传机制 + +func InitCluster(filename string) error { + // TODO cluster和vm的状态机制, init, pending, + // cluster state: pending, running, stopped + // infra state: none, pending, created, starting, running, stopping, stopped + // k8s state: TODO + + + clusterInfo := ParseFromFile(filename) + infraDeployer := infra.GetInfraDeployer(clusterInfo.InfraDriver) + bootConfigAssembler := infra.GetBootConfigAssembler(clusterInfo.InfraDriver) + + infraSpec := parseSpecFromClusterInfo(clusterInfo) + assets := generateInitAssets() + bootConfig := bootConfigAssembler.Assemble(assets) + _ = infraDeployer.Create(infraSpec, bootConfig) + apiMonitor := pkg.ApiMonitor{clusterInfo.ApiEndpoint} + apiMonitor.WaitForMastersReady(0) + return nil +} + + + +func JoinToCluster(filename string) { + clusterInfo := ParseFromFile(filename) + infraDeployer := infra.GetInfraDeployer(clusterInfo.InfraDriver) + apiMonitor := pkg.ApiMonitor{clusterInfo.ApiEndpoint} + + generator := infra.GetBootConfigAssembler(clusterInfo.InfraDriver) + initConfig := generator.Assemble(generateJoinAssets()) + spec := parseSpecFromClusterInfo(clusterInfo) + _ = infraDeployer.Create(spec, initConfig) + apiMonitor.WaitForWorkersReady(0) +} + +func OneShot(filename string){ + clusterInfo := ParseFromFile(filename) + infraDeployer := infra.GetInfraDeployer(clusterInfo.InfraDriver) + apiMonitor := pkg.ApiMonitor{clusterInfo.ApiEndpoint} + + generatePhase := phase.GeneratePhase{"master"} + assets := generatePhase.GenerateAssets() + + generator := infra.GetBootConfigAssembler(clusterInfo.OsType) + masterInitConfig := generator.Assemble(assets) + masterSpec := parseSpecFromClusterInfo(clusterInfo) + _ = infraDeployer.Create(masterSpec, masterInitConfig) + apiMonitor.WaitForMastersReady(0) + + + initConfig := generator.Assemble(generateJoinAssets()) + spec := parseSpecFromClusterInfo(clusterInfo) + _ = infraDeployer.Create(spec, initConfig) + apiMonitor.WaitForWorkersReady(0) + +} + +func parseSpecFromClusterInfo(info ClusterInfo) infra.InfraSpec { + return infra.InfraSpec{} +} + + + +func generateJoinAssets() infra.Assets{ + return infra.Assets{} +} diff --git a/pkg/infra/assets.go b/pkg/infra/assets.go new file mode 100755 index 0000000..8ebcc7e --- /dev/null +++ b/pkg/infra/assets.go @@ -0,0 +1,16 @@ +package infra + +// path : contents +type Assets map[string][]byte + +func (a Assets) ToDir(dirname string) error { + return nil +} + +func (a *Assets) Merge(b Assets) *Assets { + return a +} + +type AssetsGenerator interface { + GenerateAssets() Assets +} \ No newline at end of file diff --git a/pkg/infra/factory.go b/pkg/infra/factory.go new file mode 100755 index 0000000..eb0c340 --- /dev/null +++ b/pkg/infra/factory.go @@ -0,0 +1,18 @@ +package infra + +import "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/bootconfig" + +func GetInfraDeployer(driverType string) InfraDeployer { + if driverType == "openstack"{ + return OpenstackDeployer{} + } + return nil +} + + +func GetBootConfigAssembler(osType string) BootConfigAssembler { + if osType == "NestOS"{ + return bootconfig.IgnitionAssembler{} + } + return nil +} \ No newline at end of file diff --git a/pkg/infra/infradeployer.go b/pkg/infra/infradeployer.go new file mode 100755 index 0000000..d666ce6 --- /dev/null +++ b/pkg/infra/infradeployer.go @@ -0,0 +1,17 @@ +package infra + +type InfraSpec struct{ + diskSize string + memorySize string + image string + clusterCIDR string + initFileContent string +} + + +type InfraDeployer interface { + Create(spec InfraSpec, config InitConfig) error +} + + + diff --git a/pkg/infra/initconfig.go b/pkg/infra/initconfig.go new file mode 100755 index 0000000..97c4bde --- /dev/null +++ b/pkg/infra/initconfig.go @@ -0,0 +1,10 @@ +package infra + +type InitConfig struct{ + OsType string +} + + +type BootConfigAssembler interface { + Assemble(assets Assets) InitConfig +} diff --git a/pkg/infra/openstack.go b/pkg/infra/openstack.go new file mode 100755 index 0000000..393a880 --- /dev/null +++ b/pkg/infra/openstack.go @@ -0,0 +1,10 @@ +package infra + + +type OpenstackDeployer struct { +} + + +func (t OpenstackDeployer) Create(spec InfraSpec, config InitConfig) error{ + return nil +} diff --git a/pkg/manager/manager.go b/pkg/manager/manager.go new file mode 100644 index 0000000..e69de29 diff --git a/pkg/osimage/osimage.go b/pkg/osimage/osimage.go new file mode 100644 index 0000000..e69de29 diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go new file mode 100644 index 0000000..e69de29 -- Gitee