Skip to content

Commit ea9d0de

Browse files
author
Ole Markus With
committed
Handle default in templating instead of ig population
1 parent 655d63c commit ea9d0de

20 files changed

+483
-64
lines changed

cloudmock/aws/mockec2/instances.go

+10
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,13 @@ func (m *MockEC2) DescribeInstanceTypes(*ec2.DescribeInstanceTypesInput) (*ec2.D
5656
klog.Warningf("MockEc2::DescribeInstanceTypes is stub-implemented")
5757
return &ec2.DescribeInstanceTypesOutput{}, nil
5858
}
59+
60+
func (m *MockEC2) GetInstanceTypesFromInstanceRequirements(input *ec2.GetInstanceTypesFromInstanceRequirementsInput) (*ec2.GetInstanceTypesFromInstanceRequirementsOutput, error) {
61+
return &ec2.GetInstanceTypesFromInstanceRequirementsOutput{
62+
InstanceTypes: []*ec2.InstanceTypeInfoFromInstanceRequirements{
63+
{
64+
InstanceType: aws.String("c5.large"),
65+
},
66+
},
67+
}, nil
68+
}

cmd/kops/integration_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,10 @@ func TestKarpenter(t *testing.T) {
608608
withAddons("karpenter.sh-k8s-1.19").
609609
withServiceAccountRole("karpenter.kube-system", true)
610610
test.expectTerraformFilenames = append(test.expectTerraformFilenames,
611-
"aws_launch_template_karpenter-nodes.minimal.example.com_user_data",
612-
"aws_s3_bucket_object_nodeupconfig-karpenter-nodes_content",
611+
"aws_launch_template_karpenter-nodes-single-machinetype.minimal.example.com_user_data",
612+
"aws_launch_template_karpenter-nodes-default.minimal.example.com_user_data",
613+
"aws_s3_bucket_object_nodeupconfig-karpenter-nodes-single-machinetype_content",
614+
"aws_s3_bucket_object_nodeupconfig-karpenter-nodes-default_content",
613615
)
614616
test.runTestTerraformAWS(t)
615617
}

pkg/model/awsmodel/autoscalinggroup.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ func (b *AutoscalingGroupModelBuilder) buildLaunchTemplateTask(c *fi.ModelBuilde
188188
ImageID: fi.String(ig.Spec.Image),
189189
InstanceInterruptionBehavior: ig.Spec.InstanceInterruptionBehavior,
190190
InstanceMonitoring: fi.Bool(false),
191-
InstanceType: fi.String(strings.Split(ig.Spec.MachineType, ",")[0]),
192191
IPv6AddressCount: fi.Int64(0),
193192
RootVolumeIops: fi.Int64(int64(fi.Int32Value(ig.Spec.RootVolumeIOPS))),
194193
RootVolumeOptimization: ig.Spec.RootVolumeOptimization,
@@ -201,6 +200,10 @@ func (b *AutoscalingGroupModelBuilder) buildLaunchTemplateTask(c *fi.ModelBuilde
201200
UserData: userData,
202201
}
203202

203+
if ig.Spec.Manager == kops.InstanceManagerCloudGroup {
204+
lt.InstanceType = fi.String(strings.Split(ig.Spec.MachineType, ",")[0])
205+
}
206+
204207
{
205208
// @step: check the subnets are ok and pull together an array for us
206209
subnets, err := b.GatherSubnets(ig)
@@ -493,7 +496,7 @@ func (b *AutoscalingGroupModelBuilder) buildAutoScalingGroupTask(c *fi.ModelBuil
493496
sort.Stable(awstasks.OrderTargetGroupsByName(t.TargetGroups))
494497

495498
// @step: are we using a mixed instance policy
496-
if ig.Spec.MixedInstancesPolicy != nil {
499+
if ig.Spec.MixedInstancesPolicy != nil && ig.Spec.Manager == kops.InstanceManagerCloudGroup {
497500
spec := ig.Spec.MixedInstancesPolicy
498501

499502
if spec.InstanceRequirements != nil {

tests/integration/create_cluster/karpenter/expected-v1alpha2.yaml

-7
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,9 @@ spec:
106106
instanceMetadata:
107107
httpPutResponseHopLimit: 1
108108
httpTokens: required
109-
machineType: t2.medium
110109
manager: Karpenter
111110
maxSize: 2
112111
minSize: 2
113-
mixedInstancesPolicy:
114-
instanceRequirements:
115-
cpu:
116-
min: "2"
117-
memory:
118-
min: 2G
119112
nodeLabels:
120113
kops.k8s.io/instancegroup: nodes
121114
role: Node

tests/integration/update_cluster/karpenter/data/aws_launch_template_karpenter-nodes.minimal.example.com_user_data tests/integration/update_cluster/karpenter/data/aws_launch_template_karpenter-nodes-default.minimal.example.com_user_data

+2-2
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ __EOF_CLUSTER_SPEC
157157
cat > conf/kube_env.yaml << '__EOF_KUBE_ENV'
158158
CloudProvider: aws
159159
ConfigBase: memfs://clusters.example.com/minimal.example.com
160-
InstanceGroupName: karpenter-nodes
160+
InstanceGroupName: karpenter-nodes-default
161161
InstanceGroupRole: Node
162-
NodeupConfigHash: t+F49agATFa5uzfEBWAy92YyGppKvMwc3MS9nlXVaY4=
162+
NodeupConfigHash: NtER4w+wD8tSbHFc3vxBJ1EomYSDw8Ie5hpVTurK7hg=
163163
164164
__EOF_KUBE_ENV
165165

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
#!/bin/bash
2+
set -o errexit
3+
set -o nounset
4+
set -o pipefail
5+
6+
NODEUP_URL_AMD64=https://artifacts.k8s.io/binaries/kops/1.21.0-alpha.1/linux/amd64/nodeup,https://github.com/kubernetes/kops/releases/download/v1.21.0-alpha.1/nodeup-linux-amd64
7+
NODEUP_HASH_AMD64=585fbda0f0a43184656b4bfc0cc5f0c0b85612faf43b8816acca1f99d422c924
8+
NODEUP_URL_ARM64=https://artifacts.k8s.io/binaries/kops/1.21.0-alpha.1/linux/arm64/nodeup,https://github.com/kubernetes/kops/releases/download/v1.21.0-alpha.1/nodeup-linux-arm64
9+
NODEUP_HASH_ARM64=7603675379699105a9b9915ff97718ea99b1bbb01a4c184e2f827c8a96e8e865
10+
11+
export AWS_REGION=us-test-1
12+
13+
14+
15+
16+
sysctl -w net.core.rmem_max=16777216 || true
17+
sysctl -w net.core.wmem_max=16777216 || true
18+
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216' || true
19+
sysctl -w net.ipv4.tcp_wmem='4096 87380 16777216' || true
20+
21+
22+
function ensure-install-dir() {
23+
INSTALL_DIR="/opt/kops"
24+
# On ContainerOS, we install under /var/lib/toolbox; /opt is ro and noexec
25+
if [[ -d /var/lib/toolbox ]]; then
26+
INSTALL_DIR="/var/lib/toolbox/kops"
27+
fi
28+
mkdir -p ${INSTALL_DIR}/bin
29+
mkdir -p ${INSTALL_DIR}/conf
30+
cd ${INSTALL_DIR}
31+
}
32+
33+
# Retry a download until we get it. args: name, sha, urls
34+
download-or-bust() {
35+
local -r file="$1"
36+
local -r hash="$2"
37+
local -r urls=( $(split-commas "$3") )
38+
39+
if [[ -f "${file}" ]]; then
40+
if ! validate-hash "${file}" "${hash}"; then
41+
rm -f "${file}"
42+
else
43+
return 0
44+
fi
45+
fi
46+
47+
while true; do
48+
for url in "${urls[@]}"; do
49+
commands=(
50+
"curl -f --compressed -Lo "${file}" --connect-timeout 20 --retry 6 --retry-delay 10"
51+
"wget --compression=auto -O "${file}" --connect-timeout=20 --tries=6 --wait=10"
52+
"curl -f -Lo "${file}" --connect-timeout 20 --retry 6 --retry-delay 10"
53+
"wget -O "${file}" --connect-timeout=20 --tries=6 --wait=10"
54+
)
55+
for cmd in "${commands[@]}"; do
56+
echo "Attempting download with: ${cmd} {url}"
57+
if ! (${cmd} "${url}"); then
58+
echo "== Download failed with ${cmd} =="
59+
continue
60+
fi
61+
if ! validate-hash "${file}" "${hash}"; then
62+
echo "== Hash validation of ${url} failed. Retrying. =="
63+
rm -f "${file}"
64+
else
65+
echo "== Downloaded ${url} (SHA256 = ${hash}) =="
66+
return 0
67+
fi
68+
done
69+
done
70+
71+
echo "All downloads failed; sleeping before retrying"
72+
sleep 60
73+
done
74+
}
75+
76+
validate-hash() {
77+
local -r file="$1"
78+
local -r expected="$2"
79+
local actual
80+
81+
actual=$(sha256sum ${file} | awk '{ print $1 }') || true
82+
if [[ "${actual}" != "${expected}" ]]; then
83+
echo "== ${file} corrupted, hash ${actual} doesn't match expected ${expected} =="
84+
return 1
85+
fi
86+
}
87+
88+
function split-commas() {
89+
echo $1 | tr "," "\n"
90+
}
91+
92+
function download-release() {
93+
case "$(uname -m)" in
94+
x86_64*|i?86_64*|amd64*)
95+
NODEUP_URL="${NODEUP_URL_AMD64}"
96+
NODEUP_HASH="${NODEUP_HASH_AMD64}"
97+
;;
98+
aarch64*|arm64*)
99+
NODEUP_URL="${NODEUP_URL_ARM64}"
100+
NODEUP_HASH="${NODEUP_HASH_ARM64}"
101+
;;
102+
*)
103+
echo "Unsupported host arch: $(uname -m)" >&2
104+
exit 1
105+
;;
106+
esac
107+
108+
cd ${INSTALL_DIR}/bin
109+
download-or-bust nodeup "${NODEUP_HASH}" "${NODEUP_URL}"
110+
111+
chmod +x nodeup
112+
113+
echo "Running nodeup"
114+
# We can't run in the foreground because of https://github.com/docker/docker/issues/23793
115+
( cd ${INSTALL_DIR}/bin; ./nodeup --install-systemd-unit --conf=${INSTALL_DIR}/conf/kube_env.yaml --v=8 )
116+
}
117+
118+
####################################################################################
119+
120+
/bin/systemd-machine-id-setup || echo "failed to set up ensure machine-id configured"
121+
122+
echo "== nodeup node config starting =="
123+
ensure-install-dir
124+
125+
cat > conf/cluster_spec.yaml << '__EOF_CLUSTER_SPEC'
126+
cloudConfig:
127+
awsEBSCSIDriver:
128+
enabled: false
129+
manageStorageClasses: true
130+
containerRuntime: containerd
131+
containerd:
132+
logLevel: info
133+
version: 1.4.12
134+
docker:
135+
skipInstall: true
136+
kubeProxy:
137+
clusterCIDR: 100.96.0.0/11
138+
cpuRequest: 100m
139+
image: k8s.gcr.io/kube-proxy:v1.21.0
140+
logLevel: 2
141+
kubelet:
142+
anonymousAuth: false
143+
cgroupDriver: systemd
144+
cgroupRoot: /
145+
cloudProvider: aws
146+
clusterDNS: 100.64.0.10
147+
clusterDomain: cluster.local
148+
enableDebuggingHandlers: true
149+
evictionHard: memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<10%,imagefs.inodesFree<5%
150+
kubeconfigPath: /var/lib/kubelet/kubeconfig
151+
logLevel: 2
152+
networkPluginName: cni
153+
podManifestPath: /etc/kubernetes/manifests
154+
155+
__EOF_CLUSTER_SPEC
156+
157+
cat > conf/kube_env.yaml << '__EOF_KUBE_ENV'
158+
CloudProvider: aws
159+
ConfigBase: memfs://clusters.example.com/minimal.example.com
160+
InstanceGroupName: karpenter-nodes-single-machinetype
161+
InstanceGroupRole: Node
162+
NodeupConfigHash: Jp+yk9rmc2zJKlWuhKUtlznZb7S6YqW6m9XKsxRoceA=
163+
164+
__EOF_KUBE_ENV
165+
166+
download-release
167+
echo "== nodeup node config done =="

tests/integration/update_cluster/karpenter/data/aws_s3_bucket_object_minimal.example.com-addons-bootstrap_content

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ spec:
5454
version: 9.99.0
5555
- id: k8s-1.19
5656
manifest: karpenter.sh/k8s-1.19.yaml
57-
manifestHash: 64a10d731b689842b2c27d950841d2d4073448f6a9d5ea1fd371f0c28327d13c
57+
manifestHash: e21c09e2b55aca845c28ce60c470ec78633e07f4842f146edb5a178354616958
5858
name: karpenter.sh
5959
selector:
6060
k8s-addon: karpenter.sh

tests/integration/update_cluster/karpenter/data/aws_s3_bucket_object_minimal.example.com-addons-karpenter.sh-k8s-1.19_content

+37-2
Original file line numberDiff line numberDiff line change
@@ -897,11 +897,46 @@ metadata:
897897
addon.kops.k8s.io/name: karpenter.sh
898898
app.kubernetes.io/managed-by: kops
899899
k8s-addon: karpenter.sh
900-
name: karpenter-nodes
900+
name: karpenter-nodes-default
901901
spec:
902902
provider:
903903
instanceProfile: nodes.minimal.example.com
904-
launchTemplate: karpenter-nodes.minimal.example.com
904+
launchTemplate: karpenter-nodes-default.minimal.example.com
905+
securityGroupSelector:
906+
Name: nodes.minimal.example.com
907+
subnetSelector:
908+
KubernetesCluster: minimal.example.com
909+
kubernetes.io/role/internal-elb: "1"
910+
requirements:
911+
- key: karpenter.sh/capacity-type
912+
operator: In
913+
values:
914+
- spot
915+
- key: kubernetes.io/arch
916+
operator: In
917+
values:
918+
- amd64
919+
- key: node.kubernetes.io/instance-type
920+
operator: In
921+
values:
922+
- c5.large
923+
ttlSecondsAfterEmpty: 30
924+
925+
---
926+
927+
apiVersion: karpenter.sh/v1alpha5
928+
kind: Provisioner
929+
metadata:
930+
creationTimestamp: null
931+
labels:
932+
addon.kops.k8s.io/name: karpenter.sh
933+
app.kubernetes.io/managed-by: kops
934+
k8s-addon: karpenter.sh
935+
name: karpenter-nodes-single-machinetype
936+
spec:
937+
provider:
938+
instanceProfile: nodes.minimal.example.com
939+
launchTemplate: karpenter-nodes-single-machinetype.minimal.example.com
905940
securityGroupSelector:
906941
Name: nodes.minimal.example.com
907942
subnetSelector:

tests/integration/update_cluster/karpenter/data/aws_s3_bucket_object_nodeupconfig-karpenter-nodes_content tests/integration/update_cluster/karpenter/data/aws_s3_bucket_object_nodeupconfig-karpenter-nodes-default_content

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ KubeletConfig:
5050
logLevel: 2
5151
networkPluginName: cni
5252
nodeLabels:
53-
karpenter.sh/provisioner-name: karpenter-nodes
53+
karpenter.sh/provisioner-name: karpenter-nodes-default
5454
kubernetes.io/role: node
5555
node-role.kubernetes.io/node: ""
5656
podManifestPath: /etc/kubernetes/manifests
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
Assets:
2+
amd64:
3+
- 681c81b7934ae2bf38b9f12d891683972d1fbbf6d7d97e50940a47b139d41b35@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubelet
4+
- 9f74f2fa7ee32ad07e17211725992248470310ca1988214518806b39b1dad9f0@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubectl
5+
- 977824932d5667c7a37aa6a3cbba40100a6873e7bd97e83e8be837e3e7afd0a8@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz
6+
- f6120552408175ca332fd3b5d31c5edd115d8426d6731664e4ea3951c5eee3b4@https://github.com/containerd/containerd/releases/download/v1.4.12/cri-containerd-cni-1.4.12-linux-amd64.tar.gz
7+
arm64:
8+
- 17832b192be5ea314714f7e16efd5e5f65347974bbbf41def6b02f68931380c4@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/arm64/kubelet
9+
- a4dd7100f547a40d3e2f83850d0bab75c6ea5eb553f0a80adcf73155bef1fd0d@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/arm64/kubectl
10+
- ae13d7b5c05bd180ea9b5b68f44bdaa7bfb41034a2ef1d68fd8e1259797d642f@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.7/cni-plugins-linux-arm64-v0.8.7.tgz
11+
- 87a4219c54552797ffd38790b72832372a90eceb7c8e451c36a682093d57dae6@https://download.docker.com/linux/static/stable/aarch64/docker-20.10.11.tgz
12+
CAs:
13+
kubernetes-ca: |
14+
-----BEGIN CERTIFICATE-----
15+
MIIBbjCCARigAwIBAgIMFpANqBD8NSD82AUSMA0GCSqGSIb3DQEBCwUAMBgxFjAU
16+
BgNVBAMTDWt1YmVybmV0ZXMtY2EwHhcNMjEwNzA3MDcwODAwWhcNMzEwNzA3MDcw
17+
ODAwWjAYMRYwFAYDVQQDEw1rdWJlcm5ldGVzLWNhMFwwDQYJKoZIhvcNAQEBBQAD
18+
SwAwSAJBANFI3zr0Tk8krsW8vwjfMpzJOlWQ8616vG3YPa2qAgI7V4oKwfV0yIg1
19+
jt+H6f4P/wkPAPTPTfRp9Iy8oHEEFw0CAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEG
20+
MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNG3zVjTcLlJwDsJ4/K9DV7KohUA
21+
MA0GCSqGSIb3DQEBCwUAA0EAB8d03fY2w7WKpfO29qI295pu2C4ca9AiVGOpgSc8
22+
tmQsq6rcxt3T+rb589PVtz0mw/cKTxOk6gH2CCC+yHfy2w==
23+
-----END CERTIFICATE-----
24+
-----BEGIN CERTIFICATE-----
25+
MIIBbjCCARigAwIBAgIMFpANvmSa0OAlYmXKMA0GCSqGSIb3DQEBCwUAMBgxFjAU
26+
BgNVBAMTDWt1YmVybmV0ZXMtY2EwHhcNMjEwNzA3MDcwOTM2WhcNMzEwNzA3MDcw
27+
OTM2WjAYMRYwFAYDVQQDEw1rdWJlcm5ldGVzLWNhMFwwDQYJKoZIhvcNAQEBBQAD
28+
SwAwSAJBAMF6F4aZdpe0RUpyykaBpWwZCnwbffhYGOw+fs6RdLuUq7QCNmJm/Eq7
29+
WWOziMYDiI9SbclpD+6QiJ0N3EqppVUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEG
30+
MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLImp6ARjPDAH6nhI+scWVt3Q9bn
31+
MA0GCSqGSIb3DQEBCwUAA0EAVQVx5MUtuAIeePuP9o51xtpT2S6Fvfi8J4ICxnlA
32+
9B7UD2ushcVFPtaeoL9Gfu8aY4KJBeqqg5ojl4qmRnThjw==
33+
-----END CERTIFICATE-----
34+
ClusterName: minimal.example.com
35+
Hooks:
36+
- null
37+
- null
38+
KeypairIDs:
39+
kubernetes-ca: "6982820025135291416230495506"
40+
KubeletConfig:
41+
anonymousAuth: false
42+
cgroupDriver: systemd
43+
cgroupRoot: /
44+
cloudProvider: aws
45+
clusterDNS: 100.64.0.10
46+
clusterDomain: cluster.local
47+
enableDebuggingHandlers: true
48+
evictionHard: memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<10%,imagefs.inodesFree<5%
49+
kubeconfigPath: /var/lib/kubelet/kubeconfig
50+
logLevel: 2
51+
networkPluginName: cni
52+
nodeLabels:
53+
karpenter.sh/provisioner-name: karpenter-nodes-single-machinetype
54+
kubernetes.io/role: node
55+
node-role.kubernetes.io/node: ""
56+
podManifestPath: /etc/kubernetes/manifests
57+
UpdatePolicy: automatic
58+
channels:
59+
- memfs://clusters.example.com/minimal.example.com/addons/bootstrap-channel.yaml
60+
containerdConfig:
61+
logLevel: info
62+
version: 1.4.12

0 commit comments

Comments
 (0)