mirror of https://github.com/kubernetes/kops.git
Add support for using an existing network for Hetzner
This commit is contained in:
parent
beebcf444b
commit
c783aa357d
|
|
@ -92,6 +92,7 @@ func ValidateCluster(c *kops.Cluster, strict bool) field.ErrorList {
|
||||||
allErrs = append(allErrs, field.Forbidden(fieldSpec.Child("hetzner"), "only one cloudProvider option permitted"))
|
allErrs = append(allErrs, field.Forbidden(fieldSpec.Child("hetzner"), "only one cloudProvider option permitted"))
|
||||||
}
|
}
|
||||||
optionTaken = true
|
optionTaken = true
|
||||||
|
requiresNetworkCIDR = false
|
||||||
requiresSubnets = false
|
requiresSubnets = false
|
||||||
requiresSubnetCIDR = false
|
requiresSubnetCIDR = false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,16 +34,21 @@ func (b *NetworkModelBuilder) Build(c *fi.ModelBuilderContext) error {
|
||||||
network := &hetznertasks.Network{
|
network := &hetznertasks.Network{
|
||||||
Name: fi.String(b.ClusterName()),
|
Name: fi.String(b.ClusterName()),
|
||||||
Lifecycle: b.Lifecycle,
|
Lifecycle: b.Lifecycle,
|
||||||
Region: b.Region,
|
|
||||||
IPRange: b.Cluster.Spec.NetworkCIDR,
|
|
||||||
// TODO(hakman): Add support for additional subnets?
|
|
||||||
Subnets: []string{
|
|
||||||
b.Cluster.Spec.NetworkCIDR,
|
|
||||||
},
|
|
||||||
Labels: map[string]string{
|
|
||||||
hetzner.TagKubernetesClusterName: b.ClusterName(),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if b.Cluster.Spec.NetworkID == "" {
|
||||||
|
network.IPRange = b.Cluster.Spec.NetworkCIDR
|
||||||
|
network.Region = b.Region
|
||||||
|
network.Subnets = []string{
|
||||||
|
b.Cluster.Spec.NetworkCIDR,
|
||||||
|
}
|
||||||
|
network.Labels = map[string]string{
|
||||||
|
hetzner.TagKubernetesClusterName: b.ClusterName(),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
network.ID = fi.String(b.Cluster.Spec.NetworkID)
|
||||||
|
}
|
||||||
|
|
||||||
c.AddTask(network)
|
c.AddTask(network)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ metadata:
|
||||||
name: hcloud
|
name: hcloud
|
||||||
namespace: kube-system
|
namespace: kube-system
|
||||||
stringData:
|
stringData:
|
||||||
token: {{ HCLOUD_TOKEN }}
|
token: "{{ HCLOUD_TOKEN }}"
|
||||||
network: {{ ClusterName }}
|
network: "{{ HCLOUD_NETWORK }}"
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ServiceAccount
|
kind: ServiceAccount
|
||||||
|
|
|
||||||
|
|
@ -199,6 +199,11 @@ func (_ *LoadBalancer) RenderHetzner(t *hetzner.HetznerAPITarget, a, e, changes
|
||||||
return fmt.Errorf("failed to find network for loadbalancer %q", fi.StringValue(e.Name))
|
return fmt.Errorf("failed to find network for loadbalancer %q", fi.StringValue(e.Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
networkID, err := strconv.Atoi(fi.StringValue(e.Network.ID))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to convert network ID %q to int: %w", fi.StringValue(e.Network.ID), err)
|
||||||
|
}
|
||||||
|
|
||||||
opts := hcloud.LoadBalancerCreateOpts{
|
opts := hcloud.LoadBalancerCreateOpts{
|
||||||
Name: fi.StringValue(e.Name),
|
Name: fi.StringValue(e.Name),
|
||||||
LoadBalancerType: &hcloud.LoadBalancerType{
|
LoadBalancerType: &hcloud.LoadBalancerType{
|
||||||
|
|
@ -221,7 +226,7 @@ func (_ *LoadBalancer) RenderHetzner(t *hetzner.HetznerAPITarget, a, e, changes
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Network: &hcloud.Network{
|
Network: &hcloud.Network{
|
||||||
ID: fi.IntValue(e.Network.ID),
|
ID: networkID,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ package hetznertasks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -34,7 +35,7 @@ type Network struct {
|
||||||
Name *string
|
Name *string
|
||||||
Lifecycle fi.Lifecycle
|
Lifecycle fi.Lifecycle
|
||||||
|
|
||||||
ID *int
|
ID *string
|
||||||
Region string
|
Region string
|
||||||
IPRange string
|
IPRange string
|
||||||
Subnets []string
|
Subnets []string
|
||||||
|
|
@ -45,28 +46,38 @@ type Network struct {
|
||||||
var _ fi.CompareWithID = &Network{}
|
var _ fi.CompareWithID = &Network{}
|
||||||
|
|
||||||
func (v *Network) CompareWithID() *string {
|
func (v *Network) CompareWithID() *string {
|
||||||
return fi.String(strconv.Itoa(fi.IntValue(v.ID)))
|
return v.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Network) Find(c *fi.Context) (*Network, error) {
|
func (v *Network) Find(c *fi.Context) (*Network, error) {
|
||||||
cloud := c.Cloud.(hetzner.HetznerCloud)
|
cloud := c.Cloud.(hetzner.HetznerCloud)
|
||||||
client := cloud.NetworkClient()
|
client := cloud.NetworkClient()
|
||||||
|
|
||||||
// TODO(hakman): Find using label selector
|
idOrName := fi.StringValue(v.Name)
|
||||||
networks, err := client.All(context.TODO())
|
if v.ID != nil {
|
||||||
if err != nil {
|
idOrName = fi.StringValue(v.ID)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, network := range networks {
|
network, _, err := client.Get(context.TODO(), idOrName)
|
||||||
if network.Name == fi.StringValue(v.Name) {
|
if err != nil {
|
||||||
matches := &Network{
|
return nil, fmt.Errorf("failed to find network %q: %w", idOrName, err)
|
||||||
Name: fi.String(network.Name),
|
|
||||||
Lifecycle: v.Lifecycle,
|
|
||||||
ID: fi.Int(network.ID),
|
|
||||||
IPRange: network.IPRange.String(),
|
|
||||||
Labels: network.Labels,
|
|
||||||
}
|
}
|
||||||
|
if network == nil {
|
||||||
|
if v.ID != nil {
|
||||||
|
return nil, fmt.Errorf("failed to find network %q", idOrName)
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
matches := &Network{
|
||||||
|
Name: v.Name,
|
||||||
|
Lifecycle: v.Lifecycle,
|
||||||
|
ID: fi.String(strconv.Itoa(network.ID)),
|
||||||
|
}
|
||||||
|
|
||||||
|
if v.ID == nil {
|
||||||
|
matches.IPRange = network.IPRange.String()
|
||||||
|
matches.Labels = network.Labels
|
||||||
matches.Region = v.Region
|
matches.Region = v.Region
|
||||||
for _, subnet := range network.Subnets {
|
for _, subnet := range network.Subnets {
|
||||||
if subnet.IPRange != nil {
|
if subnet.IPRange != nil {
|
||||||
|
|
@ -74,12 +85,14 @@ func (v *Network) Find(c *fi.Context) (*Network, error) {
|
||||||
matches.Subnets = append(matches.Subnets, subnet.IPRange.String())
|
matches.Subnets = append(matches.Subnets, subnet.IPRange.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Make sure the ID is set (used by other tasks)
|
||||||
|
v.ID = matches.ID
|
||||||
|
} else {
|
||||||
|
// Make sure the ID is numerical
|
||||||
v.ID = matches.ID
|
v.ID = matches.ID
|
||||||
return matches, nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, nil
|
return matches, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Network) Run(c *fi.Context) error {
|
func (v *Network) Run(c *fi.Context) error {
|
||||||
|
|
@ -138,7 +151,7 @@ func (_ *Network) RenderHetzner(t *hetzner.HetznerAPITarget, a, e, changes *Netw
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
e.ID = fi.Int(network.ID)
|
e.ID = fi.String(strconv.Itoa(network.ID))
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
var err error
|
var err error
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hetznercloud/hcloud-go/hcloud"
|
"github.com/hetznercloud/hcloud-go/hcloud"
|
||||||
|
|
@ -205,6 +206,11 @@ func (_ *ServerGroup) RenderHetzner(t *hetzner.HetznerAPITarget, a, e, changes *
|
||||||
}
|
}
|
||||||
userDataHash := safeBytesHash(userDataBytes)
|
userDataHash := safeBytesHash(userDataBytes)
|
||||||
|
|
||||||
|
networkID, err := strconv.Atoi(fi.StringValue(e.Network.ID))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to convert network ID %q to int: %w", fi.StringValue(e.Network.ID), err)
|
||||||
|
}
|
||||||
|
|
||||||
for i := 1; i <= expectedCount-actualCount; i++ {
|
for i := 1; i <= expectedCount-actualCount; i++ {
|
||||||
// Append a random/unique ID to the node name
|
// Append a random/unique ID to the node name
|
||||||
name := fmt.Sprintf("%s-%x", fi.StringValue(e.Name), rand.Int63())
|
name := fmt.Sprintf("%s-%x", fi.StringValue(e.Name), rand.Int63())
|
||||||
|
|
@ -214,7 +220,7 @@ func (_ *ServerGroup) RenderHetzner(t *hetzner.HetznerAPITarget, a, e, changes *
|
||||||
StartAfterCreate: fi.Bool(true),
|
StartAfterCreate: fi.Bool(true),
|
||||||
Networks: []*hcloud.Network{
|
Networks: []*hcloud.Network{
|
||||||
{
|
{
|
||||||
ID: fi.IntValue(e.Network.ID),
|
ID: networkID,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Location: &hcloud.Location{
|
Location: &hcloud.Location{
|
||||||
|
|
|
||||||
|
|
@ -173,6 +173,12 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretS
|
||||||
dest["HCLOUD_TOKEN"] = func() string {
|
dest["HCLOUD_TOKEN"] = func() string {
|
||||||
return os.Getenv("HCLOUD_TOKEN")
|
return os.Getenv("HCLOUD_TOKEN")
|
||||||
}
|
}
|
||||||
|
dest["HCLOUD_NETWORK"] = func() string {
|
||||||
|
if cluster.Spec.NetworkID != "" {
|
||||||
|
return cluster.Spec.NetworkID
|
||||||
|
}
|
||||||
|
return cluster.Name
|
||||||
|
}
|
||||||
|
|
||||||
if featureflag.Spotinst.Enabled() {
|
if featureflag.Spotinst.Enabled() {
|
||||||
if creds, err := spotinst.LoadCredentials(); err == nil {
|
if creds, err := spotinst.LoadCredentials(); err == nil {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue