Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
67d4ddaf
Commit
67d4ddaf
authored
Dec 04, 2016
by
Lucas Käldström
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve the kubeadm reset command. Reorder the functions and log more user-friendly output
parent
51d733f4
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
77 additions
and
69 deletions
+77
-69
reset.go
cmd/kubeadm/app/cmd/reset.go
+76
-68
reset_test.go
cmd/kubeadm/app/cmd/reset_test.go
+1
-1
No files found.
cmd/kubeadm/app/cmd/reset.go
View file @
67d4ddaf
/*
Copyright 201
4
The Kubernetes Authors.
Copyright 201
6
The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
...
...
@@ -21,16 +21,17 @@ import (
"io"
"os"
"os/exec"
"path
/filepath
"
"path"
"github.com/spf13/cobra"
kubeadmapi
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
kubeadmutil
"k8s.io/kubernetes/cmd/kubeadm/app/util"
"k8s.io/kubernetes/pkg/util/initsystem"
)
// NewCmdReset returns
"kubeadm reset" command.
// NewCmdReset returns
the "kubeadm reset" command
func
NewCmdReset
(
out
io
.
Writer
)
*
cobra
.
Command
{
var
skipPreFlight
bool
cmd
:=
&
cobra
.
Command
{
...
...
@@ -55,111 +56,118 @@ type Reset struct{}
func
NewReset
(
skipPreFlight
bool
)
(
*
Reset
,
error
)
{
if
!
skipPreFlight
{
fmt
.
Println
(
"
Running pre-flight checks
"
)
err
:=
preflight
.
RunResetCheck
()
if
err
!=
nil
{
fmt
.
Println
(
"
[preflight] Running pre-flight checks...
"
)
if
err
:=
preflight
.
RunResetCheck
();
err
!=
nil
{
return
nil
,
&
preflight
.
PreFlightError
{
Msg
:
err
.
Error
()}
}
}
else
{
fmt
.
Println
(
"
Skipping pre-flight checks
"
)
fmt
.
Println
(
"
[preflight] Skipping pre-flight checks...
"
)
}
return
&
Reset
{},
nil
}
// cleanDir removes everything in a directory, but not the directory itself:
func
cleanDir
(
path
string
)
{
// If the directory doesn't even exist there's nothing to do, and we do
// not consider this an error:
if
_
,
err
:=
os
.
Stat
(
path
);
os
.
IsNotExist
(
err
)
{
return
}
d
,
err
:=
os
.
Open
(
path
)
if
err
!=
nil
{
fmt
.
Printf
(
"failed to remove directory: [%v]
\n
"
,
err
)
}
defer
d
.
Close
()
names
,
err
:=
d
.
Readdirnames
(
-
1
)
if
err
!=
nil
{
fmt
.
Printf
(
"failed to remove directory: [%v]
\n
"
,
err
)
}
for
_
,
name
:=
range
names
{
err
=
os
.
RemoveAll
(
filepath
.
Join
(
path
,
name
))
if
err
!=
nil
{
fmt
.
Printf
(
"failed to remove directory: [%v]
\n
"
,
err
)
}
}
}
// resetConfigDir is used to cleanup the files kubeadm writes in /etc/kubernetes/.
func
resetConfigDir
(
configDirPath
string
)
{
dirsToClean
:=
[]
string
{
filepath
.
Join
(
configDirPath
,
"manifests"
),
filepath
.
Join
(
configDirPath
,
"pki"
),
}
fmt
.
Printf
(
"Deleting contents of config directories: %v
\n
"
,
dirsToClean
)
for
_
,
dir
:=
range
dirsToClean
{
cleanDir
(
dir
)
}
filesToClean
:=
[]
string
{
filepath
.
Join
(
configDirPath
,
"admin.conf"
),
filepath
.
Join
(
configDirPath
,
"kubelet.conf"
),
}
fmt
.
Printf
(
"Deleting files: %v
\n
"
,
filesToClean
)
for
_
,
path
:=
range
filesToClean
{
err
:=
os
.
RemoveAll
(
path
)
if
err
!=
nil
{
fmt
.
Printf
(
"failed to remove file: [%v]
\n
"
,
err
)
}
}
}
// Run reverts any changes made to this host by "kubeadm init" or "kubeadm join".
func
(
r
*
Reset
)
Run
(
out
io
.
Writer
)
error
{
serviceToStop
:=
"kubelet"
initSystem
,
err
:=
initsystem
.
GetInitSystem
()
if
err
!=
nil
{
fmt
.
Printf
(
"
%v
"
,
err
)
fmt
.
Printf
(
"
[reset] Failed to detect init system and stop the kubelet service: %v
\n
"
,
err
)
}
else
{
fmt
.
Printf
(
"Stopping the %s service...
\n
"
,
serviceToStop
)
fmt
.
Printf
(
"
[reset]
Stopping the %s service...
\n
"
,
serviceToStop
)
if
err
:=
initSystem
.
ServiceStop
(
serviceToStop
);
err
!=
nil
{
fmt
.
Printf
(
"
f
ailed to stop the %s service"
,
serviceToStop
)
fmt
.
Printf
(
"
[reset] F
ailed to stop the %s service"
,
serviceToStop
)
}
}
fmt
.
Print
f
(
"Unmounting directories in /var/lib/kubelet...
\n
"
)
fmt
.
Print
ln
(
"[reset] Unmounting directories in /var/lib/kubelet...
"
)
umountDirsCmd
:=
"cat /proc/mounts | awk '{print $2}' | grep '/var/lib/kubelet' | xargs -r umount"
umountOutputBytes
,
err
:=
exec
.
Command
(
"sh"
,
"-c"
,
umountDirsCmd
)
.
Output
()
if
err
!=
nil
{
fmt
.
Printf
(
"
failed to unmount directories in /var/lib/kubelet, %s
"
,
string
(
umountOutputBytes
))
fmt
.
Printf
(
"
[reset] Failed to unmount directories in /var/lib/kubelet: %s
\n
"
,
string
(
umountOutputBytes
))
}
// Remove contents from the config and pki directories
resetConfigDir
(
kubeadmapi
.
GlobalEnvParams
.
KubernetesDir
,
kubeadmapi
.
GlobalEnvParams
.
HostPKIPath
)
dirsToClean
:=
[]
string
{
"/var/lib/kubelet"
,
"/etc/cni/net.d"
}
// Only clear etcd data when the etcd manifest is found. In case it is not found, we must assume that the user
// provided external etcd endpoints. In that case, it is his own responsibility to reset etcd
if
_
,
err
:=
os
.
Stat
(
"/etc/kubernetes/manifests/etcd.json"
);
os
.
IsNotExist
(
err
)
{
dirsToClean
=
append
(
dirsToClean
,
"/var/lib/etcd"
)
}
else
{
fmt
.
Println
(
"[reset] No etcd manifest found in %q, assuming external etcd."
,
"/etc/kubernetes/manifests/etcd.json"
)
}
resetConfigDir
(
"/etc/kubernetes/"
)
fmt
.
Printf
(
"Deleting contents of stateful directories: %v
\n
"
,
dirsToClean
)
fmt
.
Printf
(
"[reset] Deleting contents of stateful directories: %v
\n
"
,
dirsToClean
)
for
_
,
dir
:=
range
dirsToClean
{
cleanDir
(
dir
)
}
dockerCheck
:=
preflight
.
ServiceCheck
{
Service
:
"docker"
}
if
warnings
,
errors
:=
dockerCheck
.
Check
();
len
(
warnings
)
==
0
&&
len
(
errors
)
==
0
{
fmt
.
Println
(
"Stopping all running docker containers..."
)
if
err
:=
exec
.
Command
(
"sh"
,
"-c"
,
"docker ps | grep 'k8s_' | awk '{print $1}' | xargs docker rm --force --volumes"
)
.
Run
();
err
!=
nil
{
fmt
.
Println
(
"
f
ailed to stop the running containers"
)
fmt
.
Println
(
"
[reset]
Stopping all running docker containers..."
)
if
err
:=
exec
.
Command
(
"sh"
,
"-c"
,
"docker ps | grep 'k8s_' | awk '{print $1}' | xargs
-r
docker rm --force --volumes"
)
.
Run
();
err
!=
nil
{
fmt
.
Println
(
"
[reset] F
ailed to stop the running containers"
)
}
}
else
{
fmt
.
Println
(
"
docker doesn't seem to be running, skipping the removal of
kubernetes containers"
)
fmt
.
Println
(
"
[reset] docker doesn't seem to be running, skipping the removal of running
kubernetes containers"
)
}
return
nil
}
// cleanDir removes everything in a directory, but not the directory itself
func
cleanDir
(
filepath
string
)
error
{
// If the directory doesn't even exist there's nothing to do, and we do
// not consider this an error
if
_
,
err
:=
os
.
Stat
(
filepath
);
os
.
IsNotExist
(
err
)
{
return
nil
}
d
,
err
:=
os
.
Open
(
filepath
)
if
err
!=
nil
{
return
err
}
defer
d
.
Close
()
names
,
err
:=
d
.
Readdirnames
(
-
1
)
if
err
!=
nil
{
return
err
}
for
_
,
name
:=
range
names
{
err
=
os
.
RemoveAll
(
path
.
Join
(
filepath
,
name
))
if
err
!=
nil
{
return
err
}
}
return
nil
}
// resetConfigDir is used to cleanup the files kubeadm writes in /etc/kubernetes/.
func
resetConfigDir
(
configPathDir
,
pkiPathDir
string
)
{
dirsToClean
:=
[]
string
{
path
.
Join
(
configPathDir
,
"manifests"
),
pkiPathDir
,
}
fmt
.
Printf
(
"[reset] Deleting contents of config directories: %v
\n
"
,
dirsToClean
)
for
_
,
dir
:=
range
dirsToClean
{
err
:=
cleanDir
(
dir
)
if
err
!=
nil
{
fmt
.
Printf
(
"[reset] Failed to remove directory: %q [%v]"
,
dir
,
err
)
}
}
filesToClean
:=
[]
string
{
path
.
Join
(
configPathDir
,
"admin.conf"
),
path
.
Join
(
configPathDir
,
"kubelet.conf"
),
}
fmt
.
Printf
(
"[reset] Deleting files: %v
\n
"
,
filesToClean
)
for
_
,
path
:=
range
filesToClean
{
err
:=
os
.
RemoveAll
(
path
)
if
err
!=
nil
{
fmt
.
Printf
(
"[reset] Failed to remove file: %q [%v]
\n
"
,
path
,
err
)
}
}
}
cmd/kubeadm/app/cmd/reset_test.go
View file @
67d4ddaf
...
...
@@ -162,7 +162,7 @@ func TestConfigDirCleaner(t *testing.T) {
}
}
resetConfigDir
(
tmpDir
)
resetConfigDir
(
tmpDir
,
filepath
.
Join
(
tmpDir
,
"pki"
)
)
// Verify the files we cleanup implicitly in every test:
assertExists
(
t
,
tmpDir
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment