kubeadm: set resolv-conf via the kubelet config file rather than cli flag

This commit is contained in:
SataQiu 2020-04-23 15:07:48 +08:00
parent cb719f75aa
commit 28b9a4e0d6
5 changed files with 37 additions and 56 deletions

View File

@ -18,6 +18,7 @@ go_library(
"//cmd/kubeadm/app/features:go_default_library", "//cmd/kubeadm/app/features:go_default_library",
"//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util:go_default_library",
"//cmd/kubeadm/app/util/apiclient:go_default_library", "//cmd/kubeadm/app/util/apiclient:go_default_library",
"//cmd/kubeadm/app/util/initsystem:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@ -21,7 +21,9 @@ import (
"k8s.io/apimachinery/pkg/util/version" "k8s.io/apimachinery/pkg/util/version"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
"k8s.io/klog"
kubeletconfig "k8s.io/kubelet/config/v1beta1" kubeletconfig "k8s.io/kubelet/config/v1beta1"
"k8s.io/kubernetes/cmd/kubeadm/app/util/initsystem"
utilpointer "k8s.io/utils/pointer" utilpointer "k8s.io/utils/pointer"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
@ -49,6 +51,9 @@ const (
// kubeletHealthzBindAddress specifies the default healthz bind address // kubeletHealthzBindAddress specifies the default healthz bind address
kubeletHealthzBindAddress = "127.0.0.1" kubeletHealthzBindAddress = "127.0.0.1"
// kubeletSystemdResolverConfig specifies the default resolver config when systemd service is active
kubeletSystemdResolverConfig = "/run/systemd/resolve/resolv.conf"
) )
// kubeletHandler is the handler instance for the kubelet component config // kubeletHandler is the handler instance for the kubelet component config
@ -173,4 +178,27 @@ func (kc *kubeletConfig) Default(cfg *kubeadmapi.ClusterConfiguration, _ *kubead
// We cannot show a warning for RotateCertificates==false and we must hardcode it to true. // We cannot show a warning for RotateCertificates==false and we must hardcode it to true.
// There is no way to determine if the user has set this or not, given the field is a non-pointer. // There is no way to determine if the user has set this or not, given the field is a non-pointer.
kc.config.RotateCertificates = kubeletRotateCertificates kc.config.RotateCertificates = kubeletRotateCertificates
ok, err := isServiceActive("systemd-resolved")
if err != nil {
klog.Warningf("cannot determine if systemd-resolved is active: %v", err)
}
if ok {
if kc.config.ResolverConfig == "" {
kc.config.ResolverConfig = kubeletSystemdResolverConfig
} else {
if kc.config.ResolverConfig != kubeletSystemdResolverConfig {
warnDefaultComponentConfigValue(kind, "resolvConf", kubeletSystemdResolverConfig, kc.config.ResolverConfig)
}
}
}
}
// isServiceActive checks whether the given service exists and is running
func isServiceActive(name string) (bool, error) {
initSystem, err := initsystem.GetInitSystem()
if err != nil {
return false, err
}
return initSystem.ServiceIsActive(name), nil
} }

View File

@ -26,7 +26,6 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/features"
"k8s.io/kubernetes/cmd/kubeadm/app/images" "k8s.io/kubernetes/cmd/kubeadm/app/images"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
"k8s.io/kubernetes/cmd/kubeadm/app/util/initsystem"
utilsexec "k8s.io/utils/exec" utilsexec "k8s.io/utils/exec"
"os" "os"
"path/filepath" "path/filepath"
@ -39,7 +38,6 @@ type kubeletFlagsOpts struct {
pauseImage string pauseImage string
registerTaintsUsingFlags bool registerTaintsUsingFlags bool
execer utilsexec.Interface execer utilsexec.Interface
isServiceActiveFunc func(string) (bool, error)
} }
// GetNodeNameAndHostname obtains the name for this Node using the following precedence // GetNodeNameAndHostname obtains the name for this Node using the following precedence
@ -69,13 +67,6 @@ func WriteKubeletDynamicEnvFile(cfg *kubeadmapi.ClusterConfiguration, nodeReg *k
pauseImage: images.GetPauseImage(cfg), pauseImage: images.GetPauseImage(cfg),
registerTaintsUsingFlags: registerTaintsUsingFlags, registerTaintsUsingFlags: registerTaintsUsingFlags,
execer: utilsexec.New(), execer: utilsexec.New(),
isServiceActiveFunc: func(name string) (bool, error) {
initSystem, err := initsystem.GetInitSystem()
if err != nil {
return false, err
}
return initSystem.ServiceIsActive(name), nil
},
} }
stringMap := buildKubeletArgMap(flagOpts) stringMap := buildKubeletArgMap(flagOpts)
argList := kubeadmutil.BuildArgumentListFromMap(stringMap, nodeReg.KubeletExtraArgs) argList := kubeadmutil.BuildArgumentListFromMap(stringMap, nodeReg.KubeletExtraArgs)

View File

@ -89,14 +89,6 @@ var (
} }
) )
func serviceIsActiveFunc(_ string) (bool, error) {
return true, nil
}
func serviceIsNotActiveFunc(_ string) (bool, error) {
return false, nil
}
func TestBuildKubeletArgMap(t *testing.T) { func TestBuildKubeletArgMap(t *testing.T) {
tests := []struct { tests := []struct {
@ -117,8 +109,7 @@ func TestBuildKubeletArgMap(t *testing.T) {
}, },
}, },
}, },
execer: errCgroupExecer, execer: errCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"network-plugin": "cni", "network-plugin": "cni",
@ -131,8 +122,7 @@ func TestBuildKubeletArgMap(t *testing.T) {
CRISocket: "/var/run/dockershim.sock", CRISocket: "/var/run/dockershim.sock",
Name: "override-name", Name: "override-name",
}, },
execer: errCgroupExecer, execer: errCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"network-plugin": "cni", "network-plugin": "cni",
@ -146,8 +136,7 @@ func TestBuildKubeletArgMap(t *testing.T) {
CRISocket: "/var/run/dockershim.sock", CRISocket: "/var/run/dockershim.sock",
KubeletExtraArgs: map[string]string{"hostname-override": "override-name"}, KubeletExtraArgs: map[string]string{"hostname-override": "override-name"},
}, },
execer: errCgroupExecer, execer: errCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"network-plugin": "cni", "network-plugin": "cni",
@ -160,8 +149,7 @@ func TestBuildKubeletArgMap(t *testing.T) {
nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{ nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{
CRISocket: "/var/run/dockershim.sock", CRISocket: "/var/run/dockershim.sock",
}, },
execer: systemdCgroupExecer, execer: systemdCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"network-plugin": "cni", "network-plugin": "cni",
@ -174,8 +162,7 @@ func TestBuildKubeletArgMap(t *testing.T) {
nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{ nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{
CRISocket: "/var/run/dockershim.sock", CRISocket: "/var/run/dockershim.sock",
}, },
execer: cgroupfsCgroupExecer, execer: cgroupfsCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"network-plugin": "cni", "network-plugin": "cni",
@ -188,8 +175,7 @@ func TestBuildKubeletArgMap(t *testing.T) {
nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{ nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{
CRISocket: "/var/run/containerd.sock", CRISocket: "/var/run/containerd.sock",
}, },
execer: cgroupfsCgroupExecer, execer: cgroupfsCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"container-runtime": "remote", "container-runtime": "remote",
@ -216,7 +202,6 @@ func TestBuildKubeletArgMap(t *testing.T) {
}, },
registerTaintsUsingFlags: true, registerTaintsUsingFlags: true,
execer: cgroupfsCgroupExecer, execer: cgroupfsCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"container-runtime": "remote", "container-runtime": "remote",
@ -224,30 +209,14 @@ func TestBuildKubeletArgMap(t *testing.T) {
"register-with-taints": "foo=bar:baz,key=val:eff", "register-with-taints": "foo=bar:baz,key=val:eff",
}, },
}, },
{
name: "systemd-resolved running",
opts: kubeletFlagsOpts{
nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{
CRISocket: "/var/run/containerd.sock",
},
execer: cgroupfsCgroupExecer,
isServiceActiveFunc: serviceIsActiveFunc,
},
expected: map[string]string{
"container-runtime": "remote",
"container-runtime-endpoint": "/var/run/containerd.sock",
"resolv-conf": "/run/systemd/resolve/resolv.conf",
},
},
{ {
name: "pause image is set", name: "pause image is set",
opts: kubeletFlagsOpts{ opts: kubeletFlagsOpts{
nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{ nodeRegOpts: &kubeadmapi.NodeRegistrationOptions{
CRISocket: "/var/run/dockershim.sock", CRISocket: "/var/run/dockershim.sock",
}, },
pauseImage: "gcr.io/pause:3.2", pauseImage: "gcr.io/pause:3.2",
execer: cgroupfsCgroupExecer, execer: cgroupfsCgroupExecer,
isServiceActiveFunc: serviceIsNotActiveFunc,
}, },
expected: map[string]string{ expected: map[string]string{
"network-plugin": "cni", "network-plugin": "cni",

View File

@ -39,13 +39,5 @@ func buildKubeletArgMap(opts kubeletFlagsOpts) map[string]string {
} }
} }
ok, err := opts.isServiceActiveFunc("systemd-resolved")
if err != nil {
klog.Warningf("cannot determine if systemd-resolved is active: %v\n", err)
}
if ok {
kubeletFlags["resolv-conf"] = "/run/systemd/resolve/resolv.conf"
}
return kubeletFlags return kubeletFlags
} }