mirror of https://github.com/k3s-io/k3s
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.1 KiB
91 lines
2.1 KiB
1 year ago
|
//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 ""
|
||
|
}
|