2022-03-02 23:47:27 +00:00
|
|
|
//go:build linux
|
2021-06-01 19:29:46 +00:00
|
|
|
// +build linux
|
|
|
|
|
|
|
|
package agent
|
|
|
|
|
|
|
|
import (
|
2023-10-10 10:34:54 +00:00
|
|
|
"net"
|
2021-06-10 19:27:00 +00:00
|
|
|
"path/filepath"
|
2023-12-19 03:14:02 +00:00
|
|
|
"strconv"
|
2021-06-10 19:27:00 +00:00
|
|
|
"strings"
|
|
|
|
|
2022-03-02 23:47:27 +00:00
|
|
|
"github.com/k3s-io/k3s/pkg/cgroups"
|
|
|
|
"github.com/k3s-io/k3s/pkg/daemons/config"
|
|
|
|
"github.com/k3s-io/k3s/pkg/util"
|
2024-07-01 17:47:08 +00:00
|
|
|
"github.com/pkg/errors"
|
2021-06-01 19:29:46 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"golang.org/x/sys/unix"
|
2024-07-01 17:47:08 +00:00
|
|
|
kubeletconfig "k8s.io/kubelet/config/v1beta1"
|
2023-10-10 10:34:54 +00:00
|
|
|
utilsnet "k8s.io/utils/net"
|
2024-07-01 17:47:08 +00:00
|
|
|
utilsptr "k8s.io/utils/ptr"
|
2021-06-01 19:29:46 +00:00
|
|
|
)
|
|
|
|
|
2021-12-16 20:00:40 +00:00
|
|
|
const socketPrefix = "unix://"
|
|
|
|
|
2024-07-01 17:47:08 +00:00
|
|
|
func createRootlessConfig(argsMap map[string]string, controllers map[string]bool) error {
|
2021-08-24 15:27:17 +00:00
|
|
|
argsMap["feature-gates=KubeletInUserNamespace"] = "true"
|
2021-06-01 19:29:46 +00:00
|
|
|
// "/sys/fs/cgroup" is namespaced
|
|
|
|
cgroupfsWritable := unix.Access("/sys/fs/cgroup", unix.W_OK) == nil
|
2022-04-18 23:06:50 +00:00
|
|
|
if controllers["cpu"] && controllers["pids"] && cgroupfsWritable {
|
2021-06-01 19:29:46 +00:00
|
|
|
logrus.Info("cgroup v2 controllers are delegated for rootless.")
|
2024-07-01 17:47:08 +00:00
|
|
|
return nil
|
2021-06-01 19:29:46 +00:00
|
|
|
}
|
2024-07-01 17:47:08 +00:00
|
|
|
return errors.New("delegated cgroup v2 controllers are required for rootless")
|
2021-06-01 19:29:46 +00:00
|
|
|
}
|
2021-06-10 19:27:00 +00:00
|
|
|
|
|
|
|
func kubeProxyArgs(cfg *config.Agent) map[string]string {
|
2021-11-10 19:23:05 +00:00
|
|
|
bindAddress := "127.0.0.1"
|
2024-07-13 22:57:53 +00:00
|
|
|
if utilsnet.IsIPv6(net.ParseIP(cfg.NodeIP)) {
|
2021-11-10 19:23:05 +00:00
|
|
|
bindAddress = "::1"
|
|
|
|
}
|
2021-06-10 19:27:00 +00:00
|
|
|
argsMap := map[string]string{
|
|
|
|
"proxy-mode": "iptables",
|
2021-11-10 19:23:05 +00:00
|
|
|
"healthz-bind-address": bindAddress,
|
2021-06-10 19:27:00 +00:00
|
|
|
"kubeconfig": cfg.KubeConfigKubeProxy,
|
|
|
|
"cluster-cidr": util.JoinIPNets(cfg.ClusterCIDRs),
|
|
|
|
"conntrack-max-per-core": "0",
|
|
|
|
"conntrack-tcp-timeout-established": "0s",
|
|
|
|
"conntrack-tcp-timeout-close-wait": "0s",
|
|
|
|
}
|
|
|
|
if cfg.NodeName != "" {
|
|
|
|
argsMap["hostname-override"] = cfg.NodeName
|
|
|
|
}
|
2023-12-19 03:14:02 +00:00
|
|
|
if cfg.VLevel != 0 {
|
|
|
|
argsMap["v"] = strconv.Itoa(cfg.VLevel)
|
|
|
|
}
|
|
|
|
if cfg.VModule != "" {
|
|
|
|
argsMap["vmodule"] = cfg.VModule
|
|
|
|
}
|
|
|
|
if cfg.LogFile != "" {
|
|
|
|
argsMap["log_file"] = cfg.LogFile
|
|
|
|
}
|
|
|
|
if cfg.AlsoLogToStderr {
|
|
|
|
argsMap["alsologtostderr"] = "true"
|
|
|
|
}
|
2021-06-10 19:27:00 +00:00
|
|
|
return argsMap
|
|
|
|
}
|
|
|
|
|
2024-07-01 17:47:08 +00:00
|
|
|
// kubeletArgsAndConfig generates default kubelet args and configuration.
|
|
|
|
// Kubelet config is frustratingly split across deprecated CLI flags that raise warnings if you use them,
|
|
|
|
// and a structured configuration file that upstream does not provide a convienent way to initailize with default values.
|
|
|
|
// The defaults and our desired config also vary by OS.
|
|
|
|
func kubeletArgsAndConfig(cfg *config.Agent) (map[string]string, *kubeletconfig.KubeletConfiguration, error) {
|
|
|
|
defaultConfig, err := defaultKubeletConfig(cfg)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
2021-11-10 19:23:05 +00:00
|
|
|
}
|
2021-06-10 19:27:00 +00:00
|
|
|
argsMap := map[string]string{
|
2024-07-01 17:47:08 +00:00
|
|
|
"config-dir": cfg.KubeletConfigDir,
|
|
|
|
"kubeconfig": cfg.KubeConfigKubelet,
|
2021-06-10 19:27:00 +00:00
|
|
|
}
|
2024-07-01 17:47:08 +00:00
|
|
|
|
2021-06-10 19:27:00 +00:00
|
|
|
if cfg.RootDir != "" {
|
|
|
|
argsMap["root-dir"] = cfg.RootDir
|
|
|
|
argsMap["cert-dir"] = filepath.Join(cfg.RootDir, "pki")
|
|
|
|
}
|
|
|
|
if cfg.RuntimeSocket != "" {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.SerializeImagePulls = utilsptr.To(false)
|
|
|
|
// note: this is a legacy cadvisor flag that the kubelet still exposes, but
|
|
|
|
// it must be set in order for cadvisor to pull stats properly.
|
2021-12-16 20:00:40 +00:00
|
|
|
if strings.Contains(cfg.RuntimeSocket, "containerd") {
|
|
|
|
argsMap["containerd"] = cfg.RuntimeSocket
|
|
|
|
}
|
|
|
|
// cadvisor wants the containerd CRI socket without the prefix, but kubelet wants it with the prefix
|
|
|
|
if strings.HasPrefix(cfg.RuntimeSocket, socketPrefix) {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.ContainerRuntimeEndpoint = cfg.RuntimeSocket
|
2021-12-16 20:00:40 +00:00
|
|
|
} else {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.ContainerRuntimeEndpoint = socketPrefix + cfg.RuntimeSocket
|
2021-12-16 20:00:40 +00:00
|
|
|
}
|
2022-03-11 01:01:53 +00:00
|
|
|
}
|
2021-09-01 23:27:42 +00:00
|
|
|
if cfg.ImageServiceSocket != "" {
|
2021-12-16 20:00:40 +00:00
|
|
|
if strings.HasPrefix(cfg.ImageServiceSocket, socketPrefix) {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.ImageServiceEndpoint = cfg.ImageServiceSocket
|
2021-09-01 23:27:42 +00:00
|
|
|
} else {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.ImageServiceEndpoint = socketPrefix + cfg.ImageServiceSocket
|
2021-09-01 23:27:42 +00:00
|
|
|
}
|
|
|
|
}
|
2021-06-10 19:27:00 +00:00
|
|
|
if cfg.NodeName != "" {
|
|
|
|
argsMap["hostname-override"] = cfg.NodeName
|
|
|
|
}
|
2024-07-01 17:47:08 +00:00
|
|
|
|
2023-10-17 05:43:20 +00:00
|
|
|
// If the embedded CCM is disabled, don't assume that dual-stack node IPs are safe.
|
|
|
|
// When using an external CCM, the user wants dual-stack node IPs, they will need to set the node-ip kubelet arg directly.
|
|
|
|
// This should be fine since most cloud providers have their own way of finding node IPs that doesn't depend on the kubelet
|
|
|
|
// setting them.
|
|
|
|
if cfg.DisableCCM {
|
2023-10-10 10:34:54 +00:00
|
|
|
dualStack, err := utilsnet.IsDualStackIPs(cfg.NodeIPs)
|
2023-10-17 05:43:20 +00:00
|
|
|
if err == nil && !dualStack {
|
|
|
|
argsMap["node-ip"] = cfg.NodeIP
|
|
|
|
}
|
|
|
|
} else {
|
2024-07-01 17:47:08 +00:00
|
|
|
argsMap["cloud-provider"] = "external"
|
2023-10-17 05:43:20 +00:00
|
|
|
if nodeIPs := util.JoinIPs(cfg.NodeIPs); nodeIPs != "" {
|
|
|
|
argsMap["node-ip"] = util.JoinIPs(cfg.NodeIPs)
|
2023-10-10 10:34:54 +00:00
|
|
|
}
|
2021-06-10 19:27:00 +00:00
|
|
|
}
|
2024-07-01 17:47:08 +00:00
|
|
|
|
2022-04-18 23:06:50 +00:00
|
|
|
kubeletRoot, runtimeRoot, controllers := cgroups.CheckCgroups()
|
2024-07-01 17:47:08 +00:00
|
|
|
if !controllers["pids"] {
|
|
|
|
return nil, nil, errors.New("pids cgroup controller not found")
|
|
|
|
}
|
2022-04-18 23:06:50 +00:00
|
|
|
if !controllers["cpu"] {
|
|
|
|
logrus.Warn("Disabling CPU quotas due to missing cpu controller or cpu.cfs_period_us")
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.CPUCFSQuota = utilsptr.To(false)
|
2021-06-10 19:27:00 +00:00
|
|
|
}
|
|
|
|
if kubeletRoot != "" {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.KubeletCgroups = kubeletRoot
|
2021-06-10 19:27:00 +00:00
|
|
|
}
|
|
|
|
if runtimeRoot != "" {
|
|
|
|
argsMap["runtime-cgroups"] = runtimeRoot
|
|
|
|
}
|
|
|
|
|
|
|
|
argsMap["node-labels"] = strings.Join(cfg.NodeLabels, ",")
|
2022-06-01 19:54:07 +00:00
|
|
|
|
2021-06-10 19:27:00 +00:00
|
|
|
if ImageCredProvAvailable(cfg) {
|
|
|
|
logrus.Infof("Kubelet image credential provider bin dir and configuration file found.")
|
|
|
|
argsMap["image-credential-provider-bin-dir"] = cfg.ImageCredProvBinDir
|
|
|
|
argsMap["image-credential-provider-config"] = cfg.ImageCredProvConfig
|
|
|
|
}
|
|
|
|
|
|
|
|
if cfg.Rootless {
|
2024-07-01 17:47:08 +00:00
|
|
|
if err := createRootlessConfig(argsMap, controllers); err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
2022-04-18 23:06:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if cfg.Systemd {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.CgroupDriver = "systemd"
|
2021-06-10 19:27:00 +00:00
|
|
|
}
|
2021-11-09 15:44:34 +00:00
|
|
|
|
2022-09-29 20:37:50 +00:00
|
|
|
if !cfg.DisableServiceLB {
|
2024-07-01 17:47:08 +00:00
|
|
|
defaultConfig.AllowedUnsafeSysctls = []string{"net.ipv4.ip_forward", "net.ipv6.conf.all.forwarding"}
|
2021-11-09 15:44:34 +00:00
|
|
|
}
|
2024-07-01 17:47:08 +00:00
|
|
|
|
|
|
|
return argsMap, defaultConfig, nil
|
2021-06-10 19:27:00 +00:00
|
|
|
}
|