Skip to content

Commit

Permalink
Build a shim binary that converts node-config.yaml to kubelet args
Browse files Browse the repository at this point in the history
Will remove the need to have the kubelet start from openshift master
  • Loading branch information
smarterclayton committed Apr 26, 2018
1 parent d0b8275 commit 1ef2f94
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 35 deletions.
48 changes: 48 additions & 0 deletions cmd/openshift-node-config/openshift-node-config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package main

import (
"fmt"
"math/rand"
"os"
"time"

"github.com/MakeNowJust/heredoc"
"github.com/spf13/cobra"

"k8s.io/apiserver/pkg/util/logs"

configapilatest "github.com/openshift/origin/pkg/cmd/server/apis/config/latest"
"github.com/openshift/origin/pkg/cmd/server/origin/node"
)

func main() {
logs.InitLogs()
defer logs.FlushLogs()

rand.Seed(time.Now().UTC().UnixNano())

var configFile string

cmd := &cobra.Command{
Use: "openshift-node-config",
Long: heredoc.Doc(`
Generate Kubelet configuration from node-config.yaml
This command converts an existing OpenShift node configuration into the appropriate
Kubelet command-line flags.
`),
RunE: func(cmd *cobra.Command, args []string) error {
nodeConfig, err := configapilatest.ReadAndResolveNodeConfig(configFile)
if err != nil {
return err
}
return node.WriteKubeletFlags(*nodeConfig)
},
}
cmd.Flags().StringVar(&configFile, "config", "", "The config file to convert to Kubelet arguments.")

if err := cmd.RunE(cmd, os.Args); err != nil {
fmt.Fprintf(os.Stderr, "error: %v", err)
os.Exit(1)
}
}
1 change: 1 addition & 0 deletions hack/lib/constants.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ readonly OS_SDN_COMPILE_TARGETS_LINUX=(
)
readonly OS_IMAGE_COMPILE_TARGETS_LINUX=(
"${OS_SDN_COMPILE_TARGETS_LINUX[@]}"
cmd/openshift-node-config
)
readonly OS_SCRATCH_IMAGE_COMPILE_TARGETS_LINUX=(
images/pod
Expand Down
43 changes: 43 additions & 0 deletions pkg/cmd/server/origin/node/node.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package node

import (
"fmt"
"regexp"
"strconv"
"strings"

configapi "github.com/openshift/origin/pkg/cmd/server/apis/config"
nodeoptions "github.com/openshift/origin/pkg/cmd/server/kubernetes/node/options"
)

// safeArgRegexp matches only characters that are known safe. DO NOT add to this list
// without fully considering whether that new character can be used to break shell escaping
// rules.
var safeArgRegexp = regexp.MustCompile(`^[\da-zA-Z\-=_\.,/\:]+$`)

// shellEscapeArg quotes an argument if it contains characters that my cause a shell
// interpreter to split the single argument into multiple.
func shellEscapeArg(s string) string {
if safeArgRegexp.MatchString(s) {
return s
}
return strconv.Quote(s)
}

// WriteKubeletFlags writes the correct set of flags to start a Kubelet from the provided node config to
// stdout, instead of launching anything.
func WriteKubeletFlags(nodeConfig configapi.NodeConfig) error {
kubeletArgs, err := nodeoptions.ComputeKubeletFlags(nodeConfig.KubeletArguments, nodeConfig)
if err != nil {
return fmt.Errorf("cannot create kubelet args: %v", err)
}
if err := nodeoptions.CheckFlags(kubeletArgs); err != nil {
return err
}
var outputArgs []string
for _, s := range kubeletArgs {
outputArgs = append(outputArgs, shellEscapeArg(s))
}
fmt.Println(strings.Join(outputArgs, " "))
return nil
}
37 changes: 2 additions & 35 deletions pkg/cmd/server/start/start_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import (
"os"
"os/exec"
"path/filepath"
"regexp"
"strconv"
"strings"
"syscall"

Expand All @@ -35,6 +33,7 @@ import (
networkoptions "github.com/openshift/origin/pkg/cmd/server/kubernetes/network/options"
"github.com/openshift/origin/pkg/cmd/server/kubernetes/node"
nodeoptions "github.com/openshift/origin/pkg/cmd/server/kubernetes/node/options"
originnode "github.com/openshift/origin/pkg/cmd/server/origin/node"
cmdutil "github.com/openshift/origin/pkg/cmd/util"
utilflags "github.com/openshift/origin/pkg/cmd/util/flags"
"github.com/openshift/origin/pkg/version"
Expand Down Expand Up @@ -281,7 +280,7 @@ func (o NodeOptions) RunNode() error {
}

if o.NodeArgs.WriteFlagsOnly {
return WriteKubeletFlags(*nodeConfig)
return originnode.WriteKubeletFlags(*nodeConfig)
}

return StartNode(*nodeConfig, o.NodeArgs.Components)
Expand Down Expand Up @@ -427,38 +426,6 @@ func execKubelet(kubeletArgs []string) error {
return syscall.Exec(kubeletPath, args, os.Environ())
}

// safeArgRegexp matches only characters that are known safe. DO NOT add to this list
// without fully considering whether that new character can be used to break shell escaping
// rules.
var safeArgRegexp = regexp.MustCompile(`^[\da-zA-Z\-=_\.,/\:]+$`)

// shellEscapeArg quotes an argument if it contains characters that my cause a shell
// interpreter to split the single argument into multiple.
func shellEscapeArg(s string) string {
if safeArgRegexp.MatchString(s) {
return s
}
return strconv.Quote(s)
}

// WriteKubeletFlags writes the correct set of flags to start a Kubelet from the provided node config to
// stdout, instead of launching anything.
func WriteKubeletFlags(nodeConfig configapi.NodeConfig) error {
kubeletArgs, err := nodeoptions.ComputeKubeletFlags(nodeConfig.KubeletArguments, nodeConfig)
if err != nil {
return fmt.Errorf("cannot create kubelet args: %v", err)
}
if err := nodeoptions.CheckFlags(kubeletArgs); err != nil {
return err
}
var outputArgs []string
for _, s := range kubeletArgs {
outputArgs = append(outputArgs, shellEscapeArg(s))
}
fmt.Println(strings.Join(outputArgs, " "))
return nil
}

// StartNode launches the node processes.
func StartNode(nodeConfig configapi.NodeConfig, components *utilflags.ComponentFlag) error {
kubeletArgs, err := nodeoptions.ComputeKubeletFlags(nodeConfig.KubeletArguments, nodeConfig)
Expand Down

0 comments on commit 1ef2f94

Please sign in to comment.