| Tim Windelschmidt | 6d33a43 | 2025-02-04 14:34:25 +0100 | [diff] [blame] | 1 | // Copyright The Monogon Project Authors. |
| 2 | // SPDX-License-Identifier: Apache-2.0 |
| 3 | |
| Serge Bazanski | 5df62ba | 2023-03-22 17:56:46 +0100 | [diff] [blame] | 4 | // Package roleserve implements the roleserver/“Role Server”. |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 5 | // |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 6 | // The Role Server runs on every node and is responsible for running all of the |
| 7 | // node's role dependant services, like the control plane (Consensus/etcd and |
| 8 | // Curator) and Kubernetes. It watches the node roles as assigned by the |
| 9 | // cluster's curator, updates the status of the node within the curator, and |
| 10 | // spawns on-demand services. |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 11 | // |
| Serge Bazanski | 37110c3 | 2023-03-01 13:57:27 +0000 | [diff] [blame] | 12 | // .-----------. .--------. Watches .------------. |
| 13 | // | Cluster |--------->| Role |<----------| Node Roles | |
| 14 | // | Enrolment | Provides | Server | Updates '------------' |
| 15 | // '-----------' Data | |----. .-------------. |
| 16 | // '--------' '----->| Node Status | |
| 17 | // Spawns | | Spawns '-------------' |
| 18 | // .-----' '-----. |
| 19 | // V V |
| 20 | // .-----------. .------------. |
| 21 | // | Consensus | | Kubernetes | |
| 22 | // | & Curator | | | |
| 23 | // '-----------' '------------' |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 24 | // |
| 25 | // The internal state of the Role Server (eg. status of services, input from |
| 26 | // Cluster Enrolment, current node roles as retrieved from the cluster) is |
| 27 | // stored as in-memory Event Value variables, with some of them being exposed |
| 28 | // externally for other services to consume (ie. ones that wish to depend on |
| 29 | // some information managed by the Role Server but which do not need to be |
| 30 | // spawned on demand by the Role Server). These Event Values and code which acts |
| 31 | // upon them form a reactive/dataflow-driven model which drives the Role Server |
| 32 | // logic forward. |
| 33 | // |
| 34 | // The Role Server also has to handle the complex bootstrap problem involved in |
| 35 | // simultaneously accessing the control plane (for node roles and other cluster |
| 36 | // data) while maintaining (possibly the only one in the cluster) control plane |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 37 | // instance. This problem is resolved by using the RPC resolver package which |
| 38 | // allows dynamic reconfiguration of endpoints as the cluster is running. |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 39 | package roleserve |
| 40 | |
| 41 | import ( |
| 42 | "context" |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 43 | "crypto/ed25519" |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 44 | |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 45 | common "source.monogon.dev/metropolis/node" |
| Serge Bazanski | 7920852 | 2023-03-28 20:14:58 +0200 | [diff] [blame] | 46 | "source.monogon.dev/metropolis/node/core/clusternet" |
| Serge Bazanski | 5df62ba | 2023-03-22 17:56:46 +0100 | [diff] [blame] | 47 | "source.monogon.dev/metropolis/node/core/curator" |
| Lorenz Brun | 1de8b18 | 2021-12-21 17:15:18 +0100 | [diff] [blame] | 48 | "source.monogon.dev/metropolis/node/core/identity" |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 49 | "source.monogon.dev/metropolis/node/core/localstorage" |
| 50 | "source.monogon.dev/metropolis/node/core/network" |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 51 | "source.monogon.dev/metropolis/node/core/rpc/resolver" |
| Lorenz Brun | 35fcf03 | 2023-06-29 04:15:58 +0200 | [diff] [blame] | 52 | "source.monogon.dev/metropolis/node/core/update" |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 53 | cpb "source.monogon.dev/metropolis/proto/common" |
| Tim Windelschmidt | 9f21f53 | 2024-05-07 15:14:20 +0200 | [diff] [blame] | 54 | "source.monogon.dev/osbase/event/memory" |
| 55 | "source.monogon.dev/osbase/logtree" |
| 56 | "source.monogon.dev/osbase/supervisor" |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 57 | ) |
| 58 | |
| 59 | // Config is the configuration of the role server. |
| 60 | type Config struct { |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 61 | // StorageRoot is a handle to access all of the Node's storage. This is needed |
| 62 | // as the roleserver spawns complex workloads like Kubernetes which need access |
| 63 | // to a broad range of storage. |
| 64 | StorageRoot *localstorage.Root |
| 65 | |
| 66 | // Network is a handle to the network service, used by workloads. |
| 67 | Network *network.Service |
| Serge Bazanski | 58ddc09 | 2022-06-30 18:23:33 +0200 | [diff] [blame] | 68 | |
| Lorenz Brun | c607bf6 | 2025-07-22 20:25:26 +0200 | [diff] [blame^] | 69 | PodNetwork *memory.Value[*clusternet.Prefixes] |
| 70 | |
| Serge Bazanski | 58ddc09 | 2022-06-30 18:23:33 +0200 | [diff] [blame] | 71 | // resolver is the main, long-lived, authenticated cluster resolver that is used |
| 72 | // for all subsequent gRPC calls by the subordinates of the roleserver. It is |
| 73 | // created early in the roleserver lifecycle, and is seeded with node |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 74 | // information from the ProvideXXX methods. |
| Serge Bazanski | 58ddc09 | 2022-06-30 18:23:33 +0200 | [diff] [blame] | 75 | Resolver *resolver.Resolver |
| Serge Bazanski | e012b72 | 2023-03-29 17:49:04 +0200 | [diff] [blame] | 76 | |
| Lorenz Brun | 35fcf03 | 2023-06-29 04:15:58 +0200 | [diff] [blame] | 77 | // Update is a handle to the update service, used by workloads. |
| 78 | Update *update.Service |
| 79 | |
| Serge Bazanski | e012b72 | 2023-03-29 17:49:04 +0200 | [diff] [blame] | 80 | LogTree *logtree.LogTree |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 81 | } |
| 82 | |
| 83 | // Service is the roleserver/“Role Server” service. See the package-level |
| 84 | // documentation for more details. |
| 85 | type Service struct { |
| 86 | Config |
| 87 | |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 88 | KubernetesStatus memory.Value[*KubernetesStatus] |
| Serge Bazanski | 11198c8 | 2024-05-22 14:11:01 +0200 | [diff] [blame] | 89 | bootstrapData memory.Value[*BootstrapData] |
| Serge Bazanski | b2d6c33 | 2024-09-03 12:18:24 +0200 | [diff] [blame] | 90 | LocalRoles memory.Value[*cpb.NodeRoles] |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 91 | clusterDirectorySaved memory.Value[bool] |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 92 | localControlPlane memory.Value[*localControlPlane] |
| Serge Bazanski | b2d6c33 | 2024-09-03 12:18:24 +0200 | [diff] [blame] | 93 | CuratorConnection memory.Value[*CuratorConnection] |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 94 | |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 95 | controlPlane *workerControlPlane |
| 96 | statusPush *workerStatusPush |
| Mateusz Zalega | 32b1929 | 2022-05-17 13:26:55 +0200 | [diff] [blame] | 97 | heartbeat *workerHeartbeat |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 98 | kubernetes *workerKubernetes |
| 99 | rolefetch *workerRoleFetch |
| Serge Bazanski | b40c008 | 2023-03-29 14:28:04 +0200 | [diff] [blame] | 100 | nodeMgmt *workerNodeMgmt |
| Serge Bazanski | 7920852 | 2023-03-28 20:14:58 +0200 | [diff] [blame] | 101 | clusternet *workerClusternet |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 102 | hostsfile *workerHostsfile |
| Serge Bazanski | 54e212a | 2023-06-14 13:45:11 +0200 | [diff] [blame] | 103 | metrics *workerMetrics |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 104 | } |
| 105 | |
| 106 | // New creates a Role Server services from a Config. |
| 107 | func New(c Config) *Service { |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 108 | s := &Service{ |
| Serge Bazanski | 58ddc09 | 2022-06-30 18:23:33 +0200 | [diff] [blame] | 109 | Config: c, |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 110 | } |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 111 | s.controlPlane = &workerControlPlane{ |
| 112 | storageRoot: s.StorageRoot, |
| 113 | |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 114 | bootstrapData: &s.bootstrapData, |
| Serge Bazanski | b2d6c33 | 2024-09-03 12:18:24 +0200 | [diff] [blame] | 115 | localRoles: &s.LocalRoles, |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 116 | resolver: s.Resolver, |
| 117 | |
| 118 | localControlPlane: &s.localControlPlane, |
| 119 | curatorConnection: &s.CuratorConnection, |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 120 | } |
| 121 | |
| 122 | s.statusPush = &workerStatusPush{ |
| 123 | network: s.Network, |
| 124 | |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 125 | curatorConnection: &s.CuratorConnection, |
| 126 | localControlPlane: &s.localControlPlane, |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 127 | clusterDirectorySaved: &s.clusterDirectorySaved, |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 128 | } |
| 129 | |
| Mateusz Zalega | 32b1929 | 2022-05-17 13:26:55 +0200 | [diff] [blame] | 130 | s.heartbeat = &workerHeartbeat{ |
| 131 | network: s.Network, |
| 132 | |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 133 | curatorConnection: &s.CuratorConnection, |
| Mateusz Zalega | 32b1929 | 2022-05-17 13:26:55 +0200 | [diff] [blame] | 134 | } |
| 135 | |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 136 | s.kubernetes = &workerKubernetes{ |
| 137 | network: s.Network, |
| 138 | storageRoot: s.StorageRoot, |
| 139 | |
| Serge Bazanski | b2d6c33 | 2024-09-03 12:18:24 +0200 | [diff] [blame] | 140 | localRoles: &s.LocalRoles, |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 141 | localControlPlane: &s.localControlPlane, |
| 142 | curatorConnection: &s.CuratorConnection, |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 143 | |
| 144 | kubernetesStatus: &s.KubernetesStatus, |
| Lorenz Brun | c607bf6 | 2025-07-22 20:25:26 +0200 | [diff] [blame^] | 145 | podNetwork: s.Config.PodNetwork, |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 146 | } |
| 147 | |
| 148 | s.rolefetch = &workerRoleFetch{ |
| Serge Bazanski | 186109c | 2023-06-21 16:57:36 +0200 | [diff] [blame] | 149 | storageRoot: s.StorageRoot, |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 150 | curatorConnection: &s.CuratorConnection, |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 151 | |
| Serge Bazanski | b2d6c33 | 2024-09-03 12:18:24 +0200 | [diff] [blame] | 152 | localRoles: &s.LocalRoles, |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 153 | } |
| 154 | |
| Serge Bazanski | b40c008 | 2023-03-29 14:28:04 +0200 | [diff] [blame] | 155 | s.nodeMgmt = &workerNodeMgmt{ |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 156 | curatorConnection: &s.CuratorConnection, |
| Serge Bazanski | e012b72 | 2023-03-29 17:49:04 +0200 | [diff] [blame] | 157 | logTree: s.LogTree, |
| Lorenz Brun | 35fcf03 | 2023-06-29 04:15:58 +0200 | [diff] [blame] | 158 | updateService: s.Update, |
| Serge Bazanski | b40c008 | 2023-03-29 14:28:04 +0200 | [diff] [blame] | 159 | } |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 160 | |
| Serge Bazanski | 7920852 | 2023-03-28 20:14:58 +0200 | [diff] [blame] | 161 | s.clusternet = &workerClusternet{ |
| 162 | storageRoot: s.StorageRoot, |
| 163 | |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 164 | curatorConnection: &s.CuratorConnection, |
| Lorenz Brun | c607bf6 | 2025-07-22 20:25:26 +0200 | [diff] [blame^] | 165 | podNetwork: s.Config.PodNetwork, |
| Serge Bazanski | b565cc6 | 2023-03-30 18:43:51 +0200 | [diff] [blame] | 166 | network: s.Network, |
| Serge Bazanski | 7920852 | 2023-03-28 20:14:58 +0200 | [diff] [blame] | 167 | } |
| Serge Bazanski | b40c008 | 2023-03-29 14:28:04 +0200 | [diff] [blame] | 168 | |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 169 | s.hostsfile = &workerHostsfile{ |
| 170 | storageRoot: s.StorageRoot, |
| 171 | network: s.Network, |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 172 | curatorConnection: &s.CuratorConnection, |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 173 | clusterDirectorySaved: &s.clusterDirectorySaved, |
| 174 | } |
| 175 | |
| Serge Bazanski | 54e212a | 2023-06-14 13:45:11 +0200 | [diff] [blame] | 176 | s.metrics = &workerMetrics{ |
| 177 | curatorConnection: &s.CuratorConnection, |
| Serge Bazanski | b2d6c33 | 2024-09-03 12:18:24 +0200 | [diff] [blame] | 178 | localRoles: &s.LocalRoles, |
| Tim Windelschmidt | fd49f22 | 2023-07-20 14:27:50 +0200 | [diff] [blame] | 179 | localControlplane: &s.localControlPlane, |
| Serge Bazanski | 54e212a | 2023-06-14 13:45:11 +0200 | [diff] [blame] | 180 | } |
| 181 | |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 182 | return s |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 183 | } |
| 184 | |
| Serge Bazanski | 11198c8 | 2024-05-22 14:11:01 +0200 | [diff] [blame] | 185 | // BootstrapData contains all the information needed to be injected into the |
| 186 | // roleserver by the cluster bootstrap logic via ProvideBootstrapData. |
| 187 | type BootstrapData struct { |
| 188 | // Data about the bootstrapping node. |
| 189 | Node struct { |
| Jan Schär | 39d9c24 | 2024-09-24 13:49:55 +0200 | [diff] [blame] | 190 | ID string |
| Serge Bazanski | 11198c8 | 2024-05-22 14:11:01 +0200 | [diff] [blame] | 191 | PrivateKey ed25519.PrivateKey |
| 192 | |
| 193 | // CUK/NUK for storage, if storage encryption is enabled. |
| 194 | ClusterUnlockKey []byte |
| 195 | NodeUnlockKey []byte |
| 196 | |
| 197 | // Join key for subsequent reboots. |
| 198 | JoinKey ed25519.PrivateKey |
| 199 | |
| 200 | // Reported TPM usage by the node. |
| 201 | TPMUsage cpb.NodeTPMUsage |
| 202 | |
| 203 | // Initial labels for the node. |
| 204 | Labels map[string]string |
| 205 | } |
| 206 | // Cluster-specific data. |
| 207 | Cluster struct { |
| 208 | // Public keys of initial owner of cluster. Used to escrow real user credentials |
| 209 | // during the takeownership metroctl process. |
| 210 | InitialOwnerKey []byte |
| 211 | // Initial cluster configuration. |
| 212 | Configuration *curator.Cluster |
| 213 | } |
| 214 | } |
| 215 | |
| 216 | func (s *Service) ProvideBootstrapData(data *BootstrapData) { |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 217 | // This is the first time we have the node ID, tell the resolver that it's |
| 218 | // available on the loopback interface. |
| Jan Schär | 39d9c24 | 2024-09-24 13:49:55 +0200 | [diff] [blame] | 219 | s.Resolver.AddOverride(data.Node.ID, resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort))) |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 220 | s.Resolver.AddEndpoint(resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort))) |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 221 | |
| Serge Bazanski | 11198c8 | 2024-05-22 14:11:01 +0200 | [diff] [blame] | 222 | s.bootstrapData.Set(data) |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 223 | } |
| 224 | |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 225 | func (s *Service) ProvideRegisterData(credentials identity.NodeCredentials, directory *cpb.ClusterDirectory) { |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 226 | // This is the first time we have the node ID, tell the resolver that it's |
| 227 | // available on the loopback interface. |
| Serge Bazanski | 58ddc09 | 2022-06-30 18:23:33 +0200 | [diff] [blame] | 228 | s.Resolver.AddOverride(credentials.ID(), resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort))) |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 229 | // Also tell the resolver about all the existing nodes in the cluster we just |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 230 | // registered into. The directory passed here was used to issue the initial |
| 231 | // Register call, which means at least one of the nodes was running the control |
| 232 | // plane and thus can be used to seed the rest of the resolver. |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 233 | for _, n := range directory.Nodes { |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 234 | for _, addr := range n.Addresses { |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 235 | s.Resolver.AddEndpoint(resolver.NodeAtAddressWithDefaultPort(addr.Host)) |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 236 | } |
| 237 | } |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 238 | |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 239 | s.CuratorConnection.Set(newCuratorConnection(&credentials, s.Resolver)) |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 240 | } |
| 241 | |
| Mateusz Zalega | 2930e99 | 2022-04-25 12:52:35 +0200 | [diff] [blame] | 242 | func (s *Service) ProvideJoinData(credentials identity.NodeCredentials, directory *cpb.ClusterDirectory) { |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 243 | // This is the first time we have the node ID, tell the resolver that it's |
| 244 | // available on the loopback interface. |
| Serge Bazanski | 58ddc09 | 2022-06-30 18:23:33 +0200 | [diff] [blame] | 245 | s.Resolver.AddOverride(credentials.ID(), resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort))) |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 246 | // Also tell the resolver about all the existing nodes in the cluster we just |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 247 | // joined into. The directory passed here was used to issue the initial |
| 248 | // Join call, which means at least one of the nodes was running the control |
| 249 | // plane and thus can be used to seed the rest of the resolver. |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 250 | for _, n := range directory.Nodes { |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 251 | for _, addr := range n.Addresses { |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 252 | s.Resolver.AddEndpoint(resolver.NodeAtAddressWithDefaultPort(addr.Host)) |
| Serge Bazanski | 90a70a0 | 2023-05-30 15:15:27 +0200 | [diff] [blame] | 253 | } |
| 254 | } |
| Serge Bazanski | b43d0f0 | 2022-06-23 17:32:10 +0200 | [diff] [blame] | 255 | |
| Serge Bazanski | fe3d8fd | 2023-05-30 20:50:09 +0200 | [diff] [blame] | 256 | s.CuratorConnection.Set(newCuratorConnection(&credentials, s.Resolver)) |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 257 | s.clusterDirectorySaved.Set(true) |
| Mateusz Zalega | 2930e99 | 2022-04-25 12:52:35 +0200 | [diff] [blame] | 258 | } |
| 259 | |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 260 | // Run the Role Server service, which uses intermediary workload launchers to |
| 261 | // start/stop subordinate services as the Node's roles change. |
| 262 | func (s *Service) Run(ctx context.Context) error { |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 263 | supervisor.Run(ctx, "controlplane", s.controlPlane.run) |
| 264 | supervisor.Run(ctx, "kubernetes", s.kubernetes.run) |
| 265 | supervisor.Run(ctx, "statuspush", s.statusPush.run) |
| Mateusz Zalega | 32b1929 | 2022-05-17 13:26:55 +0200 | [diff] [blame] | 266 | supervisor.Run(ctx, "heartbeat", s.heartbeat.run) |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 267 | supervisor.Run(ctx, "rolefetch", s.rolefetch.run) |
| Serge Bazanski | b40c008 | 2023-03-29 14:28:04 +0200 | [diff] [blame] | 268 | supervisor.Run(ctx, "nodemgmt", s.nodeMgmt.run) |
| Serge Bazanski | 7920852 | 2023-03-28 20:14:58 +0200 | [diff] [blame] | 269 | supervisor.Run(ctx, "clusternet", s.clusternet.run) |
| Serge Bazanski | 1fb2b10 | 2023-04-06 10:13:46 +0200 | [diff] [blame] | 270 | supervisor.Run(ctx, "hostsfile", s.hostsfile.run) |
| Serge Bazanski | 54e212a | 2023-06-14 13:45:11 +0200 | [diff] [blame] | 271 | supervisor.Run(ctx, "metrics", s.metrics.run) |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 272 | supervisor.Signal(ctx, supervisor.SignalHealthy) |
| 273 | |
| Serge Bazanski | 6dff6d6 | 2022-01-28 18:15:14 +0100 | [diff] [blame] | 274 | <-ctx.Done() |
| 275 | return ctx.Err() |
| Serge Bazanski | 0d93777 | 2021-06-17 15:54:40 +0200 | [diff] [blame] | 276 | } |