Skip to content

Commit 011c7d4

Browse files
committed
refactor: replace kubectl operation with k8s apiclient call
Signed-off-by: Allen Sun <shlallen1990@gmail.com>
1 parent 7b1bb6b commit 011c7d4

File tree

4 files changed

+76
-66
lines changed

4 files changed

+76
-66
lines changed

pkg/runtime/kubernetes/init.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,16 @@ import (
3232
)
3333

3434
const (
35-
RemoteCmdCopyStatic = "mkdir -p %s && cp -f %s %s"
36-
RemoteApplyYaml = `echo '%s' | kubectl apply -f -`
37-
RemoteCmdGetNetworkInterface = "ls /sys/class/net"
38-
RemoteCmdExistNetworkInterface = "ip addr show %s | egrep \"%s\" || true"
39-
WriteKubeadmConfigCmd = `cd %s && echo '%s' > etc/kubeadm.yml`
40-
DefaultVIP = "10.103.97.2"
41-
DefaultAPIserverDomain = "apiserver.cluster.local"
42-
DefaultRegistryPort = 5000
43-
DockerCertDir = "/etc/docker/certs.d"
35+
RemoteCmdCopyStatic = "mkdir -p %s && cp -f %s %s"
36+
WriteKubeadmConfigCmd = `cd %s && echo '%s' > etc/kubeadm.yml`
37+
DefaultVIP = "10.103.97.2"
38+
DefaultAPIserverDomain = "apiserver.cluster.local"
39+
DefaultRegistryPort = 5000
40+
DockerCertDir = "/etc/docker/certs.d"
4441
)
4542

4643
func (k *Runtime) ConfigKubeadmOnMaster0() error {
47-
if err := k.LoadFromClusterfile(k.Config.ClusterFileKubeConfig); err != nil {
44+
if err := k.LoadFromClusterfile(k.KubeadmConfigFromClusterfile); err != nil {
4845
return fmt.Errorf("failed to load kubeadm config from clusterfile: %v", err)
4946
}
5047
// TODO handle the kubeadm config, like kubeproxy config

pkg/runtime/kubernetes/join_masters.go

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"strings"
2424
"sync"
2525

26-
"github.com/pkg/errors"
2726
"github.com/sealerio/sealer/common"
2827
"github.com/sealerio/sealer/pkg/clustercert"
2928
"github.com/sealerio/sealer/pkg/ipvs"
@@ -32,6 +31,8 @@ import (
3231
"github.com/sealerio/sealer/utils/ssh"
3332
versionUtils "github.com/sealerio/sealer/utils/version"
3433
"github.com/sealerio/sealer/utils/yaml"
34+
35+
"github.com/pkg/errors"
3536
"github.com/sirupsen/logrus"
3637
"golang.org/x/sync/errgroup"
3738
)
@@ -71,7 +72,6 @@ rm -rf /var/lib/etcd && rm -rf /var/etcd
7172
RemoteRemoveRegistryCerts = "rm -rf " + DockerCertDir + "/%s*"
7273
RemoveLvscareStaticPod = "rm -rf /etc/kubernetes/manifests/kube-sealyun-lvscare*"
7374
CreateLvscareStaticPod = "mkdir -p /etc/kubernetes/manifests && echo '%s' > /etc/kubernetes/manifests/kube-sealyun-lvscare.yaml"
74-
KubeDeleteNode = "kubectl delete node %s"
7575
// TODO check kubernetes certs
7676
RemoteCheckCerts = "kubeadm alpha certs check-expiration"
7777
)
@@ -389,30 +389,32 @@ func (k *Runtime) deleteMasters(masters []net.IP) error {
389389
return eg.Wait()
390390
}
391391

392-
func (k *Runtime) isHostName(master, host net.IP) (string, error) {
393-
hostString, err := k.CmdToString(master, "kubectl get nodes | grep -v NAME | awk '{print $1}'", ",")
392+
// isHostInExistingCluster checks if the input host is contained in the existing cluster.
393+
// It gets all nodes within existing cluster,
394+
// judges each node name with the hostname of input host node
395+
// and finially get the comparison result.
396+
func (k *Runtime) isHostInExistingCluster(host net.IP) (string, error) {
397+
nodes, err := k.ListNodes()
394398
if err != nil {
395399
return "", err
396400
}
401+
if len(nodes.Items) == 0 {
402+
return "", fmt.Errorf("no node gotten by k8s client")
403+
}
404+
397405
hostName, err := k.CmdToString(host, "hostname", "")
398406
if err != nil {
399407
return "", err
400408
}
401-
hosts := strings.Split(hostString, ",")
402-
var name string
403-
for _, h := range hosts {
404-
if strings.TrimSpace(h) == "" {
405-
continue
406-
} else {
407-
hh := strings.ToLower(h)
408-
fromH := strings.ToLower(hostName)
409-
if hh == fromH {
410-
name = h
411-
break
412-
}
409+
410+
for _, nodeItem := range nodes.Items {
411+
hh := strings.ToLower(nodeItem.Name)
412+
fromH := strings.ToLower(hostName)
413+
if hh == fromH {
414+
return hh, nil
413415
}
414416
}
415-
return name, nil
417+
return "", fmt.Errorf("failed to get node: no node's hostname matches hostname of host(%s)", host)
416418
}
417419

418420
func (k *Runtime) deleteMaster(master net.IP) error {
@@ -449,19 +451,15 @@ func (k *Runtime) deleteMaster(master net.IP) error {
449451
}
450452

451453
if len(masterIPs) > 0 {
452-
hostname, err := k.isHostName(k.cluster.GetMaster0IP(), master)
454+
hostname, err := k.isHostInExistingCluster(master)
453455
if err != nil {
454456
return err
455457
}
456-
master0SSH, err := k.getHostSSHClient(k.cluster.GetMaster0IP())
457-
if err != nil {
458-
return fmt.Errorf("failed to get master0 ssh client: %v", err)
459-
}
460-
461-
if err := master0SSH.CmdAsync(k.cluster.GetMaster0IP(), fmt.Sprintf(KubeDeleteNode, strings.TrimSpace(hostname))); err != nil {
462-
return fmt.Errorf("failed to delete node %s: %v", hostname, err)
458+
if err := k.DeleteNode(strings.TrimSpace(hostname)); err != nil {
459+
return err
463460
}
464461
}
462+
465463
lvsImage := k.RegConfig.Repo() + "/fanux/lvscare:latest"
466464
yaml := ipvs.LvsStaticPodYaml(k.getVIP(), masterIPs, lvsImage)
467465
eg, _ := errgroup.WithContext(context.Background())

pkg/runtime/kubernetes/join_nodes.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,21 +166,17 @@ func (k *Runtime) deleteNode(node net.IP) error {
166166
if err := ssh.CmdAsync(node, remoteCleanCmds...); err != nil {
167167
return err
168168
}
169-
//remove node
169+
170+
// remove node
170171
if len(k.cluster.GetMasterIPList()) > 0 {
171-
hostname, err := k.isHostName(k.cluster.GetMaster0IP(), node)
172+
hostname, err := k.isHostInExistingCluster(node)
172173
if err != nil {
173174
return err
174175
}
175-
ssh, err := k.getHostSSHClient(k.cluster.GetMaster0IP())
176-
if err != nil {
177-
return fmt.Errorf("failed to get master0 ssh client(%s): %v", k.cluster.GetMaster0IP(), err)
178-
}
179-
if err := ssh.CmdAsync(k.cluster.GetMaster0IP(), fmt.Sprintf(KubeDeleteNode, strings.TrimSpace(hostname))); err != nil {
180-
return fmt.Errorf("failed to delete node %s: %v", hostname, err)
176+
if err := k.DeleteNode(strings.TrimSpace(hostname)); err != nil {
177+
return err
181178
}
182179
}
183-
184180
return nil
185181
}
186182

pkg/runtime/kubernetes/runtime.go

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,45 +17,53 @@ package kubernetes
1717
import (
1818
"context"
1919
"fmt"
20-
"strings"
21-
"sync"
22-
23-
"github.com/sealerio/sealer/pkg/registry"
24-
"github.com/sealerio/sealer/pkg/runtime/kubernetes/kubeadm"
25-
"github.com/sealerio/sealer/utils"
26-
versionUtils "github.com/sealerio/sealer/utils/version"
27-
2820
"net"
2921
"path/filepath"
22+
"strings"
23+
"sync"
3024
"time"
3125

3226
"github.com/sealerio/sealer/common"
27+
"github.com/sealerio/sealer/pkg/client/k8s"
28+
"github.com/sealerio/sealer/pkg/registry"
3329
"github.com/sealerio/sealer/pkg/runtime"
30+
"github.com/sealerio/sealer/pkg/runtime/kubernetes/kubeadm"
3431
v2 "github.com/sealerio/sealer/types/api/v2"
32+
"github.com/sealerio/sealer/utils"
3533
"github.com/sealerio/sealer/utils/platform"
3634
"github.com/sealerio/sealer/utils/ssh"
3735
strUtils "github.com/sealerio/sealer/utils/strings"
38-
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
36+
versionUtils "github.com/sealerio/sealer/utils/version"
3937

4038
"github.com/sirupsen/logrus"
4139
"golang.org/x/sync/errgroup"
40+
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
4241
)
4342

4443
type Config struct {
45-
Vlog int
46-
VIP string
47-
RegConfig *registry.Config
4844
// Clusterfile: the absolute path, we need to read kubeadm config from Clusterfile
4945
ClusterFileKubeConfig *kubeadm.KubeadmConfig
50-
APIServerDomain string
5146
}
5247

5348
// Runtime struct is the runtime interface for kubernetes
5449
type Runtime struct {
5550
*sync.Mutex
51+
// TODO: remove field cluster from runtime pkg
52+
// just make runtime to use essential data from cluster, rather than the whole cluster scope.
5653
cluster *v2.Cluster
54+
55+
// The KubeadmConfig used to setup the final cluster.
56+
// Its data is from KubeadmConfig input from Clusterfile and KubeadmConfig in ClusterImage.
5757
*kubeadm.KubeadmConfig
58-
*Config
58+
// *Config
59+
KubeadmConfigFromClusterfile *kubeadm.KubeadmConfig
60+
APIServerDomain string
61+
Vlog int
62+
VIP string
63+
64+
// RegConfig contains the embedded registry configuration of cluster
65+
RegConfig *registry.Config
66+
*k8s.Client
5967
}
6068

6169
// NewDefaultRuntime arg "clusterfileKubeConfig" is the Clusterfile path/name, runtime need read kubeadm config from it
@@ -67,13 +75,24 @@ func NewDefaultRuntime(cluster *v2.Cluster, clusterfileKubeConfig *kubeadm.Kubea
6775
func newKubernetesRuntime(cluster *v2.Cluster, clusterFileKubeConfig *kubeadm.KubeadmConfig) (runtime.Interface, error) {
6876
k := &Runtime{
6977
cluster: cluster,
70-
Config: &Config{
78+
/*Config: &Config{
7179
ClusterFileKubeConfig: clusterFileKubeConfig,
72-
APIServerDomain: DefaultAPIserverDomain,
73-
},
74-
KubeadmConfig: &kubeadm.KubeadmConfig{},
80+
},*/
81+
KubeadmConfigFromClusterfile: clusterFileKubeConfig,
82+
KubeadmConfig: &kubeadm.KubeadmConfig{},
83+
APIServerDomain: DefaultAPIserverDomain,
7584
}
76-
k.Config.RegConfig = registry.GetConfig(k.getImageMountDir(), k.cluster.GetMaster0IP())
85+
86+
var err error
87+
if k.Client, err = k8s.Newk8sClient(); err != nil {
88+
// In current design, as runtime controls all cluster operations including run, join, delete
89+
// and so on, then when executing run operation, it will definitely fail when creating k8s client
90+
// since no k8s cluster is setup. While when join and delete operation, the cluster already exists,
91+
// we can make it to create k8s client. Therefore just throw a warn log to move on.
92+
logrus.Warnf("failed to create k8s client: %v", err)
93+
}
94+
95+
k.RegConfig = registry.GetConfig(k.getImageMountDir(), k.cluster.GetMaster0IP())
7796
k.setCertSANS(append(
7897
[]string{"127.0.0.1", k.getAPIServerDomain(), k.getVIP().String()},
7998
k.cluster.GetMasterIPStrList()...),
@@ -239,7 +258,7 @@ func (k *Runtime) getDNSDomain() string {
239258
}
240259

241260
func (k *Runtime) getAPIServerDomain() string {
242-
return k.Config.APIServerDomain
261+
return k.APIServerDomain
243262
}
244263

245264
func (k *Runtime) getKubeVersion() string {
@@ -369,8 +388,8 @@ func (k *Runtime) MergeKubeadmConfig() error {
369388
if k.getKubeVersion() != "" {
370389
return nil
371390
}
372-
if k.Config.ClusterFileKubeConfig != nil {
373-
if err := k.LoadFromClusterfile(k.Config.ClusterFileKubeConfig); err != nil {
391+
if k.KubeadmConfigFromClusterfile != nil {
392+
if err := k.LoadFromClusterfile(k.KubeadmConfigFromClusterfile); err != nil {
374393
return fmt.Errorf("failed to load kubeadm config from clusterfile: %v", err)
375394
}
376395
}

0 commit comments

Comments
 (0)