mirror of
https://github.com/k3s-io/k3s.git
synced 2024-06-07 19:41:36 +00:00
f37e7565b8
This controller only needs to run when using managed etcd, so move it in with the rest of the etcd stuff. This change also modifies the controller to only watch the Kubernetes service endpoint, instead of watching all endpoints in the entire cluster. Fixes an error message revealed by use of a newer grpc client in Kubernetes 1.24, which logs an error when the Put to etcd failed because kine doesn't support the etcd Put operation. The controller shouldn't have been running without etcd in the first place. Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
package etcd
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"time"
|
|
|
|
controllerv1 "github.com/rancher/wrangler/pkg/generated/controllers/core/v1"
|
|
"github.com/sirupsen/logrus"
|
|
v1 "k8s.io/api/core/v1"
|
|
)
|
|
|
|
func registerMetadataHandlers(ctx context.Context, etcd *ETCD) {
|
|
if etcd.config.DisableETCD {
|
|
return
|
|
}
|
|
|
|
nodes := etcd.config.Runtime.Core.Core().V1().Node()
|
|
h := &metadataHandler{
|
|
etcd: etcd,
|
|
nodeController: nodes,
|
|
ctx: ctx,
|
|
}
|
|
|
|
logrus.Infof("Starting managed etcd node label controller")
|
|
nodes.OnChange(ctx, "managed-etcd-metadata-controller", h.sync)
|
|
}
|
|
|
|
type metadataHandler struct {
|
|
etcd *ETCD
|
|
nodeController controllerv1.NodeController
|
|
ctx context.Context
|
|
}
|
|
|
|
func (m *metadataHandler) sync(key string, node *v1.Node) (*v1.Node, error) {
|
|
if node == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
nodeName := os.Getenv("NODE_NAME")
|
|
if nodeName == "" {
|
|
logrus.Debug("waiting for node name to be assigned for managed etcd node label controller")
|
|
m.nodeController.EnqueueAfter(key, 5*time.Second)
|
|
return node, nil
|
|
}
|
|
|
|
if key == nodeName {
|
|
return m.handleSelf(node)
|
|
}
|
|
|
|
return node, nil
|
|
}
|
|
|
|
func (m *metadataHandler) handleSelf(node *v1.Node) (*v1.Node, error) {
|
|
if node.Annotations[NodeNameAnnotation] == m.etcd.name &&
|
|
node.Annotations[NodeAddressAnnotation] == m.etcd.address &&
|
|
node.Labels[EtcdRoleLabel] == "true" &&
|
|
node.Labels[ControlPlaneLabel] == "true" {
|
|
return node, nil
|
|
}
|
|
|
|
node = node.DeepCopy()
|
|
if node.Annotations == nil {
|
|
node.Annotations = map[string]string{}
|
|
}
|
|
|
|
node.Annotations[NodeNameAnnotation] = m.etcd.name
|
|
node.Annotations[NodeAddressAnnotation] = m.etcd.address
|
|
node.Labels[EtcdRoleLabel] = "true"
|
|
node.Labels[MasterLabel] = "true"
|
|
node.Labels[ControlPlaneLabel] = "true"
|
|
|
|
return m.nodeController.Update(node)
|
|
}
|