Skip to content

Commit b197243

Browse files
committed
Fix v1beta4 etcd extraArgs missing newline
1 parent 5407008 commit b197243

8 files changed

Lines changed: 525 additions & 15 deletions

File tree

pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta4.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ controlPlaneEndpoint: {{.ControlPlaneAddress}}:{{.APIServerPort}}
6363
etcd:
6464
local:
6565
dataDir: {{.EtcdDataDir}}
66-
{{- if .EtcdExtraArgs}} extraArgs:
66+
{{- if .EtcdExtraArgs}}
67+
extraArgs:
6768
{{- range $key, $val := .EtcdExtraArgs }}
6869
- name: "{{$key}}"
6970
value: "{{$val}}"

pkg/minikube/bootstrapper/bsutil/kubeadm_test.go

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,18 @@ limitations under the License.
1717
package bsutil
1818

1919
import (
20+
"bytes"
21+
"errors"
2022
"fmt"
23+
"io"
2124
"os"
2225
"sort"
2326
"strings"
2427
"testing"
2528

2629
"github.com/google/go-cmp/cmp"
2730
"golang.org/x/mod/semver"
31+
"gopkg.in/yaml.v2"
2832
"k8s.io/minikube/pkg/minikube/command"
2933
"k8s.io/minikube/pkg/minikube/config"
3034
"k8s.io/minikube/pkg/minikube/constants"
@@ -188,13 +192,7 @@ func TestGenerateKubeadmYAMLDNS(t *testing.T) {
188192
if tc.shouldErr {
189193
return
190194
}
191-
expected, err := os.ReadFile(fmt.Sprintf("testdata/%s/%s.yaml", version, tc.name))
192-
if err != nil {
193-
t.Fatalf("unable to read testdata: %v", err)
194-
}
195-
if diff := cmp.Diff(string(expected), string(got)); diff != "" {
196-
t.Errorf("GenerateKubeadmYAMLDNS mismatch (-want +got):\n%s", diff)
197-
}
195+
assertGeneratedYAML(t, got, version, tc.name)
198196
})
199197
}
200198
}
@@ -229,6 +227,7 @@ func TestGenerateKubeadmYAML(t *testing.T) {
229227
{"containerd-api-port", "containerd", false, config.ClusterConfig{Name: "mk", KubernetesConfig: config.KubernetesConfig{ContainerRuntime: constants.Containerd}, Nodes: []config.Node{{Port: 12345}}}},
230228
{"containerd-pod-network-cidr", "containerd", false, config.ClusterConfig{Name: "mk", KubernetesConfig: config.KubernetesConfig{ContainerRuntime: constants.Containerd, ExtraOptions: extraOptsPodCidr}}},
231229
{"image-repository", "docker", false, config.ClusterConfig{Name: "mk", KubernetesConfig: config.KubernetesConfig{ImageRepository: "test/repo"}}},
230+
{"etcd-extra-args", "docker", false, config.ClusterConfig{Name: "mk", KubernetesConfig: config.KubernetesConfig{ExtraOptions: config.ExtraOptionSlice{config.ExtraOption{Component: Etcd, Key: "listen-metrics-urls", Value: "http://0.0.0.0:2381"}}}}},
232231
}
233232
for _, version := range versions {
234233
for _, tc := range tests {
@@ -282,18 +281,36 @@ func TestGenerateKubeadmYAML(t *testing.T) {
282281
if tc.shouldErr {
283282
return
284283
}
285-
expected, err := os.ReadFile(fmt.Sprintf("testdata/%s/%s.yaml", version, tc.name))
286-
if err != nil {
287-
t.Fatalf("unable to read testdata: %v", err)
288-
}
289-
if diff := cmp.Diff(string(expected), string(got)); diff != "" {
290-
t.Errorf("GenerateKubeadmYAML mismatch (-want +got):\n%s", diff)
291-
}
284+
assertGeneratedYAML(t, got, version, tc.name)
292285
})
293286
}
294287
}
295288
}
296289

290+
func assertGeneratedYAML(t *testing.T, got []byte, version, name string) {
291+
t.Helper()
292+
dec := yaml.NewDecoder(bytes.NewReader(got))
293+
for i := 0; ; i++ {
294+
var doc any
295+
err := dec.Decode(&doc)
296+
if errors.Is(err, io.EOF) {
297+
break
298+
}
299+
if err != nil {
300+
t.Errorf("GenerateKubeadmYAML produced invalid YAML (doc #%d): %v\n--- got ---\n%s", i, err, got)
301+
break
302+
}
303+
}
304+
path := fmt.Sprintf("testdata/%s/%s.yaml", version, name)
305+
expected, err := os.ReadFile(path)
306+
if err != nil {
307+
t.Fatalf("unable to read testdata: %v", err)
308+
}
309+
if diff := cmp.Diff(string(expected), string(got)); diff != "" {
310+
t.Errorf("GenerateKubeadmYAML mismatch (-want +got):\n%s", diff)
311+
}
312+
}
313+
297314
func TestEtcdExtraArgs(t *testing.T) {
298315
expected := map[string]string{
299316
"key": "value",
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
apiVersion: kubeadm.k8s.io/v1beta4
2+
kind: InitConfiguration
3+
localAPIEndpoint:
4+
advertiseAddress: 1.1.1.1
5+
bindPort: 8443
6+
bootstrapTokens:
7+
- groups:
8+
- system:bootstrappers:kubeadm:default-node-token
9+
ttl: 24h0m0s
10+
usages:
11+
- signing
12+
- authentication
13+
nodeRegistration:
14+
criSocket: unix:///var/run/dockershim.sock
15+
name: "mk"
16+
kubeletExtraArgs:
17+
- name: "node-ip"
18+
value: "1.1.1.1"
19+
taints: []
20+
---
21+
apiVersion: kubeadm.k8s.io/v1beta4
22+
kind: ClusterConfiguration
23+
apiServer:
24+
certSANs: ["127.0.0.1", "localhost", "1.1.1.1"]
25+
extraArgs:
26+
- name: "enable-admission-plugins"
27+
value: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
28+
controllerManager:
29+
extraArgs:
30+
- name: "allocate-node-cidrs"
31+
value: "true"
32+
- name: "leader-elect"
33+
value: "false"
34+
scheduler:
35+
extraArgs:
36+
- name: "leader-elect"
37+
value: "false"
38+
certificatesDir: /var/lib/minikube/certs
39+
clusterName: mk
40+
controlPlaneEndpoint: control-plane.minikube.internal:8443
41+
etcd:
42+
local:
43+
dataDir: /var/lib/minikube/etcd
44+
extraArgs:
45+
- name: "listen-metrics-urls"
46+
value: "http://0.0.0.0:2381"
47+
kubernetesVersion: v1.31.0
48+
networking:
49+
dnsDomain: cluster.local
50+
podSubnet: "10.244.0.0/16"
51+
serviceSubnet: 10.96.0.0/12
52+
---
53+
apiVersion: kubelet.config.k8s.io/v1beta1
54+
kind: KubeletConfiguration
55+
authentication:
56+
x509:
57+
clientCAFile: /var/lib/minikube/certs/ca.crt
58+
cgroupDriver: systemd
59+
containerRuntimeEndpoint: unix:///var/run/dockershim.sock
60+
hairpinMode: hairpin-veth
61+
runtimeRequestTimeout: 15m
62+
clusterDomain: "cluster.local"
63+
# disable disk resource management by default
64+
imageGCHighThresholdPercent: 100
65+
evictionHard:
66+
nodefs.available: "0%"
67+
nodefs.inodesFree: "0%"
68+
imagefs.available: "0%"
69+
failSwapOn: false
70+
staticPodPath: /etc/kubernetes/manifests
71+
---
72+
apiVersion: kubeproxy.config.k8s.io/v1alpha1
73+
kind: KubeProxyConfiguration
74+
clusterCIDR: "10.244.0.0/16"
75+
metricsBindAddress: 0.0.0.0:10249
76+
conntrack:
77+
maxPerCore: 0
78+
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established"
79+
tcpEstablishedTimeout: 0s
80+
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close"
81+
tcpCloseWaitTimeout: 0s
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
apiVersion: kubeadm.k8s.io/v1beta4
2+
kind: InitConfiguration
3+
localAPIEndpoint:
4+
advertiseAddress: 1.1.1.1
5+
bindPort: 8443
6+
bootstrapTokens:
7+
- groups:
8+
- system:bootstrappers:kubeadm:default-node-token
9+
ttl: 24h0m0s
10+
usages:
11+
- signing
12+
- authentication
13+
nodeRegistration:
14+
criSocket: unix:///var/run/dockershim.sock
15+
name: "mk"
16+
kubeletExtraArgs:
17+
- name: "node-ip"
18+
value: "1.1.1.1"
19+
taints: []
20+
---
21+
apiVersion: kubeadm.k8s.io/v1beta4
22+
kind: ClusterConfiguration
23+
apiServer:
24+
certSANs: ["127.0.0.1", "localhost", "1.1.1.1"]
25+
extraArgs:
26+
- name: "enable-admission-plugins"
27+
value: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
28+
controllerManager:
29+
extraArgs:
30+
- name: "allocate-node-cidrs"
31+
value: "true"
32+
- name: "leader-elect"
33+
value: "false"
34+
scheduler:
35+
extraArgs:
36+
- name: "leader-elect"
37+
value: "false"
38+
certificatesDir: /var/lib/minikube/certs
39+
clusterName: mk
40+
controlPlaneEndpoint: control-plane.minikube.internal:8443
41+
etcd:
42+
local:
43+
dataDir: /var/lib/minikube/etcd
44+
extraArgs:
45+
- name: "listen-metrics-urls"
46+
value: "http://0.0.0.0:2381"
47+
kubernetesVersion: v1.32.0
48+
networking:
49+
dnsDomain: cluster.local
50+
podSubnet: "10.244.0.0/16"
51+
serviceSubnet: 10.96.0.0/12
52+
---
53+
apiVersion: kubelet.config.k8s.io/v1beta1
54+
kind: KubeletConfiguration
55+
authentication:
56+
x509:
57+
clientCAFile: /var/lib/minikube/certs/ca.crt
58+
cgroupDriver: systemd
59+
containerRuntimeEndpoint: unix:///var/run/dockershim.sock
60+
hairpinMode: hairpin-veth
61+
runtimeRequestTimeout: 15m
62+
clusterDomain: "cluster.local"
63+
# disable disk resource management by default
64+
imageGCHighThresholdPercent: 100
65+
evictionHard:
66+
nodefs.available: "0%"
67+
nodefs.inodesFree: "0%"
68+
imagefs.available: "0%"
69+
failSwapOn: false
70+
staticPodPath: /etc/kubernetes/manifests
71+
---
72+
apiVersion: kubeproxy.config.k8s.io/v1alpha1
73+
kind: KubeProxyConfiguration
74+
clusterCIDR: "10.244.0.0/16"
75+
metricsBindAddress: 0.0.0.0:10249
76+
conntrack:
77+
maxPerCore: 0
78+
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established"
79+
tcpEstablishedTimeout: 0s
80+
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close"
81+
tcpCloseWaitTimeout: 0s
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
apiVersion: kubeadm.k8s.io/v1beta4
2+
kind: InitConfiguration
3+
localAPIEndpoint:
4+
advertiseAddress: 1.1.1.1
5+
bindPort: 8443
6+
bootstrapTokens:
7+
- groups:
8+
- system:bootstrappers:kubeadm:default-node-token
9+
ttl: 24h0m0s
10+
usages:
11+
- signing
12+
- authentication
13+
nodeRegistration:
14+
criSocket: unix:///var/run/dockershim.sock
15+
name: "mk"
16+
kubeletExtraArgs:
17+
- name: "node-ip"
18+
value: "1.1.1.1"
19+
taints: []
20+
---
21+
apiVersion: kubeadm.k8s.io/v1beta4
22+
kind: ClusterConfiguration
23+
apiServer:
24+
certSANs: ["127.0.0.1", "localhost", "1.1.1.1"]
25+
extraArgs:
26+
- name: "enable-admission-plugins"
27+
value: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
28+
controllerManager:
29+
extraArgs:
30+
- name: "allocate-node-cidrs"
31+
value: "true"
32+
- name: "leader-elect"
33+
value: "false"
34+
scheduler:
35+
extraArgs:
36+
- name: "leader-elect"
37+
value: "false"
38+
certificatesDir: /var/lib/minikube/certs
39+
clusterName: mk
40+
controlPlaneEndpoint: control-plane.minikube.internal:8443
41+
etcd:
42+
local:
43+
dataDir: /var/lib/minikube/etcd
44+
extraArgs:
45+
- name: "listen-metrics-urls"
46+
value: "http://0.0.0.0:2381"
47+
kubernetesVersion: v1.33.0
48+
networking:
49+
dnsDomain: cluster.local
50+
podSubnet: "10.244.0.0/16"
51+
serviceSubnet: 10.96.0.0/12
52+
---
53+
apiVersion: kubelet.config.k8s.io/v1beta1
54+
kind: KubeletConfiguration
55+
authentication:
56+
x509:
57+
clientCAFile: /var/lib/minikube/certs/ca.crt
58+
cgroupDriver: systemd
59+
containerRuntimeEndpoint: unix:///var/run/dockershim.sock
60+
hairpinMode: hairpin-veth
61+
runtimeRequestTimeout: 15m
62+
clusterDomain: "cluster.local"
63+
# disable disk resource management by default
64+
imageGCHighThresholdPercent: 100
65+
evictionHard:
66+
nodefs.available: "0%"
67+
nodefs.inodesFree: "0%"
68+
imagefs.available: "0%"
69+
failSwapOn: false
70+
staticPodPath: /etc/kubernetes/manifests
71+
---
72+
apiVersion: kubeproxy.config.k8s.io/v1alpha1
73+
kind: KubeProxyConfiguration
74+
clusterCIDR: "10.244.0.0/16"
75+
metricsBindAddress: 0.0.0.0:10249
76+
conntrack:
77+
maxPerCore: 0
78+
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established"
79+
tcpEstablishedTimeout: 0s
80+
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close"
81+
tcpCloseWaitTimeout: 0s

0 commit comments

Comments
 (0)