mirror of https://github.com/k3s-io/k3s
Merge pull request #74410 from pytimer/kubeadm-fix
kubeadm: reduce the number of fetch configuration when resetpull/564/head
commit
c487757e88
|
@ -84,6 +84,7 @@ go_test(
|
||||||
],
|
],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
|
||||||
"//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
|
"//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
|
||||||
"//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
|
"//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
|
||||||
"//cmd/kubeadm/app/cmd/options:go_default_library",
|
"//cmd/kubeadm/app/cmd/options:go_default_library",
|
||||||
|
|
|
@ -31,6 +31,7 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
|
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
|
@ -68,15 +69,20 @@ func NewCmdReset(in io.Reader, out io.Writer) *cobra.Command {
|
||||||
kubeadmutil.CheckErr(err)
|
kubeadmutil.CheckErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
|
||||||
|
if err != nil {
|
||||||
|
klog.Warningf("[reset] Unable to fetch the kubeadm-config ConfigMap from cluster: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
if criSocketPath == "" {
|
if criSocketPath == "" {
|
||||||
criSocketPath, err = resetDetectCRISocket(client)
|
criSocketPath, err = resetDetectCRISocket(cfg)
|
||||||
kubeadmutil.CheckErr(err)
|
kubeadmutil.CheckErr(err)
|
||||||
klog.V(1).Infof("[reset] detected and using CRI socket: %s", criSocketPath)
|
klog.V(1).Infof("[reset] detected and using CRI socket: %s", criSocketPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := NewReset(in, ignorePreflightErrorsSet, forceReset, certsDir, criSocketPath)
|
r, err := NewReset(in, ignorePreflightErrorsSet, forceReset, certsDir, criSocketPath)
|
||||||
kubeadmutil.CheckErr(err)
|
kubeadmutil.CheckErr(err)
|
||||||
kubeadmutil.CheckErr(r.Run(out, client))
|
kubeadmutil.CheckErr(r.Run(out, client, cfg))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,18 +137,20 @@ func NewReset(in io.Reader, ignorePreflightErrors sets.String, forceReset bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run reverts any changes made to this host by "kubeadm init" or "kubeadm join".
|
// Run reverts any changes made to this host by "kubeadm init" or "kubeadm join".
|
||||||
func (r *Reset) Run(out io.Writer, client clientset.Interface) error {
|
func (r *Reset) Run(out io.Writer, client clientset.Interface, cfg *kubeadmapi.InitConfiguration) error {
|
||||||
var dirsToClean []string
|
var dirsToClean []string
|
||||||
// Only clear etcd data when using local etcd.
|
// Only clear etcd data when using local etcd.
|
||||||
etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml")
|
etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml")
|
||||||
|
|
||||||
klog.V(1).Infof("[reset] checking for etcd config")
|
klog.V(1).Infof("[reset] checking for etcd config")
|
||||||
etcdDataDir, err := getEtcdDataDir(etcdManifestPath, client)
|
etcdDataDir, err := getEtcdDataDir(etcdManifestPath, cfg)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
dirsToClean = append(dirsToClean, etcdDataDir)
|
dirsToClean = append(dirsToClean, etcdDataDir)
|
||||||
if err := removeEtcdMember(client); err != nil {
|
if cfg != nil {
|
||||||
|
if err := etcdphase.RemoveStackedEtcdMemberFromCluster(client, cfg); err != nil {
|
||||||
klog.Warningf("[reset] failed to remove etcd member: %v\n.Please manually remove this etcd member using etcdctl", err)
|
klog.Warningf("[reset] failed to remove etcd member: %v\n.Please manually remove this etcd member using etcdctl", err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Println("[reset] no etcd config found. Assuming external etcd")
|
fmt.Println("[reset] no etcd config found. Assuming external etcd")
|
||||||
fmt.Println("[reset] please manually reset etcd to prevent further issues")
|
fmt.Println("[reset] please manually reset etcd to prevent further issues")
|
||||||
|
@ -209,25 +217,14 @@ func (r *Reset) Run(out io.Writer, client clientset.Interface) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeEtcdMember(client clientset.Interface) error {
|
func getEtcdDataDir(manifestPath string, cfg *kubeadmapi.InitConfiguration) (string, error) {
|
||||||
cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return etcdphase.RemoveStackedEtcdMemberFromCluster(client, cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getEtcdDataDir(manifestPath string, client clientset.Interface) (string, error) {
|
|
||||||
const etcdVolumeName = "etcd-data"
|
const etcdVolumeName = "etcd-data"
|
||||||
var dataDir string
|
var dataDir string
|
||||||
|
|
||||||
if client != nil {
|
if cfg != nil && cfg.Etcd.Local != nil {
|
||||||
cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
|
|
||||||
if err == nil && cfg.Etcd.Local != nil {
|
|
||||||
return cfg.Etcd.Local.DataDir, nil
|
return cfg.Etcd.Local.DataDir, nil
|
||||||
}
|
}
|
||||||
klog.Warningf("[reset] Unable to fetch the kubeadm-config ConfigMap, using etcd pod spec as fallback: %v", err)
|
klog.Warningln("[reset] No kubeadm config, using etcd pod spec to get data directory")
|
||||||
}
|
|
||||||
|
|
||||||
etcdPod, err := utilstaticpod.ReadStaticPodFromDisk(manifestPath)
|
etcdPod, err := utilstaticpod.ReadStaticPodFromDisk(manifestPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -311,14 +308,11 @@ func resetConfigDir(configPathDir, pkiPathDir string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func resetDetectCRISocket(client clientset.Interface) (string, error) {
|
func resetDetectCRISocket(cfg *kubeadmapi.InitConfiguration) (string, error) {
|
||||||
if client != nil {
|
if cfg != nil {
|
||||||
// first try to connect to the cluster for the CRI socket
|
// first try to get the CRI socket from the cluster configuration
|
||||||
cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
|
|
||||||
if err == nil {
|
|
||||||
return cfg.NodeRegistration.CRISocket, nil
|
return cfg.NodeRegistration.CRISocket, nil
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// if this fails, try to detect it
|
// if this fails, try to detect it
|
||||||
return utilruntime.DetectCRISocket()
|
return utilruntime.DetectCRISocket()
|
||||||
|
|
|
@ -25,7 +25,7 @@ import (
|
||||||
|
|
||||||
"github.com/lithammer/dedent"
|
"github.com/lithammer/dedent"
|
||||||
|
|
||||||
clientsetfake "k8s.io/client-go/kubernetes/fake"
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
|
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
||||||
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
|
@ -275,38 +275,38 @@ func TestGetEtcdDataDir(t *testing.T) {
|
||||||
podYaml string
|
podYaml string
|
||||||
expectErr bool
|
expectErr bool
|
||||||
writeManifest bool
|
writeManifest bool
|
||||||
validClient bool
|
validConfig bool
|
||||||
}{
|
}{
|
||||||
"non-existent file returns error": {
|
"non-existent file returns error": {
|
||||||
expectErr: true,
|
expectErr: true,
|
||||||
writeManifest: false,
|
writeManifest: false,
|
||||||
validClient: true,
|
validConfig: true,
|
||||||
},
|
},
|
||||||
"return etcd data dir": {
|
"return etcd data dir": {
|
||||||
dataDir: "/path/to/etcd",
|
dataDir: "/path/to/etcd",
|
||||||
podYaml: etcdPod,
|
podYaml: etcdPod,
|
||||||
expectErr: false,
|
expectErr: false,
|
||||||
writeManifest: true,
|
writeManifest: true,
|
||||||
validClient: true,
|
validConfig: true,
|
||||||
},
|
},
|
||||||
"invalid etcd pod": {
|
"invalid etcd pod": {
|
||||||
podYaml: etcdPodInvalid,
|
podYaml: etcdPodInvalid,
|
||||||
expectErr: true,
|
expectErr: true,
|
||||||
writeManifest: true,
|
writeManifest: true,
|
||||||
validClient: true,
|
validConfig: true,
|
||||||
},
|
},
|
||||||
"etcd pod spec without data volume": {
|
"etcd pod spec without data volume": {
|
||||||
podYaml: etcdPodWithoutDataVolume,
|
podYaml: etcdPodWithoutDataVolume,
|
||||||
expectErr: true,
|
expectErr: true,
|
||||||
writeManifest: true,
|
writeManifest: true,
|
||||||
validClient: true,
|
validConfig: true,
|
||||||
},
|
},
|
||||||
"kubeconfig file doesn't exist": {
|
"kubeconfig file doesn't exist": {
|
||||||
dataDir: "/path/to/etcd",
|
dataDir: "/path/to/etcd",
|
||||||
podYaml: etcdPod,
|
podYaml: etcdPod,
|
||||||
expectErr: false,
|
expectErr: false,
|
||||||
writeManifest: true,
|
writeManifest: true,
|
||||||
validClient: false,
|
validConfig: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,9 +325,9 @@ func TestGetEtcdDataDir(t *testing.T) {
|
||||||
|
|
||||||
var dataDir string
|
var dataDir string
|
||||||
var err error
|
var err error
|
||||||
if test.validClient {
|
if test.validConfig {
|
||||||
client := clientsetfake.NewSimpleClientset()
|
cfg := &kubeadmapi.InitConfiguration{}
|
||||||
dataDir, err = getEtcdDataDir(manifestPath, client)
|
dataDir, err = getEtcdDataDir(manifestPath, cfg)
|
||||||
} else {
|
} else {
|
||||||
dataDir, err = getEtcdDataDir(manifestPath, nil)
|
dataDir, err = getEtcdDataDir(manifestPath, nil)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue