diff --git a/cmd/multus-daemon/main.go b/cmd/multus-daemon/main.go index cdefcac12..6d6236f8a 100644 --- a/cmd/multus-daemon/main.go +++ b/cmd/multus-daemon/main.go @@ -49,7 +49,7 @@ const ( defaultMultusMasterCNIFile = "" defaultMultusNamespaceIsolation = false defaultMultusReadinessIndicatorFile = "" - defaultMultusRunDir = "/host/var/run/multus-cni/" + defaultMultusRunDir = "/host/run/multus-cni/" ) const ( @@ -228,7 +228,7 @@ func startMultusDaemon(configFilePath string) error { return fmt.Errorf("failed to prepare the cni-socket for communicating with the shim: %w", err) } - server, err := srv.NewCNIServer(daemonConfig.MultusSocketDir, config) + server, err := srv.NewCNIServer(daemonConfig, config) if err != nil { return fmt.Errorf("failed to create the server: %v", err) } diff --git a/deployments/multus-daemonset-thick.yml b/deployments/multus-daemonset-thick.yml index b0904120b..d1cd3c28d 100644 --- a/deployments/multus-daemonset-thick.yml +++ b/deployments/multus-daemonset-thick.yml @@ -102,13 +102,14 @@ metadata: data: daemon-config.json: | { + "chrootDir": "/hostroot", "confDir": "/host/etc/cni/net.d", "logToStderr": true, "logLevel": "debug", "logFile": "/tmp/multus.log", - "binDir": "/host/opt/cni/bin", - "cniDir": "/host/var/lib/cni/multus", - "socketDir": "/host/var/run/multus/" + "binDir": "/opt/cni/bin", + "cniDir": "/var/lib/cni/multus", + "socketDir": "/host/run/multus/" } --- apiVersion: apps/v1 @@ -163,16 +164,19 @@ spec: volumeMounts: - name: cni mountPath: /host/etc/cni/net.d - - name: cnibin - mountPath: /host/opt/cni/bin - - name: host-var-run - mountPath: /host/var/run - - name: host-var-run-netns - mountPath: /var/run/netns + - name: host-run + mountPath: /host/run + - name: host-var-lib-cni-multus + mountPath: /var/lib/cni/multus + - name: host-run-netns + mountPath: /run/netns mountPropagation: HostToContainer - name: multus-daemon-config mountPath: /etc/cni/net.d/multus.d readOnly: true + - name: hostroot + mountPath: /hostroot + mountPropagation: HostToContainer initContainers: - name: install-multus-binary image: ghcr.io/k8snetworkplumbingwg/multus-cni:thick @@ -198,15 +202,21 @@ spec: - name: cnibin hostPath: path: /opt/cni/bin + - name: hostroot + hostPath: + path: / - name: multus-daemon-config configMap: name: multus-daemon-config items: - key: daemon-config.json path: daemon-config.json - - name: host-var-run + - name: host-run hostPath: - path: /var/run - - name: host-var-run-netns + path: /run + - name: host-var-lib-cni-multus hostPath: - path: /var/run/netns/ + path: /var/lib/cni/multus + - name: host-run-netns + hostPath: + path: /run/netns/ diff --git a/docs/how-to-use.md b/docs/how-to-use.md index 038cc7451..5a36e23cf 100644 --- a/docs/how-to-use.md +++ b/docs/how-to-use.md @@ -39,7 +39,7 @@ cat >/etc/cni/net.d/00-multus.conf < 0 { + _, _ = stderr.WriteTo(e.Stderr) + } + return stdout.Bytes(), nil +} + +func (e *ChrootExec) pluginErr(err error, stdout, stderr []byte) error { + emsg := types.Error{} + if len(stdout) == 0 { + if len(stderr) == 0 { + emsg.Msg = fmt.Sprintf("netplugin failed with no error message: %v", err) + } else { + emsg.Msg = fmt.Sprintf("netplugin failed: %q", string(stderr)) + } + } else if perr := json.Unmarshal(stdout, &emsg); perr != nil { + emsg.Msg = fmt.Sprintf("netplugin failed but error parsing its diagnostic message %q: %v", string(stdout), perr) + } + return &emsg +} + +// FindInPath try to find CNI plugin based on given path +func (e *ChrootExec) FindInPath(plugin string, paths []string) (string, error) { + e.mu.Lock() + defer e.mu.Unlock() + err := e.chroot() + defer e.escape() + if err != nil { + fmt.Fprintf(os.Stderr, "FindInPath failed at chroot: %v\n", err) + return "", fmt.Errorf("FindInPath failed at chroot: %v", err) + } + + return invoke.FindInPath(plugin, paths) +} diff --git a/pkg/server/server.go b/pkg/server/server.go index ea9c1b219..3443feb4b 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -77,13 +77,22 @@ func GetListener(socketPath string) (net.Listener, error) { } // NewCNIServer creates and returns a new Server object which will listen on a socket in the given path -func NewCNIServer(rundir string, serverConfig []byte) (*Server, error) { +func NewCNIServer(daemonConfig *types.ControllerNetConf, serverConfig []byte) (*Server, error) { kubeClient, err := k8s.InClusterK8sClient() if err != nil { return nil, fmt.Errorf("error getting k8s client: %v", err) } - return newCNIServer(rundir, kubeClient, nil, serverConfig) + exec := invoke.Exec(nil) + if daemonConfig.ChrootDir != "" { + exec = &ChrootExec{ + Stderr: os.Stderr, + chrootDir: daemonConfig.ChrootDir, + } + logging.Verbosef("server configured with chroot: %s", daemonConfig.ChrootDir) + } + + return newCNIServer(daemonConfig.MultusSocketDir, kubeClient, exec, serverConfig) } func newCNIServer(rundir string, kubeClient *k8s.ClientInfo, exec invoke.Exec, servConfig []byte) (*Server, error) { diff --git a/pkg/server/shim.go b/pkg/server/shim.go index 681addb34..8f5f7aab3 100644 --- a/pkg/server/shim.go +++ b/pkg/server/shim.go @@ -18,13 +18,14 @@ import ( ) const ( - defaultMultusRunDir = "/var/run/multus/" + defaultMultusRunDir = "/run/multus/" ) // CmdAdd implements the CNI spec ADD command handler func CmdAdd(args *skel.CmdArgs) error { response, cniVersion, err := postRequest(args) if err != nil { + logging.Errorf("CmdAdd (shim): %v", err) return err } @@ -34,24 +35,24 @@ func CmdAdd(args *skel.CmdArgs) error { // CmdCheck implements the CNI spec CHECK command handler func CmdCheck(args *skel.CmdArgs) error { - response, cniVersion, err := postRequest(args) + _, _, err := postRequest(args) if err != nil { + logging.Errorf("CmdCheck (shim): %v", err) return err } - logging.Verbosef("CmdCheck (shim): %v", *response.Result) - return cnitypes.PrintResult(response.Result, cniVersion) + return err } // CmdDel implements the CNI spec DEL command handler func CmdDel(args *skel.CmdArgs) error { - response, cniVersion, err := postRequest(args) + _, _, err := postRequest(args) if err != nil { - return err + logging.Errorf("CmdDel (shim): %v", err) + return nil } - logging.Verbosef("CmdDel (shim): %v", *response.Result) - return cnitypes.PrintResult(response.Result, cniVersion) + return nil } func postRequest(args *skel.CmdArgs) (*Response, string, error) { diff --git a/pkg/types/conf.go b/pkg/types/conf.go index 0693b6f72..23d4facf5 100644 --- a/pkg/types/conf.go +++ b/pkg/types/conf.go @@ -44,7 +44,7 @@ const ( const ( // DefaultMultusDaemonConfigFile is the default path of the config file DefaultMultusDaemonConfigFile = "/etc/cni/net.d/multus.d/daemon-config.json" - defaultMultusRunDir = "/var/run/multus/" + defaultMultusRunDir = "/run/multus/" ) // LoadDelegateNetConfList reads DelegateNetConf from bytes diff --git a/pkg/types/types.go b/pkg/types/types.go index 619d2ccdd..22a6857cb 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -190,6 +190,7 @@ type ShimNetConf struct { // ControllerNetConf for the controller cni configuration type ControllerNetConf struct { + ChrootDir string `json:"chrootDir,omitempty"` ConfDir string `json:"confDir"` CNIDir string `json:"cniDir"` BinDir string `json:"binDir"`