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

Add Networks support #20

Merged
merged 3 commits into from
Aug 30, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
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
4 changes: 4 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ env:
- GO111MODULE=on
before_script:
- go get golang.org/x/lint/golint
- docker pull lkdevelopment/hetzner-cloud-api-mock
- docker run -d -p 127.0.0.1:4000:8080 lkdevelopment/hetzner-cloud-api-mock
- docker ps -a
- sleep 10
script:
- make test
- make
81 changes: 81 additions & 0 deletions deploy/development-networks.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# NOTE: this release was tested against kubernetes v1.15.x
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: cloud-controller-manager
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: system:cloud-controller-manager
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: cloud-controller-manager
namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hcloud-cloud-controller-manager
namespace: kube-system
spec:
replicas: 1
revisionHistoryLimit: 2
template:
metadata:
labels:
app: hcloud-cloud-controller-manager
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
serviceAccount: cloud-controller-manager
dnsPolicy: Default
tolerations:
# this taint is set by all kubelets running `--cloud-provider=external`
# so we should tolerate it to schedule the cloud controller manager
- key: "node.cloudprovider.kubernetes.io/uninitialized"
value: "true"
effect: "NoSchedule"
- key: "CriticalAddonsOnly"
operator: "Exists"
# cloud controller manages should be able to run on masters
- key: "node-role.kubernetes.io/master"
effect: NoSchedule
- key: "node.kubernetes.io/not-ready"
effect: "NoSchedule"
hostNetwork: true
containers:
- image: hetznercloud/hcloud-cloud-controller-manager:v1.4.0-b1
name: hcloud-cloud-controller-manager
command:
- "/bin/hcloud-cloud-controller-manager"
- "--cloud-provider=hcloud"
- "--leader-elect=false"
- "--allow-untagged-cloud"
- "--allocate-node-cidrs=true"
- "--cluster-cidr=10.244.0.0/16"
resources:
requests:
cpu: 100m
memory: 50Mi
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: HCLOUD_TOKEN
valueFrom:
secretKeyRef:
name: hcloud
key: token
- name: HCLOUD_NETWORK
valueFrom:
secretKeyRef:
name: hcloud
key: network
77 changes: 42 additions & 35 deletions deploy/development.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# NOTE: this release was tested against kubernetes v1.9.x - 1.12.x
# NOTE: this release was tested against kubernetes v1.15.x

---
apiVersion: v1
Expand All @@ -16,9 +16,9 @@ roleRef:
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: cloud-controller-manager
namespace: kube-system
- kind: ServiceAccount
name: cloud-controller-manager
namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
Expand All @@ -38,35 +38,42 @@ spec:
serviceAccount: cloud-controller-manager
dnsPolicy: Default
tolerations:
# this taint is set by all kubelets running `--cloud-provider=external`
# so we should tolerate it to schedule the cloud controller manager
- key: "node.cloudprovider.kubernetes.io/uninitialized"
value: "true"
effect: "NoSchedule"
- key: "CriticalAddonsOnly"
operator: "Exists"
# cloud controller manages should be able to run on masters
- key: "node-role.kubernetes.io/master"
effect: NoSchedule
# this taint is set by all kubelets running `--cloud-provider=external`
# so we should tolerate it to schedule the cloud controller manager
- key: "node.cloudprovider.kubernetes.io/uninitialized"
value: "true"
effect: "NoSchedule"
- key: "CriticalAddonsOnly"
operator: "Exists"
# cloud controller manages should be able to run on masters
- key: "node-role.kubernetes.io/master"
effect: NoSchedule
- key: "node.kubernetes.io/not-ready"
effect: "NoSchedule"
containers:
- image: hetznercloud/hcloud-cloud-controller-manager:latest
name: hcloud-cloud-controller-manager
command:
- "/bin/hcloud-cloud-controller-manager"
- "--cloud-provider=hcloud"
- "--leader-elect=false"
- "--allow-untagged-cloud"
resources:
requests:
cpu: 100m
memory: 50Mi
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: HCLOUD_TOKEN
valueFrom:
secretKeyRef:
name: hcloud
key: token
- image: hetznercloud/hcloud-cloud-controller-manager:v1.4.0-b1
name: hcloud-cloud-controller-manager
command:
- "/bin/hcloud-cloud-controller-manager"
- "--cloud-provider=hcloud"
- "--leader-elect=false"
- "--allow-untagged-cloud"
resources:
requests:
cpu: 100m
memory: 50Mi
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: HCLOUD_TOKEN
valueFrom:
secretKeyRef:
name: hcloud
key: token
- name: HCLOUD_NETWORK
valueFrom:
secretKeyRef:
name: hcloud
key: network
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ require (
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
github.com/grpc-ecosystem/grpc-gateway v1.8.5 // indirect
github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47 // indirect
github.com/hetznercloud/hcloud-go v1.12.0
github.com/hetznercloud/hcloud-go v1.14.0
github.com/imdario/mergo v0.0.0-20180119215619-163f41321a19 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jonboulle/clockwork v0.1.0 // indirect
Expand All @@ -61,7 +61,7 @@ require (
github.com/spf13/cobra v0.0.1 // indirect
github.com/spf13/pflag v0.0.0-20171106142849-4c012f6dcd95
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
github.com/ugorji/go v1.1.1
github.com/ugorji/go v1.1.1 // indirect
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
go.etcd.io/bbolt v1.3.2 // indirect
go.uber.org/atomic v1.3.2 // indirect
Expand All @@ -74,10 +74,10 @@ require (
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/square/go-jose.v2 v2.3.0 // indirect
k8s.io/api v0.0.0-20180712090710-2d6f90ab1293
k8s.io/apiextensions-apiserver v0.0.0-20180718013825-06dfdaae5c2b
k8s.io/apiextensions-apiserver v0.0.0-20180718013825-06dfdaae5c2b // indirect
k8s.io/apimachinery v0.0.0-20180621070125-103fd098999d
k8s.io/apiserver v0.0.0-20180718002855-8b122ec9e3bb
k8s.io/client-go v2.0.0-alpha.0.0.20180718001006-59698c7d9724+incompatible
k8s.io/client-go v2.0.0-alpha.0.0.20180718001006-59698c7d9724+incompatible // indirect
k8s.io/klog v0.2.0 // indirect
k8s.io/kube-openapi v0.0.0-20181106182614-a9a16210091c // indirect
k8s.io/kubernetes v1.11.1
Expand Down
3 changes: 3 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,12 @@ github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47 h1:UnszMmmmm5
github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hetznercloud/hcloud-go v1.12.0 h1:ugZO8a8ADekqSWi7xWlcs6pxr4QE0tw5VnyjXcL5n28=
github.com/hetznercloud/hcloud-go v1.12.0/go.mod h1:g5pff0YNAZywQaivY/CmhUYFVp7oP0nu3MiODC2W4Hw=
github.com/hetznercloud/hcloud-go v1.14.0 h1:6IdF0Vox/6j1pyEdUCbFPIzEH/K9xZZzVuSFro8Y2vw=
github.com/hetznercloud/hcloud-go v1.14.0/go.mod h1:8lR3yHBHZWy2uGcUi9Ibt4UOoop2wrVdERJgCtxsF3Q=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/imdario/mergo v0.0.0-20180119215619-163f41321a19 h1:geJOJJZwkYI1yqxWrAMcgrwDvy4P1XyNNgIyN9d6UXc=
github.com/imdario/mergo v0.0.0-20180119215619-163f41321a19/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
Expand Down
20 changes: 18 additions & 2 deletions hcloud/cloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,18 @@ import (
const (
hcloudTokenENVVar = "HCLOUD_TOKEN"
hcloudEndpointENVVar = "HCLOUD_ENDPOINT"
hcloudNetworkENVVar = "HCLOUD_NETWORK"
nodeNameENVVar = "NODE_NAME"
providerName = "hcloud"
providerVersion = "v1.3.0"
providerVersion = "v1.4.0"
)

type cloud struct {
client *hcloud.Client
instances cloudprovider.Instances
zones cloudprovider.Zones
routes cloudprovider.Routes
network string
}

func newCloud(config io.Reader) (cloudprovider.Interface, error) {
Expand All @@ -50,6 +53,8 @@ func newCloud(config io.Reader) (cloudprovider.Interface, error) {
return nil, fmt.Errorf("environment variable %q is required", nodeNameENVVar)
}

network := os.Getenv(hcloudNetworkENVVar)

opts := []hcloud.ClientOption{
hcloud.WithToken(token),
hcloud.WithApplication("hcloud-cloud-controller", providerVersion),
Expand All @@ -63,6 +68,8 @@ func newCloud(config io.Reader) (cloudprovider.Interface, error) {
client: client,
zones: newZones(client, nodeName),
instances: newInstances(client),
routes: nil,
network: network,
}, nil
}

Expand All @@ -85,7 +92,16 @@ func (c *cloud) Clusters() (cloudprovider.Clusters, bool) {
}

func (c *cloud) Routes() (cloudprovider.Routes, bool) {
return nil, false
if len(c.network) > 0 {
r, err := newRoutes(c.client, c.network)
if err != nil {
fmt.Printf("%+v", err)
return nil, false
}
return r, true
}
return nil, false // If no network is configured, disable the routes part

}

func (c *cloud) ProviderName() string {
Expand Down
12 changes: 12 additions & 0 deletions hcloud/cloud_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ func TestNewCloud(t *testing.T) {
}

func TestCloud(t *testing.T) {
os.Setenv("HCLOUD_TOKEN", "test")
os.Setenv("NODE_NAME", "test")
var config bytes.Buffer
cloud, err := newCloud(&config)
if err != nil {
Expand Down Expand Up @@ -108,6 +110,16 @@ func TestCloud(t *testing.T) {
}
})

t.Run("RoutesWithNetworks", func(t *testing.T) {
os.Setenv("HCLOUD_NETWORK", "1")
os.Setenv("HCLOUD_ENDPOINT", "http://127.0.0.1:4000/v1") // We need the mock server for testing this
c, _ := newCloud(&config)
_, supported := c.Routes()
if !supported {
t.Error("Routes interface should be supported")
}
})

t.Run("HasClusterID", func(t *testing.T) {
if cloud.HasClusterID() {
t.Error("HasClusterID should be false")
Expand Down
22 changes: 19 additions & 3 deletions hcloud/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package hcloud
import (
"context"
"k8s.io/kubernetes/pkg/cloudprovider"
"os"
"strconv"

"github.com/hetznercloud/hcloud-go/hcloud"
Expand All @@ -44,15 +45,15 @@ func (i *instances) NodeAddressesByProviderID(ctx context.Context, providerID st
if err != nil {
return nil, err
}
return nodeAddresses(server), nil
return i.nodeAddresses(ctx, server), nil
}

func (i *instances) NodeAddresses(ctx context.Context, nodeName types.NodeName) ([]v1.NodeAddress, error) {
server, err := getServerByName(ctx, i.client, string(nodeName))
if err != nil {
return nil, err
}
return nodeAddresses(server), nil
return i.nodeAddresses(ctx, server), nil
}

func (i *instances) ExternalID(ctx context.Context, nodeName types.NodeName) (string, error) {
Expand Down Expand Up @@ -128,12 +129,27 @@ func (i instances) InstanceShutdownByProviderID(ctx context.Context, providerID
return
}

func nodeAddresses(server *hcloud.Server) []v1.NodeAddress {
func (i *instances) nodeAddresses(ctx context.Context, server *hcloud.Server) []v1.NodeAddress {
var addresses []v1.NodeAddress
addresses = append(
addresses,
v1.NodeAddress{Type: v1.NodeHostName, Address: server.Name},
v1.NodeAddress{Type: v1.NodeExternalIP, Address: server.PublicNet.IPv4.IP.String()},
)
n := os.Getenv(hcloudNetworkENVVar)
if len(n) > 0 {
network, _, _ := i.client.Network.Get(ctx, n)
if network != nil {
for _, privateNet := range server.PrivateNet {
if privateNet.Network.ID == network.ID {
addresses = append(
addresses,
v1.NodeAddress{Type: v1.NodeInternalIP, Address: privateNet.IP.String()},
)
}
}

}
}
return addresses
}
Loading