penguin/monok8s

k8s image for Mono Gateway Dev Kit

commit b6c110410f169baf8e74fb0cd7c994b54afa0ec9c88b728d37da9ec529f17b14

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-03-31T16:00:06Z
subjectDitch rc-service control-agent, use daemonset insteaad
commit b6c110410f169baf8e74fb0cd7c994b54afa0ec9c88b728d37da9ec529f17b14
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-03-31T16:00:06Z

    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(-)

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
+	}
+
+	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)
 	}
-	klog.Warningf("not starting agent due to uboot: %v", 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
 }