Andrew Rynhard d4f103ffcb fix: pass config via stdin
In order to perform upgrades the way we would like, it is important that
we avoid any bind mounts into containers. This change ensures that all
system services get their config via stdin.

Signed-off-by: Andrew Rynhard <andrew@rynhard.io>
2020-08-20 15:26:13 -07:00

123 lines
2.8 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package main
import (
"flag"
"log"
"os"
"path/filepath"
"github.com/kubernetes-sigs/bootkube/pkg/bootkube"
"github.com/kubernetes-sigs/bootkube/pkg/util"
"github.com/talos-systems/talos/pkg/machinery/config/configloader"
"github.com/talos-systems/talos/pkg/machinery/constants"
)
var (
strict *bool
recover *bool
recoverSource *string
)
func init() {
log.SetFlags(log.Lshortfile | log.Ldate | log.Lmicroseconds | log.Ltime)
strict = flag.Bool("strict", true, "require all manifests to cleanly apply")
recover = flag.Bool("recover", false, "run recovery instead of generate")
recoverSource = flag.String("recover-source", "ETCD", "recovery source to use")
flag.Parse()
}
func run() error {
if err := os.MkdirAll(constants.ManifestsDirectory, 0o644); err != nil {
return err
}
defaultRequiredPods := []string{
"kube-system/pod-checkpointer",
"kube-system/kube-apiserver",
"kube-system/kube-scheduler",
"kube-system/kube-controller-manager",
}
cfg := bootkube.Config{
AssetDir: constants.AssetsDirectory,
PodManifestPath: constants.ManifestsDirectory,
Strict: *strict,
RequiredPods: defaultRequiredPods,
}
bk, err := bootkube.NewBootkube(cfg)
if err != nil {
return err
}
failed := true
defer func() {
// We want to cleanup the manifests directory only if bootkube fails.
if failed {
if err = os.RemoveAll(constants.ManifestsDirectory); err != nil {
log.Printf("failed to cleanup manifests dir %s", constants.ManifestsDirectory)
}
}
if err = os.RemoveAll(constants.AssetsDirectory); err != nil {
log.Printf("failed to cleanup bootkube assets dir %s", constants.AssetsDirectory)
}
bootstrapWildcard := filepath.Join(constants.ManifestsDirectory, "bootstrap-*")
var bootstrapFiles []string
bootstrapFiles, err = filepath.Glob(bootstrapWildcard)
if err != nil {
log.Printf("error finding bootstrap files in manifests dir %s", constants.ManifestsDirectory)
}
for _, bootstrapFile := range bootstrapFiles {
if err = os.Remove(bootstrapFile); err != nil {
log.Printf("error deleting bootstrap file in manifests dir : %s", err)
}
}
}()
if err = bk.Run(); err != nil {
return err
}
failed = false
return nil
}
func main() {
util.InitLogs()
defer util.FlushLogs()
config, err := configloader.NewFromStdin()
if err != nil {
log.Fatal(err)
}
if *recover {
if err := recoverAssets(config); err != nil {
log.Fatalf("error recovering assets: %s", err)
}
} else {
if err := generateAssets(config); err != nil {
log.Fatalf("error generating assets: %s", err)
}
}
if err := run(); err != nil {
log.Fatalf("bootkube failed: %s", err)
}
}