hetzner: Set default image to `ubuntu-20.04`

This commit is contained in:
Ciprian Hacman 2022-11-24 10:18:08 +02:00
parent 99d4ed8468
commit a4ea992bbf
6 changed files with 193 additions and 14 deletions

View File

@ -1,6 +1,5 @@
CloudProvider: hetzner
ClusterName: ha.example.com
Image: ubuntu-20.04
KubernetesVersion: v1.25.0
ControlPlaneCount: 3
NetworkCIDR: 10.0.0.0/16

View File

@ -1,6 +1,5 @@
CloudProvider: hetzner
ClusterName: minimal.k8s.local
Image: ubuntu-20.04
KubernetesVersion: v1.25.0
NetworkCIDR: 10.0.0.0/16
Networking: cni

View File

@ -444,7 +444,10 @@ func NewCluster(opt *NewClusterOptions, clientset simple.Clientset) (*NewCluster
if err != nil {
return nil, err
}
instanceGroup.Spec.Image = defaultImage(&cluster, channel, architecture)
instanceGroup.Spec.Image, err = defaultImage(&cluster, channel, architecture)
if err != nil {
return nil, err
}
}
}
@ -1503,30 +1506,34 @@ func addCiliumNetwork(cluster *api.Cluster) {
}
// defaultImage returns the default Image, based on the cloudprovider
func defaultImage(cluster *api.Cluster, channel *api.Channel, architecture architectures.Architecture) string {
func defaultImage(cluster *api.Cluster, channel *api.Channel, architecture architectures.Architecture) (string, error) {
if channel != nil {
var kubernetesVersion *semver.Version
if cluster.Spec.KubernetesVersion != "" {
var err error
kubernetesVersion, err = util.ParseKubernetesVersion(cluster.Spec.KubernetesVersion)
if err != nil {
klog.Warningf("cannot parse KubernetesVersion %q in cluster", cluster.Spec.KubernetesVersion)
return "", fmt.Errorf("unable to parse kubernetes version %q", cluster.Spec.KubernetesVersion)
}
}
if kubernetesVersion != nil {
if channel != nil && kubernetesVersion != nil {
image := channel.FindImage(cluster.Spec.GetCloudProvider(), *kubernetesVersion, architecture)
if image != nil {
return image.Name
return image.Name, nil
}
}
}
switch cluster.Spec.GetCloudProvider() {
case api.CloudProviderDO:
return defaultDONodeImage
return defaultDOImage, nil
case api.CloudProviderHetzner:
return defaultHetznerImage, nil
case api.CloudProviderScaleway:
return defaultScalewayImage, nil
}
klog.Infof("Cannot set default Image for CloudProvider=%q", cluster.Spec.GetCloudProvider())
return ""
return "", fmt.Errorf("unable to determine default image for cloud provider %q and architecture %q", cluster.Spec.GetCloudProvider(), architecture)
}
func MachineArchitecture(cloud fi.Cloud, machineType string) (architectures.Architecture, error) {

View File

@ -26,6 +26,7 @@ import (
api "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/diff"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/util/pkg/architectures"
)
func TestRemoveSharedPrefix(t *testing.T) {
@ -334,3 +335,112 @@ func TestSetupNetworking(t *testing.T) {
}
}
}
func TestDefaultImage(t *testing.T) {
tests := []struct {
cluster *api.Cluster
architecture architectures.Architecture
expected string
}{
{
cluster: &api.Cluster{
Spec: api.ClusterSpec{
KubernetesVersion: "v1.25.0",
CloudProvider: api.CloudProviderSpec{
AWS: &api.AWSSpec{},
},
},
},
architecture: architectures.ArchitectureAmd64,
expected: "099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20221018",
},
{
cluster: &api.Cluster{
Spec: api.ClusterSpec{
KubernetesVersion: "v1.25.0",
CloudProvider: api.CloudProviderSpec{
AWS: &api.AWSSpec{},
},
},
},
architecture: architectures.ArchitectureArm64,
expected: "099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-arm64-server-20221018",
},
{
cluster: &api.Cluster{
Spec: api.ClusterSpec{
KubernetesVersion: "v1.25.0",
CloudProvider: api.CloudProviderSpec{
Azure: &api.AzureSpec{},
},
},
},
architecture: architectures.ArchitectureAmd64,
expected: "Canonical:0001-com-ubuntu-server-focal:20_04-lts-gen2:20.04.202210180",
},
{
cluster: &api.Cluster{
Spec: api.ClusterSpec{
KubernetesVersion: "v1.25.0",
CloudProvider: api.CloudProviderSpec{
GCE: &api.GCESpec{},
},
},
},
architecture: architectures.ArchitectureAmd64,
expected: "ubuntu-os-cloud/ubuntu-2004-focal-v20221018",
},
{
cluster: &api.Cluster{
Spec: api.ClusterSpec{
KubernetesVersion: "v1.25.0",
CloudProvider: api.CloudProviderSpec{
DO: &api.DOSpec{},
},
},
},
architecture: architectures.ArchitectureAmd64,
expected: defaultDOImage,
},
{
cluster: &api.Cluster{
Spec: api.ClusterSpec{
KubernetesVersion: "v1.25.0",
CloudProvider: api.CloudProviderSpec{
Hetzner: &api.HetznerSpec{},
},
},
},
architecture: architectures.ArchitectureAmd64,
expected: defaultHetznerImage,
},
{
cluster: &api.Cluster{
Spec: api.ClusterSpec{
KubernetesVersion: "v1.25.0",
CloudProvider: api.CloudProviderSpec{
Scaleway: &api.ScalewaySpec{},
},
},
},
architecture: architectures.ArchitectureAmd64,
expected: defaultScalewayImage,
},
}
channel, err := api.LoadChannel("file://tests/channels/channel.yaml")
if err != nil {
t.Fatalf("unable to load test channel: %v", err)
}
for _, test := range tests {
actual, err := defaultImage(test.cluster, channel, test.architecture)
if err != nil {
t.Error(err)
continue
}
if actual != test.expected {
t.Errorf("unexpected default image for cluster %s: expected=%q, actual=%q", fi.DebugAsJsonString(test.cluster.Spec), test.expected, actual)
}
}
}

View File

@ -50,7 +50,9 @@ const (
defaultMasterMachineTypeAzure = "Standard_B2s"
defaultMasterMachineTypeHetzner = "cx21"
defaultDONodeImage = "ubuntu-20-04-x64"
defaultDOImage = "ubuntu-20-04-x64"
defaultHetznerImage = "ubuntu-20.04"
defaultScalewayImage = "ubuntu_focal"
)
// TODO: this hardcoded list can be replaced with DescribeInstanceTypes' DedicatedHostsSupported field
@ -129,9 +131,9 @@ func PopulateInstanceGroupSpec(cluster *kops.Cluster, input *kops.InstanceGroup,
if err != nil {
return nil, fmt.Errorf("unable to determine machine architecture for InstanceGroup %q: %v", ig.ObjectMeta.Name, err)
}
ig.Spec.Image = defaultImage(cluster, channel, architecture)
if ig.Spec.Image == "" {
return nil, fmt.Errorf("unable to determine default image for InstanceGroup %s", ig.ObjectMeta.Name)
ig.Spec.Image, err = defaultImage(cluster, channel, architecture)
if err != nil {
return nil, fmt.Errorf("unable to determine default image for instance group %q: %v", ig.ObjectMeta.Name, err)
}
}

View File

@ -0,0 +1,62 @@
spec:
images:
- name: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20221018
providerID: aws
architectureID: amd64
kubernetesVersion: ">=1.18.0"
- name: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-arm64-server-20221018
providerID: aws
architectureID: arm64
kubernetesVersion: ">=1.20.0"
- name: ubuntu-os-cloud/ubuntu-2004-focal-v20221018
providerID: gce
architectureID: amd64
kubernetesVersion: ">=1.18.0"
- name: Canonical:0001-com-ubuntu-server-focal:20_04-lts-gen2:20.04.202210180
providerID: azure
architectureID: amd64
kubernetesVersion: ">=1.20.0"
kubernetesVersions:
- range: ">=1.25.0"
recommendedVersion: 1.25.4
requiredVersion: 1.25.0
- range: ">=1.24.0"
recommendedVersion: 1.24.8
requiredVersion: 1.24.0
- range: ">=1.23.0"
recommendedVersion: 1.23.14
requiredVersion: 1.23.0
- range: ">=1.22.0"
recommendedVersion: 1.22.16
requiredVersion: 1.22.0
- range: ">=1.21.0"
recommendedVersion: 1.21.14
requiredVersion: 1.21.0
- range: ">=1.20.0"
recommendedVersion: 1.20.15
requiredVersion: 1.20.0
kopsVersions:
- range: ">=1.25.0-alpha.1"
recommendedVersion: "1.25.2"
#requiredVersion: 1.25.0
kubernetesVersion: 1.25.4
- range: ">=1.24.0-alpha.1"
recommendedVersion: "1.25.2"
#requiredVersion: 1.24.0
kubernetesVersion: 1.24.8
- range: ">=1.23.0-alpha.1"
recommendedVersion: "1.25.2"
#requiredVersion: 1.23.0
kubernetesVersion: 1.23.14
- range: ">=1.22.0-alpha.1"
recommendedVersion: "1.25.2"
#requiredVersion: 1.22.0
kubernetesVersion: 1.22.16
- range: ">=1.21.0-alpha.1"
recommendedVersion: "1.25.2"
#requiredVersion: 1.21.0
kubernetesVersion: 1.21.14
- range: ">=1.20.0-alpha.1"
recommendedVersion: "1.25.2"
#requiredVersion: 1.20.0
kubernetesVersion: 1.20.15