From b6c110410f169baf8e74fb0cd7c994b54afa0ec9c88b728d37da9ec529f17b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=9F=E9=85=8C=20=E9=B5=AC=E5=85=84?= Date: Wed, 1 Apr 2026 00:00:06 +0800 Subject: [PATCH] Ditch rc-service control-agent, use daemonset insteaad --- alpine/configure-system.sh | 1 - alpine/rootfs-extra/etc/init.d/control-agent | 57 -------------------- clitools/pkg/bootstrap/registry.go | 1 - clitools/pkg/bootstrap/runner.go | 5 -- clitools/pkg/kube/clients.go | 15 ++++-- clitools/pkg/node/agent.go | 53 +++++++++++++++--- 6 files changed, 57 insertions(+), 75 deletions(-) delete mode 100755 alpine/rootfs-extra/etc/init.d/control-agent diff --git a/alpine/configure-system.sh b/alpine/configure-system.sh index eb5ab5d..b6edf64 100755 --- a/alpine/configure-system.sh +++ b/alpine/configure-system.sh @@ -12,4 +12,3 @@ rc-update add loopback boot rc-update add hostname boot rc-update add localmount boot rc-update add local default -# rc-update add ctl-agent default diff --git a/alpine/rootfs-extra/etc/init.d/control-agent b/alpine/rootfs-extra/etc/init.d/control-agent deleted file mode 100755 index 1dc276b..0000000 --- a/alpine/rootfs-extra/etc/init.d/control-agent +++ /dev/null @@ -1,57 +0,0 @@ -#!/sbin/openrc-run - -export PATH="/usr/local/bin:/usr/local/sbin:$PATH" - -name="monok8s-control-agent" -description="System Control Agent (OSUpgrade controller)" - -supervisor=supervise-daemon - -command="/usr/local/bin/ctl" -command_args="agent --env-file /opt/monok8s/config/cluster.env" - -command_user="root:root" - -pidfile="/run/${RC_SVCNAME}.pid" - -output_log="/var/log/monok8s/agent.log" -error_log="/var/log/monok8s/agent.log" - -retry="TERM/10/KILL/5" - -depend() { - need localmount - after net -} - -start_pre() { - checkpath --directory /run - checkpath --directory /var/log/monok8s - - if [ ! -f /opt/monok8s/config/cluster.env ]; then - eerror "Missing env file: /opt/monok8s/config/cluster.env" - return 1 - fi -} - -start() { - ebegin "Starting monok8s control agent" - supervise-daemon "$RC_SVCNAME" \ - --start \ - --pidfile "$pidfile" \ - --stdout "$output_log" \ - --stderr "$error_log" \ - --respawn-delay 5 \ - --respawn-max 0 \ - -- \ - $command $command_args - eend $? -} - -stop() { - ebegin "Stopping monok8s control agent" - supervise-daemon "$RC_SVCNAME" \ - --stop \ - --pidfile "$pidfile" - eend $? -} diff --git a/clitools/pkg/bootstrap/registry.go b/clitools/pkg/bootstrap/registry.go index 157f7c1..9a64cbe 100644 --- a/clitools/pkg/bootstrap/registry.go +++ b/clitools/pkg/bootstrap/registry.go @@ -39,7 +39,6 @@ func NewRegistry(ctx *node.NodeContext) *Registry { "RunKubeadmUpgradeApply": node.RunKubeadmUpgradeApply, "RunKubeadmUpgradeNode": node.RunKubeadmUpgradeNode, "StartCRIO": node.StartCRIO, - "StartControlAgent": node.StartControlAgent, "ValidateNodeIPAndAPIServerReachability": node.ValidateNodeIPAndAPIServerReachability, "ValidateRequiredImagesPresent": node.ValidateRequiredImagesPresent, "WaitForExistingClusterIfNeeded": node.WaitForExistingClusterIfNeeded, diff --git a/clitools/pkg/bootstrap/runner.go b/clitools/pkg/bootstrap/runner.go index 56b0f37..4d4606f 100644 --- a/clitools/pkg/bootstrap/runner.go +++ b/clitools/pkg/bootstrap/runner.go @@ -132,11 +132,6 @@ func NewRunner(cfg *monov1alpha1.MonoKSConfig) *Runner { Name: "Apply node metadata", Desc: "Apply labels/annotations to the local node if API server is reachable", }, - { - RegKey: "StartControlAgent", - Name: "Starts the Control Agent", - Desc: "Handles OSUpgrade resources polling", - }, }, } } diff --git a/clitools/pkg/kube/clients.go b/clitools/pkg/kube/clients.go index e75dd04..188acb7 100644 --- a/clitools/pkg/kube/clients.go +++ b/clitools/pkg/kube/clients.go @@ -3,14 +3,15 @@ package kube import ( "fmt" - monov1alpha1 "undecided.project/monok8s/pkg/apis/monok8s/v1alpha1" apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" - "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/client-go/dynamic" kubernetes "k8s.io/client-go/kubernetes" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + monov1alpha1 "undecided.project/monok8s/pkg/apis/monok8s/v1alpha1" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" ) @@ -42,6 +43,12 @@ func NewClients(flags *genericclioptions.ConfigFlags) (*Clients, error) { return &Clients{Config: cfg, Kubernetes: kubeClient, Dynamic: dyn, APIExtensions: ext, RESTClientGetter: flags}, nil } +func NewClientsFromKubeconfig(kubeconfigPath string) (*Clients, error) { + flags := genericclioptions.NewConfigFlags(false) + flags.KubeConfig = &kubeconfigPath + return NewClients(flags) +} + func Scheme() *runtime.Scheme { scheme := runtime.NewScheme() utilruntime.Must(clientgoscheme.AddToScheme(scheme)) diff --git a/clitools/pkg/node/agent.go b/clitools/pkg/node/agent.go index 4b3aef5..b2db5a9 100644 --- a/clitools/pkg/node/agent.go +++ b/clitools/pkg/node/agent.go @@ -2,17 +2,56 @@ package node import ( "context" + "fmt" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog/v2" - system "undecided.project/monok8s/pkg/system" + + "undecided.project/monok8s/pkg/crds" + "undecided.project/monok8s/pkg/kube" ) -// Cluster is fine without uboot commands, just no OSUpgrade agent -func StartControlAgent(ctx context.Context, n *NodeContext) error { - err := ConfigureUBootCommands(ctx, n) - if err == nil { - return system.EnsureServiceRunning(ctx, n.SystemRunner, "control-agent") +func ApplyCRDs(ctx context.Context, n *NodeContext) error { + if n.Config.Spec.ClusterRole != "control-plane" { + return nil } - klog.Warningf("not starting agent due to uboot: %v", err) + + const kubeconfig = "/etc/kubernetes/admin.conf" + + clients, err := kube.NewClientsFromKubeconfig(kubeconfig) + if err != nil { + return fmt.Errorf("build kube clients from %s: %w", kubeconfig, err) + } + + crdClient := clients.APIExtensions.ApiextensionsV1().CustomResourceDefinitions() + + for _, wanted := range crds.Definitions() { + _, err := crdClient.Create(ctx, wanted, metav1.CreateOptions{}) + if err == nil { + klog.InfoS("crd created", "name", wanted.Name) + continue + } + + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("create CRD %s: %w", wanted.Name, err) + } + + current, getErr := crdClient.Get(ctx, wanted.Name, metav1.GetOptions{}) + if getErr != nil { + return fmt.Errorf("get existing CRD %s: %w", wanted.Name, getErr) + } + + updated := wanted.DeepCopy() + updated.ResourceVersion = current.ResourceVersion + + _, err = crdClient.Update(ctx, updated, metav1.UpdateOptions{}) + if err != nil { + return fmt.Errorf("update CRD %s: %w", wanted.Name, err) + } + + klog.InfoS("crd updated", "name", wanted.Name) + } + return nil }