support to set etcd pvc

Signed-off-by: calvin <wen.chen@daocloud.io>
This commit is contained in:
calvin 2023-04-27 18:41:30 +08:00
parent 64d88459bb
commit c7741aa20b
5 changed files with 76 additions and 9 deletions

View File

@ -11,7 +11,18 @@ spec:
imageTag: 3.5.3-0 imageTag: 3.5.3-0
replicas: 1 replicas: 1
volumeData: volumeData:
emptyDir: {} # hostPath:
# type: DirectoryOrCreate
# path: /var/lib/karmada/etcd/karmada-demo
volumeClaim:
metadata:
name: etcd-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
karmadaAPIServer: karmadaAPIServer:
imageRepository: registry.k8s.io/kube-apiserver imageRepository: registry.k8s.io/kube-apiserver
imageTag: v1.25.4 imageTag: v1.25.4

View File

@ -56,6 +56,8 @@ const (
EtcdListenPeerPort = 2380 EtcdListenPeerPort = 2380
// KarmadaAPIserverListenClientPort defines the port karmada apiserver listen on for client traffic // KarmadaAPIserverListenClientPort defines the port karmada apiserver listen on for client traffic
KarmadaAPIserverListenClientPort = 5443 KarmadaAPIserverListenClientPort = 5443
// EtcdDataVolumeName defines the name to etcd data volume
EtcdDataVolumeName = "etcd-data"
// CertificateValidity Certificate validity period // CertificateValidity Certificate validity period
CertificateValidity = time.Hour * 24 * 365 CertificateValidity = time.Hour * 24 * 365

View File

@ -45,10 +45,10 @@ func installKarmadaEtcd(client clientset.Interface, name, namespace string, cfg
} }
etcdStatefuleSetBytes, err := util.ParseTemplate(KarmadaEtcdStatefulSet, struct { etcdStatefuleSetBytes, err := util.ParseTemplate(KarmadaEtcdStatefulSet, struct {
StatefulSetName, Namespace, Image string StatefulSetName, Namespace, Image, EtcdClientService string
EtcdClientService, CertsSecretName string CertsSecretName, EtcdPeerServiceName string
EtcdPeerServiceName, InitialCluster string InitialCluster, EtcdDataVolumeName string
Replicas, EtcdListenClientPort, EtcdListenPeerPort int32 Replicas, EtcdListenClientPort, EtcdListenPeerPort int32
}{ }{
StatefulSetName: util.KarmadaEtcdName(name), StatefulSetName: util.KarmadaEtcdName(name),
Namespace: namespace, Namespace: namespace,
@ -56,6 +56,7 @@ func installKarmadaEtcd(client clientset.Interface, name, namespace string, cfg
EtcdClientService: util.KarmadaEtcdClientName(name), EtcdClientService: util.KarmadaEtcdClientName(name),
CertsSecretName: util.EtcdCertSecretName(name), CertsSecretName: util.EtcdCertSecretName(name),
EtcdPeerServiceName: util.KarmadaEtcdName(name), EtcdPeerServiceName: util.KarmadaEtcdName(name),
EtcdDataVolumeName: constants.EtcdDataVolumeName,
InitialCluster: strings.Join(initialClusters, ","), InitialCluster: strings.Join(initialClusters, ","),
Replicas: *cfg.Replicas, Replicas: *cfg.Replicas,
EtcdListenClientPort: constants.EtcdListenClientPort, EtcdListenClientPort: constants.EtcdListenClientPort,
@ -70,7 +71,8 @@ func installKarmadaEtcd(client clientset.Interface, name, namespace string, cfg
return fmt.Errorf("error when decoding Etcd StatefulSet: %w", err) return fmt.Errorf("error when decoding Etcd StatefulSet: %w", err)
} }
patcher.NewPatcher().WithAnnotations(cfg.Annotations).WithLabels(cfg.Labels).ForStatefulSet(etcdStatefulSet) patcher.NewPatcher().WithAnnotations(cfg.Annotations).WithLabels(cfg.Labels).
WithVolumeData(cfg.VolumeData).ForStatefulSet(etcdStatefulSet)
if err := apiclient.CreateOrUpdateStatefulSet(client, etcdStatefulSet); err != nil { if err := apiclient.CreateOrUpdateStatefulSet(client, etcdStatefulSet); err != nil {
return fmt.Errorf("error when creating Etcd statefulset, err: %w", err) return fmt.Errorf("error when creating Etcd statefulset, err: %w", err)

View File

@ -71,15 +71,13 @@ spec:
protocol: TCP protocol: TCP
volumeMounts: volumeMounts:
- mountPath: /var/lib/etcd - mountPath: /var/lib/etcd
name: etcd-data name: {{ .EtcdDataVolumeName }}
- mountPath: /etc/karmada/pki/etcd - mountPath: /etc/karmada/pki/etcd
name: etcd-cert name: etcd-cert
volumes: volumes:
- name: etcd-cert - name: etcd-cert
secret: secret:
secretName: {{ .CertsSecretName }} secretName: {{ .CertsSecretName }}
- name: etcd-data
emptyDir: {}
` `
// KarmadaEtcdClientService is karmada etcd client service manifest // KarmadaEtcdClientService is karmada etcd client service manifest

View File

@ -2,13 +2,19 @@ package patcher
import ( import (
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
operatorv1alpha1 "github.com/karmada-io/karmada/operator/pkg/apis/operator/v1alpha1"
"github.com/karmada-io/karmada/operator/pkg/constants"
) )
// Patcher defines multiple variables that need to be patched. // Patcher defines multiple variables that need to be patched.
type Patcher struct { type Patcher struct {
labels map[string]string labels map[string]string
annotations map[string]string annotations map[string]string
volume *operatorv1alpha1.VolumeData
} }
// NewPatcher returns a patcher. // NewPatcher returns a patcher.
@ -28,6 +34,12 @@ func (p *Patcher) WithAnnotations(annotations labels.Set) *Patcher {
return p return p
} }
// WithVolumeData sets VolumeData to the patcher.
func (p *Patcher) WithVolumeData(volume *operatorv1alpha1.VolumeData) *Patcher {
p.volume = volume
return p
}
// ForDeployment patches the deployment manifest. // ForDeployment patches the deployment manifest.
func (p *Patcher) ForDeployment(deployment *appsv1.Deployment) { func (p *Patcher) ForDeployment(deployment *appsv1.Deployment) {
deployment.Labels = labels.Merge(deployment.Labels, p.labels) deployment.Labels = labels.Merge(deployment.Labels, p.labels)
@ -44,4 +56,46 @@ func (p *Patcher) ForStatefulSet(sts *appsv1.StatefulSet) {
sts.Annotations = labels.Merge(sts.Annotations, p.annotations) sts.Annotations = labels.Merge(sts.Annotations, p.annotations)
sts.Spec.Template.Annotations = labels.Merge(sts.Spec.Template.Annotations, p.annotations) sts.Spec.Template.Annotations = labels.Merge(sts.Spec.Template.Annotations, p.annotations)
if p.volume != nil {
patchVolumeForStatefulSet(sts, p.volume)
}
}
func patchVolumeForStatefulSet(sts *appsv1.StatefulSet, volume *operatorv1alpha1.VolumeData) {
if volume.EmptyDir != nil {
volumes := sts.Spec.Template.Spec.Volumes
volumes = append(volumes, corev1.Volume{
Name: constants.EtcdDataVolumeName,
VolumeSource: corev1.VolumeSource{
EmptyDir: &corev1.EmptyDirVolumeSource{},
},
})
sts.Spec.Template.Spec.Volumes = volumes
}
if volume.HostPath != nil {
volumes := sts.Spec.Template.Spec.Volumes
volumes = append(volumes, corev1.Volume{
Name: constants.EtcdDataVolumeName,
VolumeSource: corev1.VolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: volume.HostPath.Path,
Type: volume.HostPath.Type,
},
},
})
sts.Spec.Template.Spec.Volumes = volumes
}
if volume.VolumeClaim != nil {
sts.Spec.VolumeClaimTemplates = []corev1.PersistentVolumeClaim{
{
ObjectMeta: metav1.ObjectMeta{
Name: constants.EtcdDataVolumeName,
},
Spec: volume.VolumeClaim.Spec,
},
}
}
} }