mirror of https://github.com/kubernetes/kops.git
hetzner: Set default image to `ubuntu-20.04`
This commit is contained in:
parent
99d4ed8468
commit
a4ea992bbf
|
@ -1,6 +1,5 @@
|
||||||
CloudProvider: hetzner
|
CloudProvider: hetzner
|
||||||
ClusterName: ha.example.com
|
ClusterName: ha.example.com
|
||||||
Image: ubuntu-20.04
|
|
||||||
KubernetesVersion: v1.25.0
|
KubernetesVersion: v1.25.0
|
||||||
ControlPlaneCount: 3
|
ControlPlaneCount: 3
|
||||||
NetworkCIDR: 10.0.0.0/16
|
NetworkCIDR: 10.0.0.0/16
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
CloudProvider: hetzner
|
CloudProvider: hetzner
|
||||||
ClusterName: minimal.k8s.local
|
ClusterName: minimal.k8s.local
|
||||||
Image: ubuntu-20.04
|
|
||||||
KubernetesVersion: v1.25.0
|
KubernetesVersion: v1.25.0
|
||||||
NetworkCIDR: 10.0.0.0/16
|
NetworkCIDR: 10.0.0.0/16
|
||||||
Networking: cni
|
Networking: cni
|
||||||
|
|
|
@ -444,7 +444,10 @@ func NewCluster(opt *NewClusterOptions, clientset simple.Clientset) (*NewCluster
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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
|
// 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 {
|
if channel != nil {
|
||||||
var kubernetesVersion *semver.Version
|
var kubernetesVersion *semver.Version
|
||||||
if cluster.Spec.KubernetesVersion != "" {
|
if cluster.Spec.KubernetesVersion != "" {
|
||||||
var err error
|
var err error
|
||||||
kubernetesVersion, err = util.ParseKubernetesVersion(cluster.Spec.KubernetesVersion)
|
kubernetesVersion, err = util.ParseKubernetesVersion(cluster.Spec.KubernetesVersion)
|
||||||
if err != nil {
|
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)
|
image := channel.FindImage(cluster.Spec.GetCloudProvider(), *kubernetesVersion, architecture)
|
||||||
if image != nil {
|
if image != nil {
|
||||||
return image.Name
|
return image.Name, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch cluster.Spec.GetCloudProvider() {
|
switch cluster.Spec.GetCloudProvider() {
|
||||||
case api.CloudProviderDO:
|
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) {
|
func MachineArchitecture(cloud fi.Cloud, machineType string) (architectures.Architecture, error) {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import (
|
||||||
api "k8s.io/kops/pkg/apis/kops"
|
api "k8s.io/kops/pkg/apis/kops"
|
||||||
"k8s.io/kops/pkg/diff"
|
"k8s.io/kops/pkg/diff"
|
||||||
"k8s.io/kops/upup/pkg/fi"
|
"k8s.io/kops/upup/pkg/fi"
|
||||||
|
"k8s.io/kops/util/pkg/architectures"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRemoveSharedPrefix(t *testing.T) {
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -50,7 +50,9 @@ const (
|
||||||
defaultMasterMachineTypeAzure = "Standard_B2s"
|
defaultMasterMachineTypeAzure = "Standard_B2s"
|
||||||
defaultMasterMachineTypeHetzner = "cx21"
|
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
|
// 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 {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to determine machine architecture for InstanceGroup %q: %v", ig.ObjectMeta.Name, err)
|
return nil, fmt.Errorf("unable to determine machine architecture for InstanceGroup %q: %v", ig.ObjectMeta.Name, err)
|
||||||
}
|
}
|
||||||
ig.Spec.Image = defaultImage(cluster, channel, architecture)
|
ig.Spec.Image, err = defaultImage(cluster, channel, architecture)
|
||||||
if ig.Spec.Image == "" {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to determine default image for InstanceGroup %s", ig.ObjectMeta.Name)
|
return nil, fmt.Errorf("unable to determine default image for instance group %q: %v", ig.ObjectMeta.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue