mirror of
https://github.com/k3s-io/k3s.git
synced 2024-06-07 19:41:36 +00:00
Mutable --node-label values for server/agent sub-commands.
Values passed in via the server/agent `--node-label` flag are treated as mutable. They are passed through to the kubelet just as before but after the kubelet comes up they are applied again. This allows for passing labels a k3s start-time that may be necessary for scheduling but may change from boot to boot, e.g. `k3os.io/version` after an upgrade. Tested locallon on my amd64 workstation with the docker container. Addresses #1119.
This commit is contained in:
parent
45aa518ba8
commit
063efb25bb
@ -9,6 +9,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
|
||||
systemd "github.com/coreos/go-systemd/daemon"
|
||||
"github.com/rancher/k3s/pkg/agent/config"
|
||||
"github.com/rancher/k3s/pkg/agent/containerd"
|
||||
@ -72,11 +74,9 @@ func run(ctx context.Context, cfg cmds.Agent, lb *loadbalancer.LoadBalancer) err
|
||||
}
|
||||
}
|
||||
|
||||
if !nodeConfig.AgentConfig.DisableCCM {
|
||||
if err := syncAddressesLabels(ctx, &nodeConfig.AgentConfig, coreClient.CoreV1().Nodes()); err != nil {
|
||||
if err := syncLabels(ctx, &nodeConfig.AgentConfig, coreClient.CoreV1().Nodes()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if !nodeConfig.AgentConfig.DisableNPC {
|
||||
if err := netpol.Run(ctx, nodeConfig); err != nil {
|
||||
@ -158,7 +158,7 @@ func validate() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func syncAddressesLabels(ctx context.Context, agentConfig *daemonconfig.Agent, nodes v1.NodeInterface) error {
|
||||
func syncLabels(ctx context.Context, agentConfig *daemonconfig.Agent, nodes v1.NodeInterface) error {
|
||||
for {
|
||||
node, err := nodes.Get(agentConfig.NodeName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
@ -167,8 +167,14 @@ func syncAddressesLabels(ctx context.Context, agentConfig *daemonconfig.Agent, n
|
||||
continue
|
||||
}
|
||||
|
||||
newLabels, update := updateLabelMap(agentConfig, node.Labels)
|
||||
if update {
|
||||
newLabels, updateMutables := updateMutableLabels(agentConfig, node.Labels)
|
||||
|
||||
updateAddresses := !agentConfig.DisableCCM
|
||||
if updateAddresses {
|
||||
newLabels, updateAddresses = updateAddressLabels(agentConfig, newLabels)
|
||||
}
|
||||
|
||||
if updateAddresses || updateMutables {
|
||||
node.Labels = newLabels
|
||||
if _, err := nodes.Update(node); err != nil {
|
||||
logrus.Infof("Failed to update node %s: %v", agentConfig.NodeName, err)
|
||||
@ -179,9 +185,9 @@ func syncAddressesLabels(ctx context.Context, agentConfig *daemonconfig.Agent, n
|
||||
continue
|
||||
}
|
||||
}
|
||||
logrus.Infof("addresses labels has been set successfully on node: %s", agentConfig.NodeName)
|
||||
logrus.Infof("labels have been set successfully on node: %s", agentConfig.NodeName)
|
||||
} else {
|
||||
logrus.Infof("addresses labels has already been set successfully on node: %s", agentConfig.NodeName)
|
||||
logrus.Infof("labels have already set on node: %s", agentConfig.NodeName)
|
||||
}
|
||||
|
||||
break
|
||||
@ -190,19 +196,34 @@ func syncAddressesLabels(ctx context.Context, agentConfig *daemonconfig.Agent, n
|
||||
return nil
|
||||
}
|
||||
|
||||
func updateLabelMap(agentConfig *daemonconfig.Agent, nodeLabels map[string]string) (map[string]string, bool) {
|
||||
func updateMutableLabels(agentConfig *daemonconfig.Agent, nodeLabels map[string]string) (map[string]string, bool) {
|
||||
result := map[string]string{}
|
||||
for k, v := range nodeLabels {
|
||||
|
||||
for _, m := range agentConfig.NodeLabels {
|
||||
var (
|
||||
v string
|
||||
p = strings.SplitN(m, `=`, 2)
|
||||
k = p[0]
|
||||
)
|
||||
if len(p) > 1 {
|
||||
v = p[1]
|
||||
}
|
||||
result[k] = v
|
||||
}
|
||||
result = labels.Merge(nodeLabels, result)
|
||||
return result, !equality.Semantic.DeepEqual(nodeLabels, result)
|
||||
}
|
||||
|
||||
result[InternalIPLabel] = agentConfig.NodeIP
|
||||
result[HostnameLabel] = agentConfig.NodeName
|
||||
if agentConfig.NodeExternalIP == "" {
|
||||
delete(result, ExternalIPLabel)
|
||||
} else {
|
||||
func updateAddressLabels(agentConfig *daemonconfig.Agent, nodeLabels map[string]string) (map[string]string, bool) {
|
||||
result := map[string]string{
|
||||
InternalIPLabel: agentConfig.NodeIP,
|
||||
HostnameLabel: agentConfig.NodeName,
|
||||
}
|
||||
|
||||
if agentConfig.NodeExternalIP != "" {
|
||||
result[ExternalIPLabel] = agentConfig.NodeExternalIP
|
||||
}
|
||||
|
||||
result = labels.Merge(nodeLabels, result)
|
||||
return result, !equality.Semantic.DeepEqual(nodeLabels, result)
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ var (
|
||||
}
|
||||
NodeLabels = cli.StringSliceFlag{
|
||||
Name: "node-label",
|
||||
Usage: "(agent/node) Registering kubelet with set of labels",
|
||||
Usage: "(agent/node) Registering and starting kubelet with set of labels",
|
||||
Value: &AgentConfig.Labels,
|
||||
}
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user