penguin/monok8s

k8s image for Mono Gateway Dev Kit

commit bdbc29649c689c956d036d8667627255d5c8f7131493affdc8e529c1f439bf18

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-03-30T13:50:04Z
subjectSome basic agent startup
commit bdbc29649c689c956d036d8667627255d5c8f7131493affdc8e529c1f439bf18
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-03-30T13:50:04Z

    Some basic agent startup
---
 alpine/configure-system.sh                       |  3 +-
 alpine/rootfs-extra/etc/init.d/bootstrap-cluster | 25 ----------
 alpine/rootfs-extra/etc/init.d/control-agent     | 58 ++++++++++++++++++++++++
 alpine/rootfs-extra/etc/local.d/monok8s.start    |  4 ++
 clitools/pkg/bootstrap/registry.go               |  9 +---
 clitools/pkg/bootstrap/runner.go                 |  7 +++
 clitools/pkg/cmd/agent/agent.go                  |  6 +--
 clitools/pkg/cmd/initcmd/init.go                 |  3 +-
 clitools/pkg/node/agent.go                       | 11 +++++
 clitools/pkg/node/kubeadm.go                     |  2 +-
 configs/cluster.env.default                      | 18 ++++----
 11 files changed, 98 insertions(+), 48 deletions(-)

diff --git a/alpine/configure-system.sh b/alpine/configure-system.sh
index 77c1354..eb5ab5d 100755
--- a/alpine/configure-system.sh
+++ b/alpine/configure-system.sh
@@ -11,4 +11,5 @@ rc-update add fancontrol boot
 rc-update add loopback boot
 rc-update add hostname boot
 rc-update add localmount boot
-rc-update add bootstrap-cluster default
+rc-update add local default
+# rc-update add ctl-agent default
diff --git a/alpine/rootfs-extra/etc/init.d/bootstrap-cluster b/alpine/rootfs-extra/etc/init.d/bootstrap-cluster
deleted file mode 100755
index e010305..0000000
--- a/alpine/rootfs-extra/etc/init.d/bootstrap-cluster
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/sbin/openrc-run
-
-export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
-
-name="Bootstrap the Cluster"
-description="Runs the ctl init bootstrap sequence"
-
-command="/usr/local/bin/ctl"
-command_args="init --env-file /opt/monok8s/config/cluster.env"
-
-LOG_DIR="/var/log/monok8s"
-LOG_FILE="$LOG_DIR/bootstrap-cluster.log"
-
-depend() {
-    need localmount
-}
-
-start() {
-    checkpath --directory "$LOG_DIR"
-    ebegin "Starting the bootstrap sequence"
-    start-stop-daemon --start \
-        --exec "$command" \
-        -- $command_args >>"$LOG_FILE" 2>&1
-    eend $?
-}
diff --git a/alpine/rootfs-extra/etc/init.d/control-agent b/alpine/rootfs-extra/etc/init.d/control-agent
new file mode 100755
index 0000000..2f10193
--- /dev/null
+++ b/alpine/rootfs-extra/etc/init.d/control-agent
@@ -0,0 +1,58 @@
+#!/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 \
+        --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/alpine/rootfs-extra/etc/local.d/monok8s.start b/alpine/rootfs-extra/etc/local.d/monok8s.start
new file mode 100755
index 0000000..4f44f2b
--- /dev/null
+++ b/alpine/rootfs-extra/etc/local.d/monok8s.start
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
+/usr/local/bin/ctl init --env-file /opt/monok8s/config/cluster.env >>/var/log/monok8s/bootstrap.log 2>&1 &
diff --git a/clitools/pkg/bootstrap/registry.go b/clitools/pkg/bootstrap/registry.go
index 6f948d0..f0947d3 100644
--- a/clitools/pkg/bootstrap/registry.go
+++ b/clitools/pkg/bootstrap/registry.go
@@ -38,6 +38,7 @@ 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,
@@ -45,14 +46,6 @@ func NewRegistry(ctx *node.NodeContext) *Registry {
 	}
 }
 
-func (r *Registry) MustGet(name string) node.Step {
-	step, ok := r.steps[name]
-	if !ok {
-		panic(fmt.Sprintf("unknown step %q", name))
-	}
-	return step
-}
-
 func (r *Registry) Get(name string) (node.Step, error) {
 	step, ok := r.steps[name]
 	if !ok {
diff --git a/clitools/pkg/bootstrap/runner.go b/clitools/pkg/bootstrap/runner.go
index 0fde459..56b0f37 100644
--- a/clitools/pkg/bootstrap/runner.go
+++ b/clitools/pkg/bootstrap/runner.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 
+	"k8s.io/klog/v2"
 	monov1alpha1 "undecided.project/monok8s/pkg/apis/monok8s/v1alpha1"
 	"undecided.project/monok8s/pkg/node"
 	"undecided.project/monok8s/pkg/system"
@@ -131,6 +132,11 @@ 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",
+			},
 		},
 	}
 }
@@ -153,6 +159,7 @@ func (r *Runner) Init(ctx context.Context) error {
 			return fmt.Errorf("step %d (%s): %w", i+1, step.Name, err)
 		}
 	}
+	klog.Info("All steps completed successfully")
 	return nil
 }
 
diff --git a/clitools/pkg/cmd/agent/agent.go b/clitools/pkg/cmd/agent/agent.go
index 832dc9c..b79f91c 100644
--- a/clitools/pkg/cmd/agent/agent.go
+++ b/clitools/pkg/cmd/agent/agent.go
@@ -5,19 +5,19 @@ import (
 	"fmt"
 	"time"
 
-	monov1alpha1 "undecided.project/monok8s/pkg/apis/monok8s/v1alpha1"
-	"undecided.project/monok8s/pkg/kube"
 	"github.com/spf13/cobra"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/cli-runtime/pkg/genericclioptions"
 	"k8s.io/klog/v2"
+	monov1alpha1 "undecided.project/monok8s/pkg/apis/monok8s/v1alpha1"
+	"undecided.project/monok8s/pkg/kube"
 )
 
 func NewCmdAgent(flags *genericclioptions.ConfigFlags) *cobra.Command {
 	var namespace string
 	cmd := &cobra.Command{
-		Use:   "agent",
+		Use:   "agent --env-file path",
 		Short: "Watch OSUpgrade resources and do nothing for now",
 		RunE: func(cmd *cobra.Command, _ []string) error {
 			clients, err := kube.NewClients(flags)
diff --git a/clitools/pkg/cmd/initcmd/init.go b/clitools/pkg/cmd/initcmd/init.go
index 60d9ea2..03fdaf6 100644
--- a/clitools/pkg/cmd/initcmd/init.go
+++ b/clitools/pkg/cmd/initcmd/init.go
@@ -81,6 +81,7 @@ Supported formats:
 				rendered := templates.DefaultMonoKSConfig(vals)
 				cfg = &rendered
 
+				klog.InfoS("starting init", "node", cfg.Spec.NodeName, "envFile", envFile)
 			default:
 				path, err := (config.Loader{}).ResolvePath(configPath)
 				if err != nil {
@@ -92,7 +93,7 @@ Supported formats:
 					return err
 				}
 				cfg = loaded
-				klog.InfoS("starting init", "config", path, "node", cfg.Spec.NodeName, "envFile", envFile)
+				klog.InfoS("starting init", "node", cfg.Spec.NodeName, "config", path)
 			}
 
 			runner := bootstrap.NewRunner(cfg)
diff --git a/clitools/pkg/node/agent.go b/clitools/pkg/node/agent.go
new file mode 100644
index 0000000..314b4e3
--- /dev/null
+++ b/clitools/pkg/node/agent.go
@@ -0,0 +1,11 @@
+package node
+
+import (
+	"context"
+
+	system "undecided.project/monok8s/pkg/system"
+)
+
+func StartControlAgent(ctx context.Context, n *NodeContext) error {
+	return system.EnsureServiceRunning(ctx, n.SystemRunner, "control-agent")
+}
diff --git a/clitools/pkg/node/kubeadm.go b/clitools/pkg/node/kubeadm.go
index adc9b86..c1440aa 100644
--- a/clitools/pkg/node/kubeadm.go
+++ b/clitools/pkg/node/kubeadm.go
@@ -429,7 +429,7 @@ func ValidateRequiredImagesPresent(ctx context.Context, n *NodeContext) error {
 			missing = append(missing, img)
 			continue
 		}
-		klog.Infof("found image: %s", img)
+		klog.V(4).Infof("found image: %s", img)
 	}
 
 	if len(missing) > 0 {
diff --git a/configs/cluster.env.default b/configs/cluster.env.default
index 188c00a..5cb2009 100644
--- a/configs/cluster.env.default
+++ b/configs/cluster.env.default
@@ -5,7 +5,7 @@ MKS_NODE_NAME=monok8s-master
 # RJ45 Ports from left to right (interface name inside the OS)
 #   - eth1, eth2, eth0
 MKS_MGMT_IFACE=eth1
-MKS_MGMT_ADDRESS=10.0.0.14/24
+MKS_MGMT_ADDRESS=10.0.0.10/24
 MKS_MGMT_GATEWAY=10.0.0.1
 
 # Space-separated real upstream DNS servers.
@@ -16,8 +16,9 @@ MKS_DNS_NAMESERVERS="10.0.0.1 1.1.1.1 1.0.0.1"
 MKS_DNS_SEARCH_DOMAINS="lan"
 
 ## k8s config
-MKS_KUBERNETES_VERSION=v1.35.3
-MKS_APISERVER_ADVERTISE_ADDRESS=10.0.0.14
+# Do not set this yourself, this auto follows the build version
+# DEV_ONLY MKS_KUBERNETES_VERSION=v1.35.1
+MKS_APISERVER_ADVERTISE_ADDRESS=10.0.0.10
 
 # Optional but strongly recommended
 MKS_CLUSTER_NAME=monok8s
@@ -25,11 +26,10 @@ MKS_POD_SUBNET=10.244.0.0/16
 MKS_SERVICE_SUBNET=10.96.0.0/12
 MKS_CLUSTER_DOMAIN=cluster.local
 
-# Bootstrap mode: init, join
-MKS_BOOTSTRAP_MODE=init
+# control-plane, worker
+MKS_CLUSTER_ROLE=control-plane
+MKS_INIT_CONTROL_PLANE=yes
 
-# For join mode: worker, control-plane
-MKS_JOIN_KIND=worker
 MKS_API_SERVER_ENDPOINT=
 MKS_BOOTSTRAP_TOKEN=
 MKS_DISCOVERY_TOKEN_CA_CERT_HASH=
@@ -46,7 +46,7 @@ MKS_NODE_ANNOTATIONS=mono.si/board=ls1046a,mono.si/image-version=dev
 
 # Optional
 # Extra API server SANs, comma-separated
-MKS_SANS=127.0.0.1,localhost,monok8s-master,10.0.0.14
+MKS_SANS=127.0.0.1,localhost,monok8s-master,10.0.0.10
 
 # CRI-O socket
 MKS_CONTAINER_RUNTIME_ENDPOINT=unix:///var/run/crio/crio.sock
@@ -55,4 +55,4 @@ MKS_CONTAINER_RUNTIME_ENDPOINT=unix:///var/run/crio/crio.sock
 MKS_ALLOW_SCHEDULING_ON_CONTROL_PLANE=true
 
 # Emergency override only
-MKS_SKIP_IMAGE_CHECK=no
\ No newline at end of file
+MKS_SKIP_IMAGE_CHECK=no