Skip to content

Commit 335866b

Browse files
Merge pull request #6 from openshift-cloud-team/rebase-bot-master
Merge https://github.com/kubernetes/cloud-provider-gcp:master into master
2 parents 83bfc8c + 500db5c commit 335866b

File tree

2,659 files changed

+391012
-237908
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,659 files changed

+391012
-237908
lines changed

cluster/addons/device-plugins/nvidia-gpu/daemonset.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ spec:
3636
hostPath:
3737
path: /dev
3838
containers:
39-
- image: "gcr.io/gke-release/nvidia-gpu-device-plugin@sha256:a75ec0caa9e3038bd9886b3f36641a624574ff34b064974de6ee45048de3372b"
39+
- image: "k8s.gcr.io/nvidia-gpu-device-plugin@sha256:4b036e8844920336fa48f36edeb7d4398f426d6a934ba022848deed2edbf09aa"
4040
command: ["/usr/bin/nvidia-gpu-device-plugin", "-logtostderr"]
4141
name: nvidia-gpu-device-plugin
4242
resources:

cluster/gce/gci/node.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ write_files:
117117
[Install]
118118
WantedBy=multi-user.target
119119
120+
- path: /etc/modprobe.d/sunrpc.conf
121+
permissions: 0644
122+
owner: root
123+
# The GKE metadata server uses ports 987-989, so the sunrpc range should be restricted to be below.
124+
content: |
125+
options sunrpc max_resvport=986
126+
120127
runcmd:
121128
- systemctl daemon-reload
122129
- systemctl enable kube-node-installation.service

cluster/gce/manifests/cloud-controller-manager.manifest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
},
3131
"command": ["/cloud-controller-manager"],
3232
"args": [
33-
"--log_file=/var/log/cloud-controller-manager.log",
33+
"--log-file=/var/log/cloud-controller-manager.log",
3434
"--logtostderr=false",
3535
{{params}}
3636
],

cmd/cloud-controller-manager/BUILD

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,20 @@ go_binary(
1616

1717
go_library(
1818
name = "go_default_library",
19-
srcs = ["main.go"],
19+
srcs = [
20+
"main.go",
21+
"nodeipamcontroller.go",
22+
],
2023
importpath = "k8s.io/cloud-provider-gcp/cmd/cloud-controller-manager",
2124
deps = [
25+
"//cmd/cloud-controller-manager/options:go_default_library",
26+
"//pkg/controller/nodeipam:go_default_library",
27+
"//pkg/controller/nodeipam/config:go_default_library",
28+
"//pkg/controller/nodeipam/ipam:go_default_library",
2229
"//providers/gce:go_default_library",
2330
"//vendor/github.com/spf13/pflag:go_default_library",
2431
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
32+
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
2533
"//vendor/k8s.io/cloud-provider:go_default_library",
2634
"//vendor/k8s.io/cloud-provider/app:go_default_library",
2735
"//vendor/k8s.io/cloud-provider/app/config:go_default_library",
@@ -30,7 +38,10 @@ go_library(
3038
"//vendor/k8s.io/component-base/logs:go_default_library",
3139
"//vendor/k8s.io/component-base/metrics/prometheus/clientgo:go_default_library",
3240
"//vendor/k8s.io/component-base/metrics/prometheus/version:go_default_library",
41+
"//vendor/k8s.io/controller-manager/app:go_default_library",
42+
"//vendor/k8s.io/controller-manager/pkg/features:go_default_library",
3343
"//vendor/k8s.io/klog/v2:go_default_library",
44+
"//vendor/k8s.io/utils/net:go_default_library",
3445
],
3546
)
3647

cmd/cloud-controller-manager/main.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,23 @@ import (
4242
func main() {
4343
rand.Seed(time.Now().UnixNano())
4444

45+
pflag.CommandLine.SetNormalizeFunc(cliflag.WordSepNormalizeFunc)
46+
4547
ccmOptions, err := options.NewCloudControllerManagerOptions()
4648
if err != nil {
4749
klog.Fatalf("unable to initialize command options: %v", err)
4850
}
4951

52+
controllerInitializers := app.DefaultInitFuncConstructors
53+
54+
nodeIpamController := nodeIPAMController{}
55+
nodeIpamController.nodeIPAMControllerOptions.NodeIPAMControllerConfiguration = &nodeIpamController.nodeIPAMControllerConfiguration
5056
fss := cliflag.NamedFlagSets{}
51-
command := app.NewCloudControllerManagerCommand(ccmOptions, cloudInitializer, app.DefaultInitFuncConstructors, fss, wait.NeverStop)
57+
nodeIpamController.nodeIPAMControllerOptions.AddFlags(fss.FlagSet("nodeipam controller"))
58+
controllerInitializers["nodeipam"] = nodeIpamController.startNodeIpamControllerWrapper
59+
60+
command := app.NewCloudControllerManagerCommand(ccmOptions, cloudInitializer, controllerInitializers, fss, wait.NeverStop)
5261

53-
// TODO: once we switch everything over to Cobra commands, we can go back to calling (https://github.com/kubernetes/cloud-provider-gcp/issues/215)
54-
// utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the
55-
// normalize func and add the go flag set by hand.
56-
// Here is an sample
57-
pflag.CommandLine.SetNormalizeFunc(cliflag.WordSepNormalizeFunc)
58-
// utilflag.InitFlags()
5962
logs.InitLogs()
6063
defer logs.FlushLogs()
6164

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
/*
2+
Copyright 2018 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
// This file holds the code related with the sample nodeipamcontroller
18+
// which demonstrates how cloud providers add external controllers to cloud-controller-manager
19+
// This file is copied from k8s.io/kubernetes/cmd/cloud-controller-manager/[email protected]
20+
21+
package main
22+
23+
import (
24+
"errors"
25+
"fmt"
26+
"net"
27+
"net/http"
28+
"strings"
29+
30+
utilfeature "k8s.io/apiserver/pkg/util/feature"
31+
cloudprovider "k8s.io/cloud-provider"
32+
nodeipamcontrolleroptions "k8s.io/cloud-provider-gcp/cmd/cloud-controller-manager/options"
33+
nodeipamcontroller "k8s.io/cloud-provider-gcp/pkg/controller/nodeipam"
34+
nodeipamconfig "k8s.io/cloud-provider-gcp/pkg/controller/nodeipam/config"
35+
"k8s.io/cloud-provider-gcp/pkg/controller/nodeipam/ipam"
36+
"k8s.io/cloud-provider/app"
37+
cloudcontrollerconfig "k8s.io/cloud-provider/app/config"
38+
genericcontrollermanager "k8s.io/controller-manager/app"
39+
"k8s.io/controller-manager/pkg/features"
40+
"k8s.io/klog/v2"
41+
netutils "k8s.io/utils/net"
42+
)
43+
44+
const (
45+
// defaultNodeMaskCIDRIPv4 is default mask size for IPv4 node cidr
46+
defaultNodeMaskCIDRIPv4 = 24
47+
// defaultNodeMaskCIDRIPv6 is default mask size for IPv6 node cidr
48+
defaultNodeMaskCIDRIPv6 = 64
49+
)
50+
51+
type nodeIPAMController struct {
52+
nodeIPAMControllerConfiguration nodeipamconfig.NodeIPAMControllerConfiguration
53+
nodeIPAMControllerOptions nodeipamcontrolleroptions.NodeIPAMControllerOptions
54+
}
55+
56+
func (nodeIpamController *nodeIPAMController) startNodeIpamControllerWrapper(completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) app.InitFunc {
57+
errors := nodeIpamController.nodeIPAMControllerOptions.Validate()
58+
if len(errors) > 0 {
59+
klog.Fatal("NodeIPAM controller values are not properly set.")
60+
}
61+
nodeIpamController.nodeIPAMControllerOptions.ApplyTo(&nodeIpamController.nodeIPAMControllerConfiguration)
62+
63+
return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) {
64+
return startNodeIpamController(completedConfig, nodeIpamController.nodeIPAMControllerConfiguration, ctx, cloud)
65+
}
66+
}
67+
68+
func startNodeIpamController(ccmConfig *cloudcontrollerconfig.CompletedConfig, nodeIPAMConfig nodeipamconfig.NodeIPAMControllerConfiguration, ctx genericcontrollermanager.ControllerContext, cloud cloudprovider.Interface) (http.Handler, bool, error) {
69+
var serviceCIDR *net.IPNet
70+
var secondaryServiceCIDR *net.IPNet
71+
72+
// should we start nodeIPAM
73+
if !ccmConfig.ComponentConfig.KubeCloudShared.AllocateNodeCIDRs {
74+
return nil, false, fmt.Errorf("the AllocateNodeCIDRs is not enabled")
75+
}
76+
77+
// failure: bad cidrs in config
78+
clusterCIDRs, dualStack, err := processCIDRs(ccmConfig.ComponentConfig.KubeCloudShared.ClusterCIDR)
79+
if err != nil {
80+
return nil, false, err
81+
}
82+
83+
// failure: more than one cidr and dual stack is not enabled
84+
if len(clusterCIDRs) > 1 && !utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) {
85+
return nil, false, fmt.Errorf("len of ClusterCIDRs==%v and dualstack feature is not enabled", len(clusterCIDRs))
86+
}
87+
88+
// failure: more than one cidr but they are not configured as dual stack
89+
if len(clusterCIDRs) > 1 && !dualStack {
90+
return nil, false, fmt.Errorf("len of ClusterCIDRs==%v and they are not configured as dual stack (at least one from each IPFamily", len(clusterCIDRs))
91+
}
92+
93+
// failure: more than cidrs is not allowed even with dual stack
94+
if len(clusterCIDRs) > 2 {
95+
return nil, false, fmt.Errorf("len of clusters is:%v > more than max allowed of 2", len(clusterCIDRs))
96+
}
97+
98+
// service cidr processing
99+
if len(strings.TrimSpace(nodeIPAMConfig.ServiceCIDR)) != 0 {
100+
_, serviceCIDR, err = net.ParseCIDR(nodeIPAMConfig.ServiceCIDR)
101+
if err != nil {
102+
klog.Warningf("Unsuccessful parsing of service CIDR %v: %v", nodeIPAMConfig.ServiceCIDR, err)
103+
}
104+
}
105+
106+
if len(strings.TrimSpace(nodeIPAMConfig.SecondaryServiceCIDR)) != 0 {
107+
_, secondaryServiceCIDR, err = net.ParseCIDR(nodeIPAMConfig.SecondaryServiceCIDR)
108+
if err != nil {
109+
klog.Warningf("Unsuccessful parsing of service CIDR %v: %v", nodeIPAMConfig.SecondaryServiceCIDR, err)
110+
}
111+
}
112+
113+
// the following checks are triggered if both serviceCIDR and secondaryServiceCIDR are provided
114+
if serviceCIDR != nil && secondaryServiceCIDR != nil {
115+
// should have dual stack flag enabled
116+
if !utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) {
117+
return nil, false, fmt.Errorf("secondary service cidr is provided and IPv6DualStack feature is not enabled")
118+
}
119+
120+
// should be dual stack (from different IPFamilies)
121+
dualstackServiceCIDR, err := netutils.IsDualStackCIDRs([]*net.IPNet{serviceCIDR, secondaryServiceCIDR})
122+
if err != nil {
123+
return nil, false, fmt.Errorf("failed to perform dualstack check on serviceCIDR and secondaryServiceCIDR error:%v", err)
124+
}
125+
if !dualstackServiceCIDR {
126+
return nil, false, fmt.Errorf("serviceCIDR and secondaryServiceCIDR are not dualstack (from different IPfamiles)")
127+
}
128+
}
129+
130+
var nodeCIDRMaskSizeIPv4, nodeCIDRMaskSizeIPv6 int
131+
if utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) {
132+
// only --node-cidr-mask-size-ipv4 and --node-cidr-mask-size-ipv6 supported with dual stack clusters.
133+
// --node-cidr-mask-size flag is incompatible with dual stack clusters.
134+
nodeCIDRMaskSizeIPv4, nodeCIDRMaskSizeIPv6, err = setNodeCIDRMaskSizesDualStack(nodeIPAMConfig)
135+
} else {
136+
// only --node-cidr-mask-size supported with single stack clusters.
137+
// --node-cidr-mask-size-ipv4 and --node-cidr-mask-size-ipv6 flags are incompatible with dual stack clusters.
138+
nodeCIDRMaskSizeIPv4, nodeCIDRMaskSizeIPv6, err = setNodeCIDRMaskSizes(nodeIPAMConfig)
139+
}
140+
141+
if err != nil {
142+
return nil, false, err
143+
}
144+
145+
// get list of node cidr mask sizes
146+
nodeCIDRMaskSizes := getNodeCIDRMaskSizes(clusterCIDRs, nodeCIDRMaskSizeIPv4, nodeCIDRMaskSizeIPv6)
147+
148+
nodeIpamController, err := nodeipamcontroller.NewNodeIpamController(
149+
ctx.InformerFactory.Core().V1().Nodes(),
150+
cloud,
151+
ctx.ClientBuilder.ClientOrDie("node-controller"),
152+
clusterCIDRs,
153+
serviceCIDR,
154+
secondaryServiceCIDR,
155+
nodeCIDRMaskSizes,
156+
ipam.CIDRAllocatorType(ccmConfig.ComponentConfig.KubeCloudShared.CIDRAllocatorType),
157+
)
158+
if err != nil {
159+
return nil, false, err
160+
}
161+
go nodeIpamController.Run(ctx.Stop)
162+
return nil, true, nil
163+
}
164+
165+
// processCIDRs is a helper function that works on a comma separated cidrs and returns
166+
// a list of typed cidrs
167+
// a flag if cidrs represents a dual stack
168+
// error if failed to parse any of the cidrs
169+
func processCIDRs(cidrsList string) ([]*net.IPNet, bool, error) {
170+
cidrsSplit := strings.Split(strings.TrimSpace(cidrsList), ",")
171+
172+
cidrs, err := netutils.ParseCIDRs(cidrsSplit)
173+
if err != nil {
174+
return nil, false, err
175+
}
176+
177+
// if cidrs has an error then the previous call will fail
178+
// safe to ignore error checking on next call
179+
dualstack, _ := netutils.IsDualStackCIDRs(cidrs)
180+
181+
return cidrs, dualstack, nil
182+
}
183+
184+
// setNodeCIDRMaskSizes returns the IPv4 and IPv6 node cidr mask sizes.
185+
// If --node-cidr-mask-size not set, then it will return default IPv4 and IPv6 cidr mask sizes.
186+
func setNodeCIDRMaskSizes(cfg nodeipamconfig.NodeIPAMControllerConfiguration) (int, int, error) {
187+
ipv4Mask, ipv6Mask := defaultNodeMaskCIDRIPv4, defaultNodeMaskCIDRIPv6
188+
// NodeCIDRMaskSizeIPv4 and NodeCIDRMaskSizeIPv6 can be used only for dual-stack clusters
189+
if cfg.NodeCIDRMaskSizeIPv4 != 0 || cfg.NodeCIDRMaskSizeIPv6 != 0 {
190+
return ipv4Mask, ipv6Mask, errors.New("usage of --node-cidr-mask-size-ipv4 and --node-cidr-mask-size-ipv6 are not allowed with non dual-stack clusters")
191+
}
192+
if cfg.NodeCIDRMaskSize != 0 {
193+
ipv4Mask = int(cfg.NodeCIDRMaskSize)
194+
ipv6Mask = int(cfg.NodeCIDRMaskSize)
195+
}
196+
return ipv4Mask, ipv6Mask, nil
197+
}
198+
199+
// setNodeCIDRMaskSizesDualStack returns the IPv4 and IPv6 node cidr mask sizes to the value provided
200+
// for --node-cidr-mask-size-ipv4 and --node-cidr-mask-size-ipv6 respectively. If value not provided,
201+
// then it will return default IPv4 and IPv6 cidr mask sizes.
202+
func setNodeCIDRMaskSizesDualStack(cfg nodeipamconfig.NodeIPAMControllerConfiguration) (int, int, error) {
203+
ipv4Mask, ipv6Mask := defaultNodeMaskCIDRIPv4, defaultNodeMaskCIDRIPv6
204+
// NodeCIDRMaskSize can be used only for single stack clusters
205+
if cfg.NodeCIDRMaskSize != 0 {
206+
return ipv4Mask, ipv6Mask, errors.New("usage of --node-cidr-mask-size is not allowed with dual-stack clusters")
207+
}
208+
if cfg.NodeCIDRMaskSizeIPv4 != 0 {
209+
ipv4Mask = int(cfg.NodeCIDRMaskSizeIPv4)
210+
}
211+
if cfg.NodeCIDRMaskSizeIPv6 != 0 {
212+
ipv6Mask = int(cfg.NodeCIDRMaskSizeIPv6)
213+
}
214+
return ipv4Mask, ipv6Mask, nil
215+
}
216+
217+
// getNodeCIDRMaskSizes is a helper function that helps the generate the node cidr mask
218+
// sizes slice based on the cluster cidr slice
219+
func getNodeCIDRMaskSizes(clusterCIDRs []*net.IPNet, maskSizeIPv4, maskSizeIPv6 int) []int {
220+
nodeMaskCIDRs := make([]int, len(clusterCIDRs))
221+
222+
for idx, clusterCIDR := range clusterCIDRs {
223+
if netutils.IsIPv6CIDR(clusterCIDR) {
224+
nodeMaskCIDRs[idx] = maskSizeIPv6
225+
} else {
226+
nodeMaskCIDRs[idx] = maskSizeIPv4
227+
}
228+
}
229+
return nodeMaskCIDRs
230+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library")
2+
3+
go_library(
4+
name = "go_default_library",
5+
srcs = ["nodeipamcontroller.go"],
6+
importpath = "k8s.io/cloud-provider-gcp/cmd/cloud-controller-manager/options",
7+
visibility = ["//visibility:public"],
8+
deps = [
9+
"//pkg/controller/nodeipam/config:go_default_library",
10+
"//vendor/github.com/spf13/pflag:go_default_library",
11+
],
12+
)

0 commit comments

Comments
 (0)