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"],
|
||||
deps = [
|
||||
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
|
||||
"//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
|
||||
"//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
|
||||
"//cmd/kubeadm/app/cmd/options:go_default_library",
|
||||
|
|
|
@ -31,6 +31,7 @@ import (
|
|||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
clientset "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/klog"
|
||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||
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/cmd/options"
|
||||
|
@ -68,15 +69,20 @@ func NewCmdReset(in io.Reader, out io.Writer) *cobra.Command {
|
|||
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 == "" {
|
||||
criSocketPath, err = resetDetectCRISocket(client)
|
||||
criSocketPath, err = resetDetectCRISocket(cfg)
|
||||
kubeadmutil.CheckErr(err)
|
||||
klog.V(1).Infof("[reset] detected and using CRI socket: %s", criSocketPath)
|
||||
}
|
||||
|
||||
r, err := NewReset(in, ignorePreflightErrorsSet, forceReset, certsDir, criSocketPath)
|
||||
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".
|
||||
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
|
||||
// Only clear etcd data when using local etcd.
|
||||
etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml")
|
||||
|
||||
klog.V(1).Infof("[reset] checking for etcd config")
|
||||
etcdDataDir, err := getEtcdDataDir(etcdManifestPath, client)
|
||||
etcdDataDir, err := getEtcdDataDir(etcdManifestPath, cfg)
|
||||
if err == nil {
|
||||
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)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fmt.Println("[reset] no etcd config found. Assuming external etcd")
|
||||
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
|
||||
}
|
||||
|
||||
func removeEtcdMember(client clientset.Interface) 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) {
|
||||
func getEtcdDataDir(manifestPath string, cfg *kubeadmapi.InitConfiguration) (string, error) {
|
||||
const etcdVolumeName = "etcd-data"
|
||||
var dataDir string
|
||||
|
||||
if client != nil {
|
||||
cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
|
||||
if err == nil && cfg.Etcd.Local != nil {
|
||||
if cfg != nil && cfg.Etcd.Local != 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)
|
||||
if err != nil {
|
||||
|
@ -311,14 +308,11 @@ func resetConfigDir(configPathDir, pkiPathDir string) {
|
|||
}
|
||||
}
|
||||
|
||||
func resetDetectCRISocket(client clientset.Interface) (string, error) {
|
||||
if client != nil {
|
||||
// first try to connect to the cluster for the CRI socket
|
||||
cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
|
||||
if err == nil {
|
||||
func resetDetectCRISocket(cfg *kubeadmapi.InitConfiguration) (string, error) {
|
||||
if cfg != nil {
|
||||
// first try to get the CRI socket from the cluster configuration
|
||||
return cfg.NodeRegistration.CRISocket, nil
|
||||
}
|
||||
}
|
||||
|
||||
// if this fails, try to detect it
|
||||
return utilruntime.DetectCRISocket()
|
||||
|
|
|
@ -25,7 +25,7 @@ import (
|
|||
|
||||
"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"
|
||||
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
||||
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||
|
@ -275,38 +275,38 @@ func TestGetEtcdDataDir(t *testing.T) {
|
|||
podYaml string
|
||||
expectErr bool
|
||||
writeManifest bool
|
||||
validClient bool
|
||||
validConfig bool
|
||||
}{
|
||||
"non-existent file returns error": {
|
||||
expectErr: true,
|
||||
writeManifest: false,
|
||||
validClient: true,
|
||||
validConfig: true,
|
||||
},
|
||||
"return etcd data dir": {
|
||||
dataDir: "/path/to/etcd",
|
||||
podYaml: etcdPod,
|
||||
expectErr: false,
|
||||
writeManifest: true,
|
||||
validClient: true,
|
||||
validConfig: true,
|
||||
},
|
||||
"invalid etcd pod": {
|
||||
podYaml: etcdPodInvalid,
|
||||
expectErr: true,
|
||||
writeManifest: true,
|
||||
validClient: true,
|
||||
validConfig: true,
|
||||
},
|
||||
"etcd pod spec without data volume": {
|
||||
podYaml: etcdPodWithoutDataVolume,
|
||||
expectErr: true,
|
||||
writeManifest: true,
|
||||
validClient: true,
|
||||
validConfig: true,
|
||||
},
|
||||
"kubeconfig file doesn't exist": {
|
||||
dataDir: "/path/to/etcd",
|
||||
podYaml: etcdPod,
|
||||
expectErr: false,
|
||||
writeManifest: true,
|
||||
validClient: false,
|
||||
validConfig: false,
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -325,9 +325,9 @@ func TestGetEtcdDataDir(t *testing.T) {
|
|||
|
||||
var dataDir string
|
||||
var err error
|
||||
if test.validClient {
|
||||
client := clientsetfake.NewSimpleClientset()
|
||||
dataDir, err = getEtcdDataDir(manifestPath, client)
|
||||
if test.validConfig {
|
||||
cfg := &kubeadmapi.InitConfiguration{}
|
||||
dataDir, err = getEtcdDataDir(manifestPath, cfg)
|
||||
} else {
|
||||
dataDir, err = getEtcdDataDir(manifestPath, nil)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue