mirror of https://github.com/k3s-io/k3s
Merge pull request #46323 from marun/fed-kubefed-beta-storage-class-annotation
Automatic merge from submit-queue (batch tested with PRs 46686, 45049, 46323, 45708, 46487) [Federation][kubefed]: Use StorageClassName for etcd pvc This PR updates kubefed to use the StorageClassName field [added in 1.6](http://blog.kubernetes.io/2017/03/dynamic-provisioning-and-storage-classes-kubernetes.html ) for etcd's pvc to allow the user to specify which storage class they want to use. If no value is provided to ``kubefed init``, the field will not be set, and initialization of the pvc may fail on a cluster without a default storage class configured. The alpha annotation that was previously used (``volume.alpha.kubernetes.io/storage-class``) was deprecated as of 1.4 according to the following blog post: http://blog.kubernetes.io/2016/10/dynamic-provisioning-and-storage-in-kubernetes.html **Release note**: ``` 'kubefed init' has been updated to support specification of the storage class (via --etcd-pv-storage-class) for the Persistent Volume Claim (PVC) used for etcd storage. If --etcd-pv-storage-class is not specified, the default storage class configured for the cluster will be used. ``` cc: @kubernetes/sig-federation-pr-reviewspull/6/head
commit
3e1d68624e
|
@ -139,6 +139,7 @@ type initFederationOptions struct {
|
||||||
dnsProviderConfig string
|
dnsProviderConfig string
|
||||||
etcdImage string
|
etcdImage string
|
||||||
etcdPVCapacity string
|
etcdPVCapacity string
|
||||||
|
etcdPVStorageClass string
|
||||||
etcdPersistentStorage bool
|
etcdPersistentStorage bool
|
||||||
dryRun bool
|
dryRun bool
|
||||||
apiServerOverridesString string
|
apiServerOverridesString string
|
||||||
|
@ -159,6 +160,7 @@ func (o *initFederationOptions) Bind(flags *pflag.FlagSet, defaultServerImage, d
|
||||||
flags.StringVar(&o.dnsProviderConfig, "dns-provider-config", "", "Config file path on local file system for configuring DNS provider.")
|
flags.StringVar(&o.dnsProviderConfig, "dns-provider-config", "", "Config file path on local file system for configuring DNS provider.")
|
||||||
flags.StringVar(&o.etcdImage, "etcd-image", defaultEtcdImage, "Image to use for etcd server.")
|
flags.StringVar(&o.etcdImage, "etcd-image", defaultEtcdImage, "Image to use for etcd server.")
|
||||||
flags.StringVar(&o.etcdPVCapacity, "etcd-pv-capacity", "10Gi", "Size of persistent volume claim to be used for etcd.")
|
flags.StringVar(&o.etcdPVCapacity, "etcd-pv-capacity", "10Gi", "Size of persistent volume claim to be used for etcd.")
|
||||||
|
flags.StringVar(&o.etcdPVStorageClass, "etcd-pv-storage-class", "", "The storage class of the persistent volume claim used for etcd. Must be provided if a default storage class is not enabled for the host cluster.")
|
||||||
flags.BoolVar(&o.etcdPersistentStorage, "etcd-persistent-storage", true, "Use persistent volume for etcd. Defaults to 'true'.")
|
flags.BoolVar(&o.etcdPersistentStorage, "etcd-persistent-storage", true, "Use persistent volume for etcd. Defaults to 'true'.")
|
||||||
flags.BoolVar(&o.dryRun, "dry-run", false, "dry run without sending commands to server.")
|
flags.BoolVar(&o.dryRun, "dry-run", false, "dry run without sending commands to server.")
|
||||||
flags.StringVar(&o.apiServerOverridesString, "apiserver-arg-overrides", "", "comma separated list of federation-apiserver arguments to override: Example \"--arg1=value1,--arg2=value2...\"")
|
flags.StringVar(&o.apiServerOverridesString, "apiserver-arg-overrides", "", "comma separated list of federation-apiserver arguments to override: Example \"--arg1=value1,--arg2=value2...\"")
|
||||||
|
@ -325,7 +327,7 @@ func (i *initFederation) Run(cmdOut io.Writer, config util.AdminConfig) error {
|
||||||
glog.V(4).Info("Creating a persistent volume and a claim to store the federation API server's state, including etcd data")
|
glog.V(4).Info("Creating a persistent volume and a claim to store the federation API server's state, including etcd data")
|
||||||
var pvc *api.PersistentVolumeClaim
|
var pvc *api.PersistentVolumeClaim
|
||||||
if i.options.etcdPersistentStorage {
|
if i.options.etcdPersistentStorage {
|
||||||
pvc, err = createPVC(hostClientset, i.commonOptions.FederationSystemNamespace, svc.Name, i.commonOptions.Name, i.options.etcdPVCapacity, i.options.dryRun)
|
pvc, err = createPVC(hostClientset, i.commonOptions.FederationSystemNamespace, svc.Name, i.commonOptions.Name, i.options.etcdPVCapacity, i.options.etcdPVStorageClass, i.options.dryRun)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -638,20 +640,25 @@ func createControllerManagerKubeconfigSecret(clientset client.Interface, namespa
|
||||||
return util.CreateKubeconfigSecret(clientset, config, namespace, kubeconfigName, name, "", dryRun)
|
return util.CreateKubeconfigSecret(clientset, config, namespace, kubeconfigName, name, "", dryRun)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createPVC(clientset client.Interface, namespace, svcName, federationName, etcdPVCapacity string, dryRun bool) (*api.PersistentVolumeClaim, error) {
|
func createPVC(clientset client.Interface, namespace, svcName, federationName, etcdPVCapacity, etcdPVStorageClass string, dryRun bool) (*api.PersistentVolumeClaim, error) {
|
||||||
capacity, err := resource.ParseQuantity(etcdPVCapacity)
|
capacity, err := resource.ParseQuantity(etcdPVCapacity)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var storageClassName *string
|
||||||
|
if len(etcdPVStorageClass) > 0 {
|
||||||
|
storageClassName = &etcdPVStorageClass
|
||||||
|
}
|
||||||
|
|
||||||
pvc := &api.PersistentVolumeClaim{
|
pvc := &api.PersistentVolumeClaim{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: fmt.Sprintf("%s-etcd-claim", svcName),
|
Name: fmt.Sprintf("%s-etcd-claim", svcName),
|
||||||
Namespace: namespace,
|
Namespace: namespace,
|
||||||
Labels: componentLabel,
|
Labels: componentLabel,
|
||||||
Annotations: map[string]string{
|
Annotations: map[string]string{
|
||||||
"volume.alpha.kubernetes.io/storage-class": "yes",
|
federation.FederationNameAnnotation: federationName,
|
||||||
federation.FederationNameAnnotation: federationName},
|
},
|
||||||
},
|
},
|
||||||
Spec: api.PersistentVolumeClaimSpec{
|
Spec: api.PersistentVolumeClaimSpec{
|
||||||
AccessModes: []api.PersistentVolumeAccessMode{
|
AccessModes: []api.PersistentVolumeAccessMode{
|
||||||
|
@ -662,6 +669,7 @@ func createPVC(clientset client.Interface, namespace, svcName, federationName, e
|
||||||
api.ResourceStorage: capacity,
|
api.ResourceStorage: capacity,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
StorageClassName: storageClassName,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,7 @@ func TestInitFederation(t *testing.T) {
|
||||||
serverImage string
|
serverImage string
|
||||||
etcdImage string
|
etcdImage string
|
||||||
etcdPVCapacity string
|
etcdPVCapacity string
|
||||||
|
etcdPVStorageClass string
|
||||||
etcdPersistence string
|
etcdPersistence string
|
||||||
expectedErr string
|
expectedErr string
|
||||||
dnsProvider string
|
dnsProvider string
|
||||||
|
@ -200,6 +201,7 @@ func TestInitFederation(t *testing.T) {
|
||||||
serverImage: "example.test/foo:bar",
|
serverImage: "example.test/foo:bar",
|
||||||
etcdImage: "gcr.io/google_containers/etcd:latest",
|
etcdImage: "gcr.io/google_containers/etcd:latest",
|
||||||
etcdPVCapacity: "5Gi",
|
etcdPVCapacity: "5Gi",
|
||||||
|
etcdPVStorageClass: "fast",
|
||||||
etcdPersistence: "true",
|
etcdPersistence: "true",
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
dryRun: "",
|
dryRun: "",
|
||||||
|
@ -244,7 +246,7 @@ func TestInitFederation(t *testing.T) {
|
||||||
tc.etcdImage = defaultEtcdImage
|
tc.etcdImage = defaultEtcdImage
|
||||||
}
|
}
|
||||||
|
|
||||||
hostFactory, err := fakeInitHostFactory(tc.apiserverServiceType, tc.federation, util.DefaultFederationSystemNamespace, tc.advertiseAddress, tc.lbIP, tc.dnsZoneName, tc.serverImage, tc.etcdImage, tc.dnsProvider, tc.dnsProviderConfig, tc.etcdPersistence, tc.etcdPVCapacity, tc.apiserverArgOverrides, tc.cmArgOverrides, tmpDirPath, tc.apiserverEnableHTTPBasicAuth, tc.apiserverEnableTokenAuth, tc.isRBACAPIAvailable)
|
hostFactory, err := fakeInitHostFactory(tc.apiserverServiceType, tc.federation, util.DefaultFederationSystemNamespace, tc.advertiseAddress, tc.lbIP, tc.dnsZoneName, tc.serverImage, tc.etcdImage, tc.dnsProvider, tc.dnsProviderConfig, tc.etcdPersistence, tc.etcdPVCapacity, tc.etcdPVStorageClass, tc.apiserverArgOverrides, tc.cmArgOverrides, tmpDirPath, tc.apiserverEnableHTTPBasicAuth, tc.apiserverEnableTokenAuth, tc.isRBACAPIAvailable)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("[%d] unexpected error: %v", i, err)
|
t.Fatalf("[%d] unexpected error: %v", i, err)
|
||||||
}
|
}
|
||||||
|
@ -271,6 +273,9 @@ func TestInitFederation(t *testing.T) {
|
||||||
if tc.etcdPVCapacity != "" {
|
if tc.etcdPVCapacity != "" {
|
||||||
cmd.Flags().Set("etcd-pv-capacity", tc.etcdPVCapacity)
|
cmd.Flags().Set("etcd-pv-capacity", tc.etcdPVCapacity)
|
||||||
}
|
}
|
||||||
|
if tc.etcdPVStorageClass != "" {
|
||||||
|
cmd.Flags().Set("etcd-pv-storage-class", tc.etcdPVStorageClass)
|
||||||
|
}
|
||||||
if tc.etcdPersistence != "true" {
|
if tc.etcdPersistence != "true" {
|
||||||
cmd.Flags().Set("etcd-persistent-storage", tc.etcdPersistence)
|
cmd.Flags().Set("etcd-persistent-storage", tc.etcdPersistence)
|
||||||
}
|
}
|
||||||
|
@ -616,7 +621,7 @@ func TestCertsHTTPS(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, namespaceName, advertiseAddress, lbIp, dnsZoneName, serverImage, etcdImage, dnsProvider, dnsProviderConfig, etcdPersistence, etcdPVCapacity, apiserverOverrideArg, cmOverrideArg, tmpDirPath string, apiserverEnableHTTPBasicAuth, apiserverEnableTokenAuth, isRBACAPIAvailable bool) (cmdutil.Factory, error) {
|
func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, namespaceName, advertiseAddress, lbIp, dnsZoneName, serverImage, etcdImage, dnsProvider, dnsProviderConfig, etcdPersistence, etcdPVCapacity, etcdPVStorageClass, apiserverOverrideArg, cmOverrideArg, tmpDirPath string, apiserverEnableHTTPBasicAuth, apiserverEnableTokenAuth, isRBACAPIAvailable bool) (cmdutil.Factory, error) {
|
||||||
svcName := federationName + "-apiserver"
|
svcName := federationName + "-apiserver"
|
||||||
svcUrlPrefix := "/api/v1/namespaces/federation-system/services"
|
svcUrlPrefix := "/api/v1/namespaces/federation-system/services"
|
||||||
credSecretName := svcName + "-credentials"
|
credSecretName := svcName + "-credentials"
|
||||||
|
@ -729,6 +734,11 @@ func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, na
|
||||||
Data: nil,
|
Data: nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var storageClassName *string
|
||||||
|
if len(etcdPVStorageClass) > 0 {
|
||||||
|
storageClassName = &etcdPVStorageClass
|
||||||
|
}
|
||||||
|
|
||||||
pvc := v1.PersistentVolumeClaim{
|
pvc := v1.PersistentVolumeClaim{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
Kind: "PersistentVolumeClaim",
|
Kind: "PersistentVolumeClaim",
|
||||||
|
@ -739,7 +749,6 @@ func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, na
|
||||||
Namespace: namespaceName,
|
Namespace: namespaceName,
|
||||||
Labels: componentLabel,
|
Labels: componentLabel,
|
||||||
Annotations: map[string]string{
|
Annotations: map[string]string{
|
||||||
"volume.alpha.kubernetes.io/storage-class": "yes",
|
|
||||||
federation.FederationNameAnnotation: federationName,
|
federation.FederationNameAnnotation: federationName,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -752,6 +761,7 @@ func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, na
|
||||||
v1.ResourceStorage: capacity,
|
v1.ResourceStorage: capacity,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
StorageClassName: storageClassName,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,6 +216,7 @@ etcd-mutation-timeout
|
||||||
etcd-persistent-storage
|
etcd-persistent-storage
|
||||||
etcd-prefix
|
etcd-prefix
|
||||||
etcd-pv-capacity
|
etcd-pv-capacity
|
||||||
|
etcd-pv-storage-class
|
||||||
etcd-quorum-read
|
etcd-quorum-read
|
||||||
etcd-server
|
etcd-server
|
||||||
etcd-servers
|
etcd-servers
|
||||||
|
|
Loading…
Reference in New Issue