Skip to content

Commit

Permalink
fix: yurtadm support enable kubelet service (openyurtio#1523)
Browse files Browse the repository at this point in the history
Signed-off-by: Liang Deng <283304489@qq.com>
  • Loading branch information
YTGhost authored and JameKeal committed Jun 9, 2023
1 parent d01b18f commit a41d320
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 0 deletions.
3 changes: 3 additions & 0 deletions pkg/yurtadm/cmd/join/phases/prepare.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ func RunPrepare(data joindata.YurtJoinData) error {
if err := yurtadmutil.SetKubeletService(); err != nil {
return err
}
if err := yurtadmutil.EnableKubeletService(); err != nil {
return err
}
if err := yurtadmutil.SetKubeletUnitConfig(); err != nil {
return err
}
Expand Down
6 changes: 6 additions & 0 deletions pkg/yurtadm/util/initsystem/initsystem.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ package initsystem

// InitSystem is the interface that describe behaviors of an init system
type InitSystem interface {
// ServiceIsEnabled ensures the service is enabled to start on each boot.
ServiceIsEnabled(service string) bool

// ServiceEnable tries to enable a specific service
ServiceEnable(service string) error

// ServiceIsActive ensures the service is running, or attempting to run. (crash looping in the case of kubelet)
ServiceIsActive(service string) bool
}
40 changes: 40 additions & 0 deletions pkg/yurtadm/util/initsystem/initsystem_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,26 @@ import (
"fmt"
"os/exec"
"strings"

"github.com/pkg/errors"
)

// OpenRCInitSystem defines openrc
type OpenRCInitSystem struct{}

// ServiceIsEnabled ensures the service is enabled to start on each boot.
func (openrc OpenRCInitSystem) ServiceIsEnabled(service string) bool {
args := []string{"show", "default"}
outBytes, _ := exec.Command("rc-update", args...).Output()
return strings.Contains(string(outBytes), service)
}

// ServiceEnable tries to start a specific service
func (openrc OpenRCInitSystem) ServiceEnable(service string) error {
args := []string{"add", service, "default"}
return exec.Command("rc-update", args...).Run()
}

// ServiceIsActive ensures the service is running, or attempting to run. (crash looping in the case of kubelet)
func (openrc OpenRCInitSystem) ServiceIsActive(service string) bool {
args := []string{service, "status"}
Expand All @@ -40,6 +55,31 @@ func (openrc OpenRCInitSystem) ServiceIsActive(service string) bool {
// SystemdInitSystem defines systemd
type SystemdInitSystem struct{}

// reloadSystemd reloads the systemd daemon
func (sysd SystemdInitSystem) reloadSystemd() error {
if err := exec.Command("systemctl", "daemon-reload").Run(); err != nil {
return errors.Wrap(err, "failed to reload systemd")
}
return nil
}

// ServiceIsEnabled ensures the service is enabled to start on each boot.
func (sysd SystemdInitSystem) ServiceIsEnabled(service string) bool {
args := []string{"is-enabled", service}
err := exec.Command("systemctl", args...).Run()
return err == nil
}

// ServiceEnable tries to start a specific service
func (sysd SystemdInitSystem) ServiceEnable(service string) error {
// Before we try to start any service, make sure that systemd is ready
if err := sysd.reloadSystemd(); err != nil {
return err
}
args := []string{"enable", service}
return exec.Command("systemctl", args...).Run()
}

// ServiceIsActive will check is the service is "active". In the case of
// crash looping services (kubelet in our case) status will return as
// "activating", so we will consider this active as well.
Expand Down
44 changes: 44 additions & 0 deletions pkg/yurtadm/util/initsystem/initsystem_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,50 @@ import (
// WindowsInitSystem is the windows implementation of InitSystem
type WindowsInitSystem struct{}

// ServiceIsEnabled ensures the service is enabled to start on each boot.
func (sysd WindowsInitSystem) ServiceIsEnabled(service string) bool {
m, err := mgr.Connect()
if err != nil {
return false
}
defer m.Disconnect()

s, err := m.OpenService(service)
if err != nil {
return false
}
defer s.Close()

c, err := s.Config()
if err != nil {
return false
}

return c.StartType != mgr.StartDisabled
}

func (sysd WindowsInitSystem) ServiceEnable(service string) error {
m, err := mgr.Connect()
if err != nil {
return false
}
defer m.Disconnect()

s, err := m.OpenService(service)
if err != nil {
return false
}
defer s.Close()

c, err := s.Config()
if err != nil {
return false
}
c.StartType = mgr.StartAutomatic

return s.UpdateConfig(c)
}

// ServiceIsActive ensures the service is running, or attempting to run. (crash looping in the case of kubelet)
func (sysd WindowsInitSystem) ServiceIsActive(service string) bool {
m, err := mgr.Connect()
Expand Down
15 changes: 15 additions & 0 deletions pkg/yurtadm/util/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,21 @@ func SetKubeletService() error {
return nil
}

// EnableKubeletService enable kubelet service
func EnableKubeletService() error {
initSystem, err := initsystem.GetInitSystem()
if err != nil {
return err
}

if !initSystem.ServiceIsEnabled("kubelet") {
if err = initSystem.ServiceEnable("kubelet"); err != nil {
return fmt.Errorf("enable kubelet service failed")
}
}
return nil
}

// SetKubeletUnitConfig configure kubelet startup parameters.
func SetKubeletUnitConfig() error {
kubeletUnitDir := filepath.Dir(constants.KubeletServiceConfPath)
Expand Down

0 comments on commit a41d320

Please # to comment.