Skip to content

Commit

Permalink
Allow mark internal network as external
Browse files Browse the repository at this point in the history
With new enviroment variable `LINODE_EXTERNAL_SUBNET` is possible to set
internal network subnet to be used as external network.

Useful for running on testing Linode cloud instances which are providing
external IP addresses in internal network.
  • Loading branch information
Michkov committed Sep 25, 2024
1 parent 76dea77 commit 4c94969
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 6 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ Environment Variable | Default | Description
`LINODE_INSTANCE_CACHE_TTL` | `15` | Default timeout of instance cache in seconds
`LINODE_ROUTES_CACHE_TTL_SECONDS` | `60` | Default timeout of route cache in seconds
`LINODE_REQUEST_TIMEOUT_SECONDS` | `120` | Default timeout in seconds for http requests to linode API
`LINODE_EXTERNAL_SUBNET` | `` | Mark private network as external. Example - `172.24.0.0/16`

## Generating a Manifest for Deployment
Use the script located at `./deploy/generate-manifest.sh` to generate a self-contained deployment manifest for the Linode CCM. Two arguments are required.
Expand Down
2 changes: 2 additions & 0 deletions cloud/linode/cloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package linode
import (
"fmt"
"io"
"net/netip"
"os"
"strconv"
"sync"
Expand Down Expand Up @@ -37,6 +38,7 @@ var Options struct {
VPCName string
LoadBalancerType string
BGPNodeSelector string
LinodeExternalNetwork *netip.Prefix
}

// vpcDetails is set when VPCName options flag is set.
Expand Down
13 changes: 13 additions & 0 deletions cloud/linode/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package linode

import (
"fmt"
"net"
"net/netip"
"strconv"
"strings"

Expand Down Expand Up @@ -42,3 +44,14 @@ func IgnoreLinodeAPIError(err error, code int) error {

return err
}

func isPrivate(ip *net.IP) bool {
if Options.LinodeExternalNetwork == nil {
return ip.IsPrivate()
}
ipAddr, err := netip.ParseAddr(ip.String())
if err != nil {
panic(err)

Check warning on line 54 in cloud/linode/common.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/common.go#L52-L54

Added lines #L52 - L54 were not covered by tests
}
return ip.IsPrivate() && !Options.LinodeExternalNetwork.Contains(ipAddr)

Check warning on line 56 in cloud/linode/common.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/common.go#L56

Added line #L56 was not covered by tests
}
4 changes: 2 additions & 2 deletions cloud/linode/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func (nc *nodeCache) getInstanceAddresses(instance linodego.Instance, vpcips []s

for _, ip := range instance.IPv4 {
ipType := v1.NodeExternalIP
if ip.IsPrivate() {
if isPrivate(ip) {
ipType = v1.NodeInternalIP
}
ips = append(ips, nodeIP{ip: ip.String(), ipType: ipType})
Expand Down Expand Up @@ -155,7 +155,7 @@ func (i *instances) linodeByIP(kNode *v1.Node) (*linodego.Instance, error) {
}
for _, node := range i.nodeCache.nodes {
for _, nodeIP := range node.instance.IPv4 {
if !nodeIP.IsPrivate() && slices.Contains(kNodeAddresses, nodeIP.String()) {
if !isPrivate(nodeIP) && slices.Contains(kNodeAddresses, nodeIP.String()) {
return node.instance, nil
}
}
Expand Down
2 changes: 1 addition & 1 deletion cloud/linode/node_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ func (s *nodeController) handleNode(ctx context.Context, node *v1.Node) error {
// supports other subnets with nodebalancer, this logic needs to be updated.
// https://www.linode.com/docs/api/linode-instances/#linode-view
for _, addr := range linode.IPv4 {
if addr.IsPrivate() {
if isPrivate(addr) {

Check warning on line 175 in cloud/linode/node_controller.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/node_controller.go#L175

Added line #L175 was not covered by tests
expectedPrivateIP = addr.String()
break
}
Expand Down
19 changes: 16 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"flag"
"fmt"
"net/netip"
"os"

"k8s.io/component-base/logs"
Expand All @@ -25,9 +26,10 @@ import (
)

const (
sentryDSNVariable = "SENTRY_DSN"
sentryEnvironmentVariable = "SENTRY_ENVIRONMENT"
sentryReleaseVariable = "SENTRY_RELEASE"
sentryDSNVariable = "SENTRY_DSN"
sentryEnvironmentVariable = "SENTRY_ENVIRONMENT"
sentryReleaseVariable = "SENTRY_RELEASE"
linodeExternalSubnetVariable = "LINODE_EXTERNAL_SUBNET"
)

func initializeSentry() {
Expand Down Expand Up @@ -114,6 +116,17 @@ func main() {
os.Exit(1)
}

if externalSubnet, ok := os.LookupEnv(linodeExternalSubnetVariable); ok && externalSubnet != "" {
network, err := netip.ParsePrefix(externalSubnet)
if err != nil {
msg := fmt.Sprintf("Unable to parse %s as network subnet: %v", externalSubnet, err)
sentry.CaptureError(ctx, fmt.Errorf(msg))
fmt.Fprintf(os.Stderr, "%v\n", msg)
os.Exit(1)
}
linode.Options.LinodeExternalNetwork = &network
}

pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc)
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)

Expand Down

0 comments on commit 4c94969

Please sign in to comment.