mirror of
https://github.com/siderolabs/talos.git
synced 2025-09-13 18:01:10 +02:00
This PR solves problems: 1. You want to run controlplane from etcd-backup, and make changes/investigation and be sure that controlplane does no change resources. 2. Run controlplane in less memory only for quorum. Signed-off-by: Serge Logvinov <serge.logvinov@sinextra.dev> Co-authored-by: Andrey Smirnov <andrey.smirnov@talos-systems.com> Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
259 lines
8.2 KiB
Go
259 lines
8.2 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package config
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/cosi-project/runtime/pkg/resource"
|
|
"github.com/cosi-project/runtime/pkg/resource/meta"
|
|
)
|
|
|
|
// K8sControlPlaneType is type of K8sControlPlane resource.
|
|
const K8sControlPlaneType = resource.Type("KubernetesControlPlaneConfigs.config.talos.dev")
|
|
|
|
// K8sControlPlaneAPIServerID is an ID of kube-apiserver config.
|
|
const K8sControlPlaneAPIServerID = resource.ID("kube-apiserver")
|
|
|
|
// K8sControlPlaneControllerManagerID is an ID of kube-controller-manager config.
|
|
const K8sControlPlaneControllerManagerID = resource.ID("kube-controller-manager")
|
|
|
|
// K8sControlPlaneSchedulerID is an ID of kube-scheduler config.
|
|
const K8sControlPlaneSchedulerID = resource.ID("kube-scheduler")
|
|
|
|
// K8sManifestsID is an ID of manifests config.
|
|
const K8sManifestsID = resource.ID("system-manifests")
|
|
|
|
// K8sExtraManifestsID is an ID of extra manifests config.
|
|
const K8sExtraManifestsID = resource.ID("extra-manifests")
|
|
|
|
// K8sControlPlane describes machine type.
|
|
type K8sControlPlane struct {
|
|
md resource.Metadata
|
|
// spec stores values of different types depending on ID
|
|
spec interface{}
|
|
}
|
|
|
|
// K8sExtraVolume is a configuration of extra volume.
|
|
type K8sExtraVolume struct {
|
|
Name string `yaml:"name"`
|
|
HostPath string `yaml:"hostPath"`
|
|
MountPath string `yaml:"mountPath"`
|
|
ReadOnly bool `yaml:"readonly"`
|
|
}
|
|
|
|
// K8sControlPlaneAPIServerSpec is configuration for kube-apiserver.
|
|
type K8sControlPlaneAPIServerSpec struct {
|
|
Image string `yaml:"image"`
|
|
CloudProvider string `yaml:"cloudProvider"`
|
|
ControlPlaneEndpoint string `yaml:"controlPlaneEndpoint"`
|
|
EtcdServers []string `yaml:"etcdServers"`
|
|
LocalPort int `yaml:"localPort"`
|
|
ServiceCIDRs []string `yaml:"serviceCIDR"`
|
|
ExtraArgs map[string]string `yaml:"extraArgs"`
|
|
ExtraVolumes []K8sExtraVolume `yaml:"extraVolumes"`
|
|
PodSecurityPolicyEnabled bool `yaml:"podSecurityPolicyEnabled"`
|
|
}
|
|
|
|
// K8sControlPlaneControllerManagerSpec is configuration for kube-controller-manager.
|
|
type K8sControlPlaneControllerManagerSpec struct {
|
|
Enabled bool `yaml:"enabled"`
|
|
Image string `yaml:"image"`
|
|
CloudProvider string `yaml:"cloudProvider"`
|
|
PodCIDRs []string `yaml:"podCIDRs"`
|
|
ServiceCIDRs []string `yaml:"serviceCIDRs"`
|
|
ExtraArgs map[string]string `yaml:"extraArgs"`
|
|
ExtraVolumes []K8sExtraVolume `yaml:"extraVolumes"`
|
|
}
|
|
|
|
// K8sControlPlaneSchedulerSpec is configuration for kube-scheduler.
|
|
type K8sControlPlaneSchedulerSpec struct {
|
|
Enabled bool `yaml:"enabled"`
|
|
Image string `yaml:"image"`
|
|
ExtraArgs map[string]string `yaml:"extraArgs"`
|
|
ExtraVolumes []K8sExtraVolume `yaml:"extraVolumes"`
|
|
}
|
|
|
|
// K8sManifestsSpec is configuration for manifests.
|
|
//
|
|
//nolint:maligned
|
|
type K8sManifestsSpec struct {
|
|
Server string `yaml:"string"`
|
|
ClusterDomain string `yaml:"clusterDomain"`
|
|
|
|
PodCIDRs []string `yaml:"podCIDRs"`
|
|
|
|
ProxyEnabled bool `yaml:"proxyEnabled"`
|
|
ProxyImage string `yaml:"proxyImage"`
|
|
ProxyArgs []string `yaml:"proxyArgs"`
|
|
|
|
CoreDNSEnabled bool `yaml:"coreDNSEnabled"`
|
|
CoreDNSImage string `yaml:"coreDNSImage"`
|
|
|
|
DNSServiceIP string `yaml:"dnsServiceIP"`
|
|
DNSServiceIPv6 string `yaml:"dnsServiceIPv6"`
|
|
|
|
FlannelEnabled bool `yaml:"flannelEnabled"`
|
|
FlannelImage string `yaml:"flannelImage"`
|
|
FlannelCNIImage string `yaml:"flannelCNIImage"`
|
|
|
|
PodSecurityPolicyEnabled bool `yaml:"podSecurityPolicyEnabled"`
|
|
}
|
|
|
|
// ExtraManifest defines a single extra manifest to download.
|
|
type ExtraManifest struct {
|
|
Name string `yaml:"name"`
|
|
URL string `yaml:"url"`
|
|
Priority string `yaml:"priority"`
|
|
ExtraHeaders map[string]string `yaml:"extraHeaders"`
|
|
InlineManifest string `yaml:"inlineManifest"`
|
|
}
|
|
|
|
// K8sExtraManifestsSpec is a configuration for extra manifests.
|
|
type K8sExtraManifestsSpec struct {
|
|
ExtraManifests []ExtraManifest `yaml:"extraManifests"`
|
|
}
|
|
|
|
// NewK8sControlPlaneAPIServer initializes a K8sControlPlane resource.
|
|
func NewK8sControlPlaneAPIServer() *K8sControlPlane {
|
|
r := &K8sControlPlane{
|
|
md: resource.NewMetadata(NamespaceName, K8sControlPlaneType, K8sControlPlaneAPIServerID, resource.VersionUndefined),
|
|
spec: K8sControlPlaneAPIServerSpec{},
|
|
}
|
|
|
|
r.md.BumpVersion()
|
|
|
|
return r
|
|
}
|
|
|
|
// NewK8sControlPlaneControllerManager initializes a K8sControlPlane resource.
|
|
func NewK8sControlPlaneControllerManager() *K8sControlPlane {
|
|
r := &K8sControlPlane{
|
|
md: resource.NewMetadata(NamespaceName, K8sControlPlaneType, K8sControlPlaneControllerManagerID, resource.VersionUndefined),
|
|
spec: K8sControlPlaneControllerManagerSpec{Enabled: true},
|
|
}
|
|
|
|
r.md.BumpVersion()
|
|
|
|
return r
|
|
}
|
|
|
|
// NewK8sControlPlaneScheduler initializes a K8sControlPlane resource.
|
|
func NewK8sControlPlaneScheduler() *K8sControlPlane {
|
|
r := &K8sControlPlane{
|
|
md: resource.NewMetadata(NamespaceName, K8sControlPlaneType, K8sControlPlaneSchedulerID, resource.VersionUndefined),
|
|
spec: K8sControlPlaneSchedulerSpec{Enabled: true},
|
|
}
|
|
|
|
r.md.BumpVersion()
|
|
|
|
return r
|
|
}
|
|
|
|
// NewK8sManifests initializes a K8sControlPlane resource.
|
|
func NewK8sManifests() *K8sControlPlane {
|
|
r := &K8sControlPlane{
|
|
md: resource.NewMetadata(NamespaceName, K8sControlPlaneType, K8sManifestsID, resource.VersionUndefined),
|
|
spec: K8sManifestsSpec{},
|
|
}
|
|
|
|
r.md.BumpVersion()
|
|
|
|
return r
|
|
}
|
|
|
|
// NewK8sExtraManifests initializes a K8sControlPlane resource.
|
|
func NewK8sExtraManifests() *K8sControlPlane {
|
|
r := &K8sControlPlane{
|
|
md: resource.NewMetadata(NamespaceName, K8sControlPlaneType, K8sExtraManifestsID, resource.VersionUndefined),
|
|
spec: K8sExtraManifestsSpec{},
|
|
}
|
|
|
|
r.md.BumpVersion()
|
|
|
|
return r
|
|
}
|
|
|
|
// Metadata implements resource.Resource.
|
|
func (r *K8sControlPlane) Metadata() *resource.Metadata {
|
|
return &r.md
|
|
}
|
|
|
|
// Spec implements resource.Resource.
|
|
func (r *K8sControlPlane) Spec() interface{} {
|
|
return r.spec
|
|
}
|
|
|
|
func (r *K8sControlPlane) String() string {
|
|
return fmt.Sprintf("config.KubernetesControlPlaneConfig(%q)", r.md.ID())
|
|
}
|
|
|
|
// DeepCopy implements resource.Resource.
|
|
func (r *K8sControlPlane) DeepCopy() resource.Resource {
|
|
return &K8sControlPlane{
|
|
md: r.md,
|
|
spec: r.spec,
|
|
}
|
|
}
|
|
|
|
// ResourceDefinition implements meta.ResourceDefinitionProvider interface.
|
|
func (r *K8sControlPlane) ResourceDefinition() meta.ResourceDefinitionSpec {
|
|
return meta.ResourceDefinitionSpec{
|
|
Type: K8sControlPlaneType,
|
|
Aliases: []resource.Type{},
|
|
DefaultNamespace: NamespaceName,
|
|
}
|
|
}
|
|
|
|
// APIServer returns K8sControlPlaneApiServerSpec.
|
|
func (r *K8sControlPlane) APIServer() K8sControlPlaneAPIServerSpec {
|
|
return r.spec.(K8sControlPlaneAPIServerSpec)
|
|
}
|
|
|
|
// SetAPIServer sets K8sControlPlaneApiServerSpec.
|
|
func (r *K8sControlPlane) SetAPIServer(spec K8sControlPlaneAPIServerSpec) {
|
|
r.spec = spec
|
|
}
|
|
|
|
// ControllerManager returns K8sControlPlaneControllerManagerSpec.
|
|
func (r *K8sControlPlane) ControllerManager() K8sControlPlaneControllerManagerSpec {
|
|
return r.spec.(K8sControlPlaneControllerManagerSpec)
|
|
}
|
|
|
|
// SetControllerManager sets K8sControlPlaneControllerManagerSpec.
|
|
func (r *K8sControlPlane) SetControllerManager(spec K8sControlPlaneControllerManagerSpec) {
|
|
r.spec = spec
|
|
}
|
|
|
|
// Scheduler returns K8sControlPlaneSchedulerSpec.
|
|
func (r *K8sControlPlane) Scheduler() K8sControlPlaneSchedulerSpec {
|
|
return r.spec.(K8sControlPlaneSchedulerSpec)
|
|
}
|
|
|
|
// SetScheduler sets K8sControlPlaneSchedulerSpec.
|
|
func (r *K8sControlPlane) SetScheduler(spec K8sControlPlaneSchedulerSpec) {
|
|
r.spec = spec
|
|
}
|
|
|
|
// Manifests returns K8sManifestsSpec.
|
|
func (r *K8sControlPlane) Manifests() K8sManifestsSpec {
|
|
return r.spec.(K8sManifestsSpec)
|
|
}
|
|
|
|
// SetManifests sets K8sManifestsSpec.
|
|
func (r *K8sControlPlane) SetManifests(spec K8sManifestsSpec) {
|
|
r.spec = spec
|
|
}
|
|
|
|
// ExtraManifests returns K8sExtraManifestsSpec.
|
|
func (r *K8sControlPlane) ExtraManifests() K8sExtraManifestsSpec {
|
|
return r.spec.(K8sExtraManifestsSpec)
|
|
}
|
|
|
|
// SetExtraManifests sets K8sManifestsSpec.
|
|
func (r *K8sControlPlane) SetExtraManifests(spec K8sExtraManifestsSpec) {
|
|
r.spec = spec
|
|
}
|