k3s/pkg/agent/cridockerd/cridockerd.go

95 lines
2.4 KiB
Go

//go:build !no_cri_dockerd
// +build !no_cri_dockerd
package cridockerd
import (
"context"
"errors"
"os"
"runtime/debug"
"strings"
"github.com/Mirantis/cri-dockerd/cmd"
"github.com/Mirantis/cri-dockerd/cmd/version"
"github.com/k3s-io/k3s/pkg/agent/cri"
"github.com/k3s-io/k3s/pkg/cgroups"
"github.com/k3s-io/k3s/pkg/daemons/config"
"github.com/sirupsen/logrus"
utilsnet "k8s.io/utils/net"
)
func Run(ctx context.Context, cfg *config.Node) error {
if err := setupDockerCRIConfig(ctx, cfg); err != nil {
return err
}
args := getDockerCRIArgs(cfg)
command := cmd.NewDockerCRICommand(ctx.Done())
command.SetArgs(args)
logrus.Infof("Running cri-dockerd %s", config.ArgString(args))
logrus.Infof("cri-dockerd version %s", version.FullVersion())
go func() {
defer func() {
if err := recover(); err != nil {
logrus.WithField("stack", string(debug.Stack())).Fatalf("cri-dockerd panic: %v", err)
}
}()
err := command.ExecuteContext(ctx)
if err != nil && !errors.Is(err, context.Canceled) {
logrus.Errorf("cri-dockerd exited: %v", err)
os.Exit(1)
}
os.Exit(0)
}()
return cri.WaitForService(ctx, cfg.CRIDockerd.Address, "cri-dockerd")
}
func getDockerCRIArgs(cfg *config.Node) []string {
argsMap := map[string]string{
"container-runtime-endpoint": cfg.CRIDockerd.Address,
"cri-dockerd-root-directory": cfg.CRIDockerd.Root,
"streaming-bind-addr": "127.0.0.1:10010",
}
if dualNode, _ := utilsnet.IsDualStackIPs(cfg.AgentConfig.NodeIPs); dualNode {
argsMap["ipv6-dual-stack"] = "true"
}
if logLevel := os.Getenv("CRIDOCKERD_LOG_LEVEL"); logLevel != "" {
argsMap["log-level"] = logLevel
}
if cfg.ContainerRuntimeEndpoint != "" {
endpoint := cfg.ContainerRuntimeEndpoint
if !strings.HasPrefix(endpoint, socketPrefix) {
endpoint = socketPrefix + endpoint
}
argsMap["docker-endpoint"] = endpoint
}
if cfg.AgentConfig.CNIConfDir != "" {
argsMap["cni-conf-dir"] = cfg.AgentConfig.CNIConfDir
}
if cfg.AgentConfig.CNIBinDir != "" {
argsMap["cni-bin-dir"] = cfg.AgentConfig.CNIBinDir
}
if cfg.AgentConfig.CNIPlugin {
argsMap["network-plugin"] = "cni"
}
if cfg.AgentConfig.PauseImage != "" {
argsMap["pod-infra-container-image"] = cfg.AgentConfig.PauseImage
}
_, runtimeRoot, _ := cgroups.CheckCgroups()
if runtimeRoot != "" {
argsMap["runtime-cgroups"] = runtimeRoot
}
return config.GetArgs(argsMap, nil)
}