Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to mark internal network as external #235

Merged
merged 3 commits into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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`
Michkov marked this conversation as resolved.
Show resolved Hide resolved

## 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 @@

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

Expand Down Expand Up @@ -42,3 +44,14 @@

return err
}

func isPrivate(ip *net.IP) bool {
if Options.LinodeExternalNetwork == nil {
return ip.IsPrivate()
}
ipAddr, err := netip.ParseAddr(ip.String())
Michkov marked this conversation as resolved.
Show resolved Hide resolved
Michkov marked this conversation as resolved.
Show resolved Hide resolved
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 @@
// 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
Loading