diff --git a/app/apis/nkd/const.go b/app/apis/nkd/const.go index 29b65a0c67a035826ad85c0e2c258d74c016ec9a..e0304bfbdd2cfcfed6fdc4f8ee75cc35269ca1d9 100644 --- a/app/apis/nkd/const.go +++ b/app/apis/nkd/const.go @@ -24,13 +24,11 @@ var ( // system MasterHostName = "master" WorkerHostName = "worker" - // Hostname2 = "master01" - // Hostname3 = "master01" - Username = "root" - Password = "********" + Username = "root" + Password = "" // repo - Secret = []map[string]string{{"repousre": "********"}} + Secret = []map[string]string{{"repousre": ""}} Registry = "registry.cn-hangzhou.aliyuncs.com/google_containers" // infra @@ -42,19 +40,19 @@ var ( Disk = 128 // openstack - Openstack_UserName = "admin" - Openstack_Password = "********" - Openstack_Tenant_name = "********" - Openstack_Auth_url = "********" - Openstack_Region = "********" + Openstack_UserName = "" + Openstack_Password = "" + Openstack_Tenant_name = "" + Openstack_Auth_url = "" + Openstack_Region = "" Openstack_MasterNodeName = []string{"master01", "master02", "master03"} - Openstack_WorkerNodeName = []string{"node01", "node02", "node03"} - Openstack_Internal_network = "existing internal net name" - Openstack_External_network = "existing external net name" + Openstack_WorkerNodeName = []string{"worker01", "worker02", "worker03"} + Openstack_Internal_network = "" + Openstack_External_network = "" Openstack_Master_ip = []string{"10.1.10.51", "10.1.10.52", "10.1.10.53"} - Openstack_Worker_ip = []string{"*.*.*.*", "*.*.*.*", "*.*.*.*"} - Openstack_Flavor_Name = "existing flavor name" - Openstack_Glance_Name = "existing glance name" + Openstack_Worker_ip = []string{"", "", ""} + Openstack_Flavor_Name = "" + Openstack_Glance_Name = "" // bootstrapTokens BootstrapTokensGroups = []string{"system:bootstrappers:kubeadm:default-node-token"} @@ -105,10 +103,10 @@ var ( Master_Count = 3 Worker_Count = 3 - SSHKey = "ssh-rsa AAAAB3N... root@localhost.localdomain" + SSHKey = "" // containerdaemon PauseImageTag = "3.6" CorednsImageTag = "v1.8.6" - ReleaseImageURl = "" + ReleaseImageURl = "hub.oepkgs.net/nestos/nestos-test@sha256:857058e7fb43155bec0f648d7e1004abf72266b0b45a49a92138881f334a1988" ) diff --git a/app/cmd/cmd.go b/app/cmd/cmd.go index 71ecaa8f0ee9bc54f69f97155f1db7c61b1e4b41..ccd1af3ad13c36ece286f067f54c433716f6ace6 100755 --- a/app/cmd/cmd.go +++ b/app/cmd/cmd.go @@ -29,7 +29,6 @@ func NewNkdCommand(in io.Reader, out, err io.Writer) *cobra.Command { cmds.ResetFlags() // TODO: 修改名称 - // TODO: 添加ExtendCommand cmds.AddCommand(NewConfigCommand()) cmds.AddCommand(NewDeployCommand()) cmds.AddCommand(NewDestroyCommand()) diff --git a/app/cmd/config.go b/app/cmd/config.go index 2335d9f754a3724214af4e31071545c1f4584e41..cd68e5a8f36f83982709ca09b069a105cf1f4dbc 100755 --- a/app/cmd/config.go +++ b/app/cmd/config.go @@ -16,7 +16,7 @@ limitations under the License. package cmd import ( - phases "nestos-kubernetes-deployer/app/cmd/phases/config" + "nestos-kubernetes-deployer/app/cmd/phases/config" "nestos-kubernetes-deployer/app/cmd/phases/workflow" "github.com/spf13/cobra" @@ -32,7 +32,7 @@ func NewConfigCommand() *cobra.Command { }, } - cmd.AddCommand(phases.NewPrintDefaultNkdConfigCommand()) + cmd.AddCommand(config.NewPrintDefaultNkdConfigCommand()) cmd.AddCommand(NewInitDefaultNkdConfigCommand()) return cmd } diff --git a/app/cmd/deploy.go b/app/cmd/deploy.go index fdc3ae00b3226e0d768d4de2d191c798e06bc073..11f0ebe51b5b0c9ac81409323e298de10bcc7425 100755 --- a/app/cmd/deploy.go +++ b/app/cmd/deploy.go @@ -16,7 +16,7 @@ limitations under the License. package cmd import ( - "nestos-kubernetes-deployer/app/phases/infra" + "nestos-kubernetes-deployer/app/cmd/phases/deploy" "github.com/spf13/cobra" ) @@ -26,14 +26,12 @@ func NewDeployCommand() *cobra.Command { Use: "deploy", Short: "Deploy kubernetes cluster", RunE: func(cmd *cobra.Command, args []string) error { - cluster := &infra.Cluster{ - Dir: "./", - Node: "master", - } - - return cluster.Create() + return cmd.Help() }, } + cmd.AddCommand(deploy.NewDeployMasterCommand()) + cmd.AddCommand(deploy.NewDeployWorkerCommand()) + return cmd } diff --git a/app/cmd/extend.go b/app/cmd/extend.go index 3d2d8e9b88cdcbbd6e0f3877a9e9d6c1bc241229..941d374a1ba414009c10e1dbf33a928bfb4041a4 100755 --- a/app/cmd/extend.go +++ b/app/cmd/extend.go @@ -16,22 +16,27 @@ limitations under the License. package cmd import ( - "nestos-kubernetes-deployer/app/cmd/phases/extend" + "nestos-kubernetes-deployer/app/phases/infra" "github.com/spf13/cobra" ) func NewExtendCommand() *cobra.Command { + var num int cmd := &cobra.Command{ - Use: "extend", - Short: "Extend kubernetes cluster", + Use: "extended", + Short: "Extended worker nodes of kubernetes cluster", RunE: func(cmd *cobra.Command, args []string) error { - return cmd.Help() + cluster := &infra.Cluster{ + Node: "worker", + Num: num, + } + + return cluster.Extend() }, } - cmd.AddCommand(extend.NewExtendMasterCommand()) - cmd.AddCommand(extend.NewExtendWorkerCommand()) + cmd.PersistentFlags().IntVarP(&num, "num", "n", 3, "number of the extended nodes") return cmd } diff --git a/app/cmd/init.go b/app/cmd/init.go index 3b357f0812242576958cd715988edc303fbddd85..1517bf32ce72c895f0d1d7ee54c911669c08c62a 100755 --- a/app/cmd/init.go +++ b/app/cmd/init.go @@ -18,7 +18,7 @@ package cmd import ( "nestos-kubernetes-deployer/app/apis/nkd" - phases "nestos-kubernetes-deployer/app/cmd/phases/init" + "nestos-kubernetes-deployer/app/cmd/phases/initconfig" "nestos-kubernetes-deployer/app/cmd/phases/workflow" "nestos-kubernetes-deployer/app/util/config" @@ -28,12 +28,6 @@ import ( type initData struct { mastercfg *nkd.Master workercfg *nkd.Worker - // cfg *nkd.Master - // cfg *interface{} -} - -type Config struct { - config string } func NewInitDefaultNkdConfigCommand() *cobra.Command { @@ -57,10 +51,9 @@ func NewInitDefaultNkdConfigCommand() *cobra.Command { return initRunner.Run() }, } - phases.NewGenerateCertsCmd() - // initRunner.AppendPhase(phases.NewGenerateCertsCmd()) - initRunner.AppendPhase(phases.NewGenerateIgnCmd()) - initRunner.AppendPhase(phases.NewGenerateTFCmd()) + // initRunner.AppendPhase(initconfig.NewGenerateCertsCmd()) + initRunner.AppendPhase(initconfig.NewGenerateIgnCmd()) + initRunner.AppendPhase(initconfig.NewGenerateTFCmd()) cmd.PersistentFlags().StringVarP(&config, "config", "c", "", "config for init") return cmd } @@ -73,13 +66,12 @@ func (i *initData) WorkerCfg() *nkd.Worker { return i.workercfg } func newInitData(cmd *cobra.Command, args []string, cfgPath string) (*initData, string, error) { - // var newNkd *nkd.Master cfg, nodetype, err := config.LoadOrDefaultInitConfiguration(cfgPath) if err != nil { return nil, "", err } _, ok := cfg.(*nkd.Master) - if ok == true { + if ok { return &initData{ mastercfg: cfg.(*nkd.Master), }, nodetype, nil diff --git a/app/cmd/phases/config/print.go b/app/cmd/phases/config/print.go index 4fa810c0253b7cb64bea1260cfe79d3a9e43674b..c86da25927bf3037c7e6afdc0875e1d97c2cbe2d 100644 --- a/app/cmd/phases/config/print.go +++ b/app/cmd/phases/config/print.go @@ -14,10 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package phases +package config import ( "fmt" + "os" + "path/filepath" "nestos-kubernetes-deployer/app/apis/nkd" @@ -63,18 +65,32 @@ func runPrintDefaultConfig(node string) error { internalconfig := &nkd.Master{} DefaultedStaticMasterConfiguration(internalconfig) conf, err := yaml.Marshal(&internalconfig) - fmt.Println(string(conf)) if err != nil { return err } + + if err = os.MkdirAll(node, os.ModePerm); err != nil { + return err + } + + if err = os.WriteFile(filepath.Join(node, "master.yaml"), conf, 0644); err != nil { + return err + } } else if node == "worker" { internalconfig := &nkd.Worker{} DefaultedStaticWorkerConfiguration(internalconfig) conf, err := yaml.Marshal(&internalconfig) - fmt.Println(string(conf)) if err != nil { return err } + + if err = os.MkdirAll(node, os.ModePerm); err != nil { + return err + } + + if err = os.WriteFile(filepath.Join(node, "worker.yaml"), conf, 0644); err != nil { + return err + } } return nil } @@ -98,7 +114,7 @@ func DefaultedStaticWorkerConfiguration(internalconfig *nkd.Worker) *nkd.Worker system1 := nkd.System{ Count: nkd.Master_Count, - Ips: nkd.Openstack_Master_ip, + Ips: nkd.Openstack_Worker_ip, WorkerHostName: nkd.WorkerHostName, MasterHostName: nkd.MasterHostName, Username: nkd.Username, diff --git a/app/cmd/phases/extend/extend.go b/app/cmd/phases/deploy/deploy.go similarity index 62% rename from app/cmd/phases/extend/extend.go rename to app/cmd/phases/deploy/deploy.go index cae783190b08e07c11db67df6de6a3ddc41c6ad4..bee06cc72f85a2a9af6fdcc39d9bf8ed366f7215 100644 --- a/app/cmd/phases/extend/extend.go +++ b/app/cmd/phases/deploy/deploy.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package extend +package deploy import ( "nestos-kubernetes-deployer/app/phases/infra" @@ -22,48 +22,34 @@ import ( "github.com/spf13/cobra" ) -func NewExtendMasterCommand() *cobra.Command { - var num string +func NewDeployMasterCommand() *cobra.Command { cmd := &cobra.Command{ Use: "master", - Short: "Extend kubernetes master node", + Short: "deploy kubernetes master node", RunE: func(cmd *cobra.Command, args []string) error { cluster := &infra.Cluster{ - Dir: "./", Node: "master", - Num: num, } - if num == "" { - return cmd.Help() - } - return cluster.Extend() + return cluster.Deploy() }, } - cmd.PersistentFlags().StringVarP(&num, "num", "n", "", "number of the extend nodes") return cmd } -func NewExtendWorkerCommand() *cobra.Command { - var num string +func NewDeployWorkerCommand() *cobra.Command { cmd := &cobra.Command{ Use: "worker", - Short: "Extend kubernetes worker node", + Short: "deploy kubernetes worker node", RunE: func(cmd *cobra.Command, args []string) error { cluster := &infra.Cluster{ - Dir: "./", Node: "worker", - Num: num, } - if num == "" { - return cmd.Help() - } - return cluster.Extend() + return cluster.Deploy() }, } - cmd.PersistentFlags().StringVarP(&num, "num", "n", "", "number of the extend nodes") return cmd } diff --git a/app/cmd/phases/destroy/destroy.go b/app/cmd/phases/destroy/destroy.go index 9712db6eecf6ccff70489cc24015edc5eb9241e2..7ee45359924615b6d7bfaf91f9a3289e619a9a43 100644 --- a/app/cmd/phases/destroy/destroy.go +++ b/app/cmd/phases/destroy/destroy.go @@ -28,7 +28,6 @@ func NewDestroyMasterCommand() *cobra.Command { Short: "destroy kubernetes master node", RunE: func(cmd *cobra.Command, args []string) error { cluster := &infra.Cluster{ - Dir: "./", Node: "master", } @@ -45,7 +44,6 @@ func NewDestroyWorkerCommand() *cobra.Command { Short: "destroy kubernetes worker node", RunE: func(cmd *cobra.Command, args []string) error { cluster := &infra.Cluster{ - Dir: "./", Node: "worker", } diff --git a/app/cmd/phases/init/cert.go b/app/cmd/phases/initconfig/cert.go similarity index 98% rename from app/cmd/phases/init/cert.go rename to app/cmd/phases/initconfig/cert.go index 177bb679db537dee68ef5499ce56cae5d2e2f5de..8d204c4baf752f9cec05f67751af8afdade4486b 100644 --- a/app/cmd/phases/init/cert.go +++ b/app/cmd/phases/initconfig/cert.go @@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -package phases +package initconfig import ( "fmt" diff --git a/app/cmd/phases/init/data.go b/app/cmd/phases/initconfig/data.go similarity index 97% rename from app/cmd/phases/init/data.go rename to app/cmd/phases/initconfig/data.go index 6409fdf53f94ad3c648f3c081e60b1f4fe14b81d..a67bc19d65fa584a0070b811962f5a6f0517ad44 100644 --- a/app/cmd/phases/init/data.go +++ b/app/cmd/phases/initconfig/data.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package phases +package initconfig import "nestos-kubernetes-deployer/app/apis/nkd" diff --git a/app/cmd/phases/init/ign.go b/app/cmd/phases/initconfig/ign.go similarity index 99% rename from app/cmd/phases/init/ign.go rename to app/cmd/phases/initconfig/ign.go index 2fc9ec9e5163b05c41e6dfbc245e767614e9567e..82c10dd9d25acabe676fce0e3c4d3ed04757ad1a 100644 --- a/app/cmd/phases/init/ign.go +++ b/app/cmd/phases/initconfig/ign.go @@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -package phases +package initconfig import ( "bytes" @@ -251,7 +251,7 @@ func AddStorageFiles(config *igntypes.Config, base string, uri string, tmplData if err != nil { return err } - ign := fileFromBytes(strings.TrimSuffix(base, ".template"), 0644, data) + ign := fileFromBytes(strings.TrimSuffix(base, ".template"), 0755, data) config.Storage.Files = appendFiles(config.Storage.Files, ign) return nil } diff --git a/app/cmd/phases/init/tf.go b/app/cmd/phases/initconfig/tf.go similarity index 67% rename from app/cmd/phases/init/tf.go rename to app/cmd/phases/initconfig/tf.go index 607454620bd26cc2bf69536dd9e090d261f95dba..6024e097a5f129d032a91ebcb1c17137323bc689 100644 --- a/app/cmd/phases/init/tf.go +++ b/app/cmd/phases/initconfig/tf.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package phases +package initconfig import ( "fmt" @@ -30,20 +30,20 @@ import ( func NewGenerateTFCmd() workflow.Phase { return workflow.Phase{ Name: "tf", - Short: "Run tf to generate certs", + Short: "Run tf to generate .tf config files", Run: runGenerateTFConfig, } } func runGenerateTFConfig(r workflow.RunData, node string) error { - outputFile, err := os.Create(filepath.Join("./", fmt.Sprintf("%s.tf", node))) + outputFile, err := os.Create(filepath.Join(node, fmt.Sprintf("%s.tf", node))) if err != nil { return errors.Wrap(err, "failed to create terraform config file") } defer outputFile.Close() // 从文件中读取 terraformConfig - terraformConfig, err := os.ReadFile(filepath.Join("resource/templates/terraform", fmt.Sprintf("%s.tf.tpl", node))) + terraformConfig, err := os.ReadFile(filepath.Join("data/terraform", fmt.Sprintf("%s.tf.template", node))) if err != nil { return errors.Wrap(err, "failed to read terraform config template") } @@ -54,20 +54,29 @@ func runGenerateTFConfig(r workflow.RunData, node string) error { return errors.Wrap(err, "failed to create terraform config template") } - quotedStrs := make([]string, len(r.(InitData).MasterCfg().System.Ips)) - for i, s := range r.(InitData).MasterCfg().System.Ips { - quotedStrs[i] = fmt.Sprintf(`"%s"`, s) - } - joinedStr := strings.Join(quotedStrs, ",") - - r.(InitData).MasterCfg().System.Ips = []string{joinedStr} - // 将填充后的数据写入文件 if node == "master" { + quotedStrs := make([]string, len(r.(InitData).MasterCfg().System.Ips)) + for i, s := range r.(InitData).MasterCfg().System.Ips { + quotedStrs[i] = fmt.Sprintf(`"%s"`, s) + } + joinedStr := strings.Join(quotedStrs, ",") + + r.(InitData).MasterCfg().System.Ips = []string{joinedStr} + err = tmpl.Execute(outputFile, r.(InitData).MasterCfg()) } else { + quotedStrs := make([]string, len(r.(InitData).WorkerCfg().System.Ips)) + for i, s := range r.(InitData).WorkerCfg().System.Ips { + quotedStrs[i] = fmt.Sprintf(`"%s"`, s) + } + joinedStr := strings.Join(quotedStrs, ",") + + r.(InitData).WorkerCfg().System.Ips = []string{joinedStr} + err = tmpl.Execute(outputFile, r.(InitData).WorkerCfg()) } + if err != nil { return errors.Wrap(err, "failed to write terraform config") } diff --git a/app/phases/infra/deploy.go b/app/phases/infra/deploy.go new file mode 100644 index 0000000000000000000000000000000000000000..0ac146ebf5bd38cd7339a0c95476743a8768895a --- /dev/null +++ b/app/phases/infra/deploy.go @@ -0,0 +1,49 @@ +/* +Copyright 2023 KylinSoft Co., Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package infra + +import ( + "nestos-kubernetes-deployer/app/phases/infra/terraform" + "os" + "path/filepath" + + "github.com/hashicorp/terraform-exec/tfexec" +) + +func executeApplyTerraform(tfDir string, terraformDir string) ([]byte, error) { + var applyOpts []tfexec.ApplyOption + return applyTerraform(tfDir, terraformDir, applyOpts...) +} + +func applyTerraform(tfDir string, terraformDir string, applyOpts ...tfexec.ApplyOption) ([]byte, error) { + applyErr := terraform.TFApply(tfDir, terraformDir, applyOpts...) + if applyErr != nil { + return nil, applyErr + } + + _, err := os.Stat(filepath.Join(tfDir, "terraform.tfstate")) + if os.IsNotExist(err) { + return nil, err + } + + outputs, err := terraform.Outputs(tfDir, terraformDir) + if err != nil { + return nil, err + } + + return outputs, nil +} diff --git a/app/phases/infra/destroy.go b/app/phases/infra/destroy.go new file mode 100644 index 0000000000000000000000000000000000000000..9719a2a3e0bfe9739717d718e2b83173ad4a3780 --- /dev/null +++ b/app/phases/infra/destroy.go @@ -0,0 +1,37 @@ +/* +Copyright 2023 KylinSoft Co., Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package infra + +import ( + "nestos-kubernetes-deployer/app/phases/infra/terraform" + + "github.com/hashicorp/terraform-exec/tfexec" +) + +func executeDestroyTerraform(tfDir string, terraformDir string) error { + var destroyOpts []tfexec.DestroyOption + return destroyTerraform(tfDir, terraformDir, destroyOpts...) +} + +func destroyTerraform(tfDir string, terraformDir string, destroyOpts ...tfexec.DestroyOption) error { + destroyErr := terraform.TFDestroy(tfDir, terraformDir, destroyOpts...) + if destroyErr != nil { + return destroyErr + } + + return nil +} diff --git a/app/phases/infra/extend.go b/app/phases/infra/extend.go new file mode 100644 index 0000000000000000000000000000000000000000..e8d5f278c31f483713bc59cf883e788a824d1506 --- /dev/null +++ b/app/phases/infra/extend.go @@ -0,0 +1,42 @@ +/* +Copyright 2023 KylinSoft Co., Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package infra + +import ( + "nestos-kubernetes-deployer/app/phases/infra/terraform" + "os" + "path/filepath" +) + +func extendTerraform(tfDir string, terraformDir string, num int) ([]byte, error) { + applyErr := terraform.TFExtend(tfDir, terraformDir, num) + if applyErr != nil { + return nil, applyErr + } + + _, err := os.Stat(filepath.Join(tfDir, "terraform.tfstate")) + if os.IsNotExist(err) { + return nil, err + } + + outputs, err := terraform.Outputs(tfDir, terraformDir) + if err != nil { + return nil, err + } + + return outputs, nil +} diff --git a/app/phases/infra/infra.go b/app/phases/infra/infra.go index b050542fa8dca7d2304e0df07cd6012b9c6c43d2..0d70709a5cf53f220087f76fbccb4f7608a7dd0f 100644 --- a/app/phases/infra/infra.go +++ b/app/phases/infra/infra.go @@ -17,29 +17,24 @@ limitations under the License. package infra import ( - "nestos-kubernetes-deployer/app/phases/infra/terraform" "os" "path/filepath" - "github.com/hashicorp/terraform-exec/tfexec" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) type Cluster struct { - Dir string // 由用户自定义,会在该路径下创建工作目录 .nkd Node string // 节点类别 - Num string // 扩展节点个数 + Num int // 扩展节点个数 } -type File struct { - Filename string - Data []byte -} - -func (c *Cluster) Create() error { +func (c *Cluster) Deploy() error { // 工作目录,包含terraform执行文件以及所需plugins - workDir := "./" + workDir, err := os.Getwd() + if err != nil { + return err + } // tf配置文件所在目录 tfDir := filepath.Join(workDir, c.Node) @@ -53,59 +48,39 @@ func (c *Cluster) Create() error { return nil } -func executeApplyTerraform(tfDir string, terraformDir string) ([]byte, error) { - var applyOpts []tfexec.ApplyOption - return applyTerraform(tfDir, terraformDir, applyOpts...) -} - -func applyTerraform(tfDir string, terraformDir string, applyOpts ...tfexec.ApplyOption) ([]byte, error) { - applyErr := terraform.TFApply(tfDir, terraformDir, applyOpts...) - if applyErr != nil { - return nil, applyErr +func (c *Cluster) Extend() error { + // 工作目录,包含terraform执行文件以及所需plugins + workDir, err := os.Getwd() + if err != nil { + return err } - _, err := os.Stat(filepath.Join(tfDir, "terraform.tfstate")) - if os.IsNotExist(err) { - return nil, err - } + // tf配置文件所在目录 + tfDir := filepath.Join(workDir, c.Node) - outputs, err := terraform.Outputs(tfDir, terraformDir) + outputs, err := extendTerraform(tfDir, workDir, c.Num) if err != nil { - return nil, err + return errors.Wrap(err, "failed to execute terraform apply") } + logrus.Info(string(outputs)) - return outputs, nil + return nil } func (c *Cluster) Destroy() error { // 工作目录,包含terraform执行文件以及所需plugins - workDir := "./" + workDir, err := os.Getwd() + if err != nil { + return err + } // tf配置文件所在目录 tfDir := filepath.Join(workDir, c.Node) - err := executeDestroyTerraform(tfDir, workDir) + err = executeDestroyTerraform(tfDir, workDir) if err != nil { return errors.Wrap(err, "failed to execute terraform destroy") } return nil } - -func executeDestroyTerraform(tfDir string, terraformDir string) error { - var destroyOpts []tfexec.DestroyOption - return destroyTerraform(tfDir, terraformDir, destroyOpts...) -} - -func destroyTerraform(tfDir string, terraformDir string, destroyOpts ...tfexec.DestroyOption) error { - destroyErr := terraform.TFDestroy(tfDir, terraformDir, destroyOpts...) - if destroyErr != nil { - return destroyErr - } - - return nil -} - -func (c *Cluster) Extend() error { - return nil -} diff --git a/app/phases/infra/terraform/terraform.go b/app/phases/infra/terraform/terraform.go index 6248805452fba82fdd6ab663888688294d285337..0656ab3e14102c7e803ce65f41940be785b683ed 100644 --- a/app/phases/infra/terraform/terraform.go +++ b/app/phases/infra/terraform/terraform.go @@ -18,6 +18,7 @@ package terraform import ( "context" + "fmt" "os" "path/filepath" @@ -71,7 +72,7 @@ func TFInit(tfDir string, terraformDir string) (err error) { } // 使用本地terraform插件 - err = tf.Init(context.Background(), tfexec.PluginDir(filepath.Join(terraformDir, "plugins"))) + err = tf.Init(context.Background(), tfexec.PluginDir(filepath.Join(terraformDir, ".terraform/providers"))) if err != nil { return errors.Wrap(err, "failed to init terraform") } @@ -98,6 +99,25 @@ func TFApply(tfDir string, terraformDir string, applyOpts ...tfexec.ApplyOption) return nil } +// terraform apply for nkd extend +func TFExtend(tfDir string, terraformDir string, num int) error { + if err := TFInit(tfDir, terraformDir); err != nil { + return errors.Wrap(err, "failed to init terraform") + } + + tf, err := newTFExec(tfDir, terraformDir) + if err != nil { + return errors.Wrap(err, "failed to create a new tfexec") + } + + err = tf.Apply(context.Background(), tfexec.Var(fmt.Sprintf("instance_count=%d", num))) + if err != nil { + return errors.Wrap(err, "failed to extend Terraform") + } + + return nil +} + // terraform destroy func TFDestroy(tfDir string, terraformDir string, destroyOpts ...tfexec.DestroyOption) error { if err := TFInit(tfDir, terraformDir); err != nil { diff --git a/app/util/config/initconfiguration.go b/app/util/config/initconfiguration.go index 9bc3f3e9622cf73896bddfc326818d57fcf1a37e..8a802071c6c3e9b4e9ba75c72b1145ba78550f41 100644 --- a/app/util/config/initconfiguration.go +++ b/app/util/config/initconfiguration.go @@ -17,7 +17,6 @@ limitations under the License. package config import ( - "fmt" "io/ioutil" "nestos-kubernetes-deployer/app/apis/nkd" @@ -32,7 +31,6 @@ func LoadOrDefaultInitConfiguration(cfgPath string) (interface{}, string, error) if err != nil { return nil, "", err } - fmt.Println(cfg) return cfg, nodetype, nil } diff --git a/resource/templates/terraform/master.tf.tpl b/data/terraform/master.tf.template similarity index 63% rename from resource/templates/terraform/master.tf.tpl rename to data/terraform/master.tf.template index b237ca04bd1d78d5059d72d757e424679638d851..e8305557287dd379bb8b7be4e419e560b0e65937 100644 --- a/resource/templates/terraform/master.tf.tpl +++ b/data/terraform/master.tf.template @@ -19,44 +19,51 @@ variable "instance_count" { default = "3" } +variable "create_flavor" { + default = true +} + variable "instance_name" { default = "{{.System.MasterHostName}}" } resource "openstack_compute_flavor_v2" "flavor" { - name = var.instance_names[count.index] + count = var.create_flavor?1:0 + name = var.instance_name ram = "{{.Infra.Vmsize.Ram}}" vcpus = "{{.Infra.Vmsize.Vcpus}}" disk = "{{.Infra.Vmsize.Disk}}" is_public = "true" } -resource "openstack_compute_secgroup_v2" "secgroup" { - name = "k8s_master_secgroup" - description = "secgroup for k8s master" - - rule { - from_port = 22 - to_port = 22 - ip_protocol = "tcp" - cidr = "0.0.0.0/0" - } - - rule { - from_port = -1 - to_port = -1 - ip_protocol = "icmp" - cidr = "0.0.0.0/0" - } -} +# resource "openstack_compute_secgroup_v2" "secgroup" { +# name = "k8s_master_secgroup" +# description = "secgroup for k8s master" +# +# rule { +# from_port = 22 +# to_port = 22 +# ip_protocol = "tcp" +# cidr = "0.0.0.0/0" +# } +# +# rule { +# from_port = -1 +# to_port = -1 +# ip_protocol = "icmp" +# cidr = "0.0.0.0/0" +# } +# } resource "openstack_compute_instance_v2" "instance" { - count = var.instance_count - name = format("${var.instance_name}%02d", count.index + 1) - image_name = "{{.Infra.Openstack.Glance}}" - flavor_name = openstack_compute_flavor_v2.flavor.name - security_groups = [openstack_compute_secgroup_v2.secgroup.name] - user_data = file("/etc/nkd/instance.ign") + count = var.instance_count + name = format("${var.instance_name}%d", count.index + 1) + image_name = "{{.Infra.Openstack.Glance}}" + flavor_name = var.instance_name + key_pair = "" + security_groups = ["K8S"] + availability_zone = "Intel Xeon Gold 6326 x86_64" + user_data = file(format("../master/${var.instance_name}%d.ign", count.index + 1)) network { name = "{{.Infra.Openstack.Internal_network}}" diff --git a/resource/templates/terraform/worker.tf.tpl b/data/terraform/worker.tf.template similarity index 62% rename from resource/templates/terraform/worker.tf.tpl rename to data/terraform/worker.tf.template index 80718e9c1d831d51baede42dedc80169c701e3da..7465aa38c4214466df7663d111d54e9486cdc29b 100644 --- a/resource/templates/terraform/worker.tf.tpl +++ b/data/terraform/worker.tf.template @@ -19,48 +19,54 @@ variable "instance_count" { default = "3" } +variable "create_flavor" { + default = true +} + variable "instance_name" { default = "{{.System.WorkerHostName}}" } resource "openstack_compute_flavor_v2" "flavor" { - name = var.instance_names[count.index] + count = var.create_flavor?1:0 + name = var.instance_name ram = "{{.Infra.Vmsize.Ram}}" vcpus = "{{.Infra.Vmsize.Vcpus}}" disk = "{{.Infra.Vmsize.Disk}}" is_public = "true" } -resource "openstack_compute_secgroup_v2" "secgroup" { - name = "k8s_worker_secgroup" - description = "secgroup for k8s worker" - - rule { - from_port = 22 - to_port = 22 - ip_protocol = "tcp" - cidr = "0.0.0.0/0" - } - - rule { - from_port = -1 - to_port = -1 - ip_protocol = "icmp" - cidr = "0.0.0.0/0" - } -} +# resource "openstack_compute_secgroup_v2" "secgroup" { +# name = "k8s_worker_secgroup" +# description = "secgroup for k8s worker" +# +# rule { +# from_port = 22 +# to_port = 22 +# ip_protocol = "tcp" +# cidr = "0.0.0.0/0" +# } +# +# rule { +# from_port = -1 +# to_port = -1 +# ip_protocol = "icmp" +# cidr = "0.0.0.0/0" +# } +# } resource "openstack_compute_instance_v2" "instance" { - count = var.instance_count - name = format("${var.instance_name}%02d", count.index + 1) - image_name = "{{.Infra.Openstack.Glance}}" - flavor_name = openstack_compute_flavor_v2.flavor.name - security_groups = [openstack_compute_secgroup_v2.secgroup.name] - user_data = file("/etc/nkd/instance.ign") + count = var.instance_count + name = format("${var.instance_name}%d", count.index + 1) + image_name = "{{.Infra.Openstack.Glance}}" + flavor_name = var.instance_name + key_pair = "" + security_groups = ["K8S"] + availability_zone = "Intel Xeon Gold 6326 x86_64" + user_data = file("${format("../worker/${var.instance_name}%d.ign", count.index + 1)}") network { name = "{{.Infra.Openstack.Internal_network}}" - fixed_ip_v4 = element({{.System.Ips}}, count.index) } }