k3s/pkg/daemons/executor/embed_windows.go

91 lines
2.1 KiB
Go

//go:build windows && !no_embedded_executor
// +build windows,!no_embedded_executor
package executor
import (
"encoding/json"
"os"
"os/exec"
"strings"
"time"
"github.com/Microsoft/hcsshim"
"github.com/sirupsen/logrus"
// registering k3s cloud provider
_ "github.com/k3s-io/k3s/pkg/cloudprovider"
daemonconfig "github.com/k3s-io/k3s/pkg/daemons/config"
)
const (
networkName = "flannel.4096"
)
type SourceVipResponse struct {
IP4 struct {
IP string `json:"ip"`
} `json:"ip4"`
}
func platformKubeProxyArgs(nodeConfig *daemonconfig.Node) map[string]string {
argsMap := map[string]string{}
argsMap["network-name"] = networkName
if sourceVip := waitForSourceVip(networkName, nodeConfig); sourceVip != "" {
argsMap["source-vip"] = sourceVip
}
return argsMap
}
func waitForSourceVip(networkName string, nodeConfig *daemonconfig.Node) string {
for range time.Tick(time.Second * 5) {
network, err := hcsshim.GetHNSNetworkByName(networkName)
if err != nil {
logrus.WithError(err).Warningf("can't find HNS network, retrying %s", networkName)
continue
}
if network.ManagementIP == "" {
logrus.WithError(err).Warningf("wait for management IP, retrying %s", networkName)
continue
}
subnet := network.Subnets[0].AddressPrefix
configData := `{
"cniVersion": "0.2.0",
"name": "vxlan0",
"ipam": {
"type": "host-local",
"ranges": [[{"subnet":"` + subnet + `"}]],
"dataDir": "/var/lib/cni/networks"
}
}`
cmd := exec.Command("host-local.exe")
cmd.Env = append(os.Environ(),
"CNI_COMMAND=ADD",
"CNI_CONTAINERID=dummy",
"CNI_NETNS=dummy",
"CNI_IFNAME=dummy",
"CNI_PATH="+nodeConfig.AgentConfig.CNIBinDir,
)
cmd.Stdin = strings.NewReader(configData)
out, err := cmd.Output()
if err != nil {
logrus.WithError(err).Warning("Failed to execute host-local.exe")
continue
}
var sourceVipResp SourceVipResponse
err = json.Unmarshal(out, &sourceVipResp)
if err != nil {
logrus.WithError(err).Warning("Failed to unmarshal sourceVip response")
continue
}
return strings.TrimSpace(strings.Split(sourceVipResp.IP4.IP, "/")[0])
}
return ""
}