Merge pull request #13026 from johngmyers/ipv6-only

Allow IPv6-only subnets
This commit is contained in:
Kubernetes Prow Robot 2021-12-24 02:24:14 -08:00 committed by GitHub
commit e95e359e3a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 165 additions and 63 deletions

View File

@ -299,7 +299,7 @@ func TestMinimalIPv6(t *testing.T) {
// TestMinimalIPv6 runs the test on a minimum IPv6 configuration
func TestMinimalIPv6Private(t *testing.T) {
newIntegrationTest("minimal-ipv6.example.com", "minimal-ipv6-private").
withAddons(awsCCMAddon, awsEBSCSIAddon, dnsControllerAddon).
withAddons(awsCCMAddon, awsEBSCSIAddon, dnsControllerAddon, leaderElectionAddon).
runTestTerraformAWS(t)
}

View File

@ -338,7 +338,11 @@ func ValidateCluster(c *kops.Cluster, strict bool) field.ErrorList {
fieldSubnet := fieldSpec.Child("subnets").Index(i)
if s.CIDR == "" {
if requiresSubnetCIDR && strict {
allErrs = append(allErrs, field.Required(fieldSubnet.Child("cidr"), "subnet did not have a cidr set"))
if !strings.Contains(c.Spec.NonMasqueradeCIDR, ":") || s.IPv6CIDR == "" {
allErrs = append(allErrs, field.Required(fieldSubnet.Child("cidr"), "subnet did not have a cidr set"))
} else if c.IsKubernetesLT("1.23") {
allErrs = append(allErrs, field.Required(fieldSubnet.Child("cidr"), "IPv6-only subnets require Kubernetes 1.23+"))
}
}
} else {
_, subnetCIDR, err := net.ParseCIDR(s.CIDR)

View File

@ -104,7 +104,7 @@ func validateClusterSpec(spec *kops.ClusterSpec, c *kops.Cluster, fieldPath *fie
}
if spec.Topology != nil {
allErrs = append(allErrs, validateTopology(spec.Topology, fieldPath.Child("topology"))...)
allErrs = append(allErrs, validateTopology(c, spec.Topology, fieldPath.Child("topology"))...)
}
// UpdatePolicy
@ -360,7 +360,7 @@ func validateIPv6CIDR(cidr string, fieldPath *field.Path) field.ErrorList {
return allErrs
}
func validateTopology(topology *kops.TopologySpec, fieldPath *field.Path) field.ErrorList {
func validateTopology(c *kops.Cluster, topology *kops.TopologySpec, fieldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
if topology.Masters == "" {
@ -373,6 +373,10 @@ func validateTopology(topology *kops.TopologySpec, fieldPath *field.Path) field.
allErrs = append(allErrs, field.Required(fieldPath.Child("nodes"), ""))
} else {
allErrs = append(allErrs, IsValidValue(fieldPath.Child("nodes"), &topology.Nodes, kops.SupportedTopologies)...)
if topology.Nodes == "private" && c.Spec.IsIPv6Only() && c.IsKubernetesLT("1.23") {
allErrs = append(allErrs, field.Forbidden(fieldPath.Child("nodes"), "private topology in IPv6 clusters requires Kubernetes 1.23+"))
}
}
if topology.Bastion != nil {

View File

@ -254,7 +254,6 @@ func (b *NetworkModelBuilder) Build(c *fi.ModelBuilderContext) error {
Lifecycle: b.Lifecycle,
VPC: b.LinkToVPC(),
AvailabilityZone: fi.String(subnetSpec.Zone),
CIDR: fi.String(subnetSpec.CIDR),
Shared: fi.Bool(sharedSubnet),
Tags: tags,
}
@ -263,6 +262,10 @@ func (b *NetworkModelBuilder) Build(c *fi.ModelBuilderContext) error {
subnet.ResourceBasedNaming = fi.Bool(true)
}
if subnetSpec.CIDR != "" {
subnet.CIDR = fi.String(subnetSpec.CIDR)
}
if subnetSpec.IPv6CIDR != "" {
if !sharedVPC {
subnet.AmazonIPv6CIDR = b.LinkToAmazonVPCIPv6CIDR()

View File

@ -134,15 +134,15 @@ cloudConfig:
containerRuntime: containerd
containerd:
logLevel: info
version: 1.4.12
version: 1.6.0-beta.4
docker:
skipInstall: true
encryptionConfig: null
etcdClusters:
events:
version: 3.4.13
version: 3.5.1
main:
version: 3.4.13
version: 3.5.1
kubeAPIServer:
allowPrivileged: true
anonymousAuth: false
@ -166,7 +166,7 @@ kubeAPIServer:
- https://127.0.0.1:4001
etcdServersOverrides:
- /events#https://127.0.0.1:4002
image: k8s.gcr.io/kube-apiserver:v1.21.0
image: k8s.gcr.io/kube-apiserver:v1.23.0
kubeletPreferredAddressTypes:
- InternalIP
- Hostname
@ -196,17 +196,17 @@ kubeControllerManager:
- -nodeipam
featureGates:
CSIMigrationAWS: "true"
image: k8s.gcr.io/kube-controller-manager:v1.21.0
image: k8s.gcr.io/kube-controller-manager:v1.23.0
leaderElection:
leaderElect: true
logLevel: 2
useServiceAccountCredentials: true
kubeProxy:
cpuRequest: 100m
image: k8s.gcr.io/kube-proxy:v1.21.0
image: k8s.gcr.io/kube-proxy:v1.23.0
logLevel: 2
kubeScheduler:
image: k8s.gcr.io/kube-scheduler:v1.21.0
image: k8s.gcr.io/kube-scheduler:v1.23.0
leaderElection:
leaderElect: true
logLevel: 2
@ -226,6 +226,7 @@ kubelet:
logLevel: 2
networkPluginName: cni
podManifestPath: /etc/kubernetes/manifests
protectKernelDefaults: true
masterKubelet:
anonymousAuth: false
cgroupDriver: systemd
@ -242,6 +243,7 @@ masterKubelet:
logLevel: 2
networkPluginName: cni
podManifestPath: /etc/kubernetes/manifests
protectKernelDefaults: true
registerSchedulable: false
__EOF_CLUSTER_SPEC
@ -251,7 +253,7 @@ CloudProvider: aws
ConfigBase: memfs://clusters.example.com/minimal-ipv6.example.com
InstanceGroupName: master-us-test-1a
InstanceGroupRole: Master
NodeupConfigHash: 125RlQGI9pGb/KE6nPLwc48XGm9VQ4cnTWB2ijOHGtw=
NodeupConfigHash: lhBGIbUgHvtWo0RjBS5OMF+gfW20GroKLr1lB9zTiK4=
__EOF_KUBE_ENV

View File

@ -134,12 +134,12 @@ cloudConfig:
containerRuntime: containerd
containerd:
logLevel: info
version: 1.4.12
version: 1.6.0-beta.4
docker:
skipInstall: true
kubeProxy:
cpuRequest: 100m
image: k8s.gcr.io/kube-proxy:v1.21.0
image: k8s.gcr.io/kube-proxy:v1.23.0
logLevel: 2
kubelet:
anonymousAuth: false
@ -157,6 +157,7 @@ kubelet:
logLevel: 2
networkPluginName: cni
podManifestPath: /etc/kubernetes/manifests
protectKernelDefaults: true
__EOF_CLUSTER_SPEC
@ -165,7 +166,7 @@ CloudProvider: aws
ConfigBase: memfs://clusters.example.com/minimal-ipv6.example.com
InstanceGroupName: nodes
InstanceGroupRole: Node
NodeupConfigHash: Pyc1ooFcHOEr89bybwfSkbPNXGlCaXmLybVqMYEbaZo=
NodeupConfigHash: /2OlsRVRArRL6ffpG51ysZBDm3bfGrJv38ryXueFgMk=
__EOF_KUBE_ENV

View File

@ -24,7 +24,7 @@ spec:
clusterCIDR: ::/0
clusterName: minimal-ipv6.example.com
configureCloudRoutes: false
image: k8s.gcr.io/provider-aws/cloud-controller-manager:v1.21.0-alpha.0
image: gcr.io/k8s-staging-provider-aws/cloud-controller-manager:latest
cloudProvider: aws
clusterDNSDomain: cluster.local
configBase: memfs://clusters.example.com/minimal-ipv6.example.com
@ -32,7 +32,7 @@ spec:
containerRuntime: containerd
containerd:
logLevel: info
version: 1.4.12
version: 1.6.0-beta.4
dnsZone: Z1AFAKE1ZON3YO
docker:
skipInstall: true
@ -43,14 +43,14 @@ spec:
- instanceGroup: master-us-test-1a
name: us-test-1a
name: main
version: 3.4.13
version: 3.5.1
- backups:
backupStore: memfs://clusters.example.com/minimal-ipv6.example.com/backups/etcd/events
etcdMembers:
- instanceGroup: master-us-test-1a
name: us-test-1a
name: events
version: 3.4.13
version: 3.5.1
externalDns:
provider: dns-controller
iam:
@ -79,7 +79,7 @@ spec:
- https://127.0.0.1:4001
etcdServersOverrides:
- /events#https://127.0.0.1:4002
image: k8s.gcr.io/kube-apiserver:v1.21.0
image: k8s.gcr.io/kube-apiserver:v1.23.0
kubeletPreferredAddressTypes:
- InternalIP
- Hostname
@ -109,7 +109,7 @@ spec:
- -nodeipam
featureGates:
CSIMigrationAWS: "true"
image: k8s.gcr.io/kube-controller-manager:v1.21.0
image: k8s.gcr.io/kube-controller-manager:v1.23.0
leaderElection:
leaderElect: true
logLevel: 2
@ -132,10 +132,10 @@ spec:
- fd00:ec2::253
kubeProxy:
cpuRequest: 100m
image: k8s.gcr.io/kube-proxy:v1.21.0
image: k8s.gcr.io/kube-proxy:v1.23.0
logLevel: 2
kubeScheduler:
image: k8s.gcr.io/kube-scheduler:v1.21.0
image: k8s.gcr.io/kube-scheduler:v1.23.0
leaderElection:
leaderElect: true
logLevel: 2
@ -155,10 +155,11 @@ spec:
logLevel: 2
networkPluginName: cni
podManifestPath: /etc/kubernetes/manifests
protectKernelDefaults: true
kubernetesApiAccess:
- 0.0.0.0/0
- ::/0
kubernetesVersion: 1.21.0
kubernetesVersion: 1.23.0
masterInternalName: api.internal.minimal-ipv6.example.com
masterKubelet:
anonymousAuth: false
@ -176,6 +177,7 @@ spec:
logLevel: 2
networkPluginName: cni
podManifestPath: /etc/kubernetes/manifests
protectKernelDefaults: true
registerSchedulable: false
masterPublicName: api.minimal-ipv6.example.com
networkCIDR: 172.20.0.0/16

View File

@ -1,4 +1,4 @@
{
"memberCount": 1,
"etcdVersion": "3.4.13"
"etcdVersion": "3.5.1"
}

View File

@ -1,4 +1,4 @@
{
"memberCount": 1,
"etcdVersion": "3.4.13"
"etcdVersion": "3.5.1"
}

View File

@ -31,7 +31,7 @@ spec:
env:
- name: KUBERNETES_SERVICE_HOST
value: 127.0.0.1
image: k8s.gcr.io/provider-aws/cloud-controller-manager:v1.21.0-alpha.0
image: gcr.io/k8s-staging-provider-aws/cloud-controller-manager:latest
imagePullPolicy: IfNotPresent
name: aws-cloud-controller-manager
resources:

View File

@ -6,7 +6,7 @@ spec:
addons:
- id: k8s-1.16
manifest: kops-controller.addons.k8s.io/k8s-1.16.yaml
manifestHash: 37b1ce4604ef11ae982a5d6f67af2f7865a9a75280cdf21911274a50a2438ed0
manifestHash: f11dedb11c9ee1f3cc9edef8f3c2c59e84e8a3b81acef0e4b99236d9fb67b54c
name: kops-controller.addons.k8s.io
needsRollingUpdate: control-plane
selector:
@ -32,6 +32,13 @@ spec:
selector:
k8s-addon: kubelet-api.rbac.addons.k8s.io
version: 9.99.0
- id: k8s-1.23
manifest: leader-migration.rbac.addons.k8s.io/k8s-1.23.yaml
manifestHash: 6211e71f8175cebcba7812f74c41d175604cbff7bab9ac788f80bac290a7b981
name: leader-migration.rbac.addons.k8s.io
selector:
k8s-addon: leader-migration.rbac.addons.k8s.io
version: 9.99.0
- manifest: limit-range.addons.k8s.io/v1.5.0.yaml
manifestHash: 2d55c3bc5e354e84a3730a65b42f39aba630a59dc8d32b30859fcce3d3178bc2
name: limit-range.addons.k8s.io
@ -54,7 +61,7 @@ spec:
version: 9.99.0
- id: k8s-1.18
manifest: aws-cloud-controller.addons.k8s.io/k8s-1.18.yaml
manifestHash: 2177fcb1b508f6e280e888dd76cc8ac82847df6c25781e7ee90d563955a3cd9d
manifestHash: ad120019d9cfca34c49d8fdc1b8a8da58cc8b68c0e18edf7a367ee4d7147973d
name: aws-cloud-controller.addons.k8s.io
selector:
k8s-addon: aws-cloud-controller.addons.k8s.io

View File

@ -1,7 +1,7 @@
apiVersion: v1
data:
config.yaml: |
{"cloud":"aws","configBase":"memfs://clusters.example.com/minimal-ipv6.example.com","server":{"Listen":":3988","provider":{"aws":{"nodesRoles":["nodes.minimal-ipv6.example.com"],"Region":"us-test-1"}},"serverKeyPath":"/etc/kubernetes/kops-controller/pki/kops-controller.key","serverCertificatePath":"/etc/kubernetes/kops-controller/pki/kops-controller.crt","caBasePath":"/etc/kubernetes/kops-controller/pki","signingCAs":["kubernetes-ca"],"certNames":["kubelet","kubelet-server","kube-proxy"]},"enableCloudIPAM":true}
{"cloud":"aws","configBase":"memfs://clusters.example.com/minimal-ipv6.example.com","server":{"Listen":":3988","provider":{"aws":{"nodesRoles":["nodes.minimal-ipv6.example.com"],"Region":"us-test-1"}},"serverKeyPath":"/etc/kubernetes/kops-controller/pki/kops-controller.key","serverCertificatePath":"/etc/kubernetes/kops-controller/pki/kops-controller.crt","caBasePath":"/etc/kubernetes/kops-controller/pki","signingCAs":["kubernetes-ca"],"certNames":["kubelet","kubelet-server","kube-proxy"],"useInstanceIDForNodeName":true},"enableCloudIPAM":true}
kind: ConfigMap
metadata:
creationTimestamp: null

View File

@ -0,0 +1,49 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
creationTimestamp: null
labels:
addon.kops.k8s.io/name: leader-migration.rbac.addons.k8s.io
app.kubernetes.io/managed-by: kops
k8s-addon: leader-migration.rbac.addons.k8s.io
name: system::leader-locking-migration
namespace: kube-system
rules:
- apiGroups:
- coordination.k8s.io
resourceNames:
- cloud-provider-extraction-migration
resources:
- leases
verbs:
- create
- list
- get
- update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
creationTimestamp: null
labels:
addon.kops.k8s.io/name: leader-migration.rbac.addons.k8s.io
app.kubernetes.io/managed-by: kops
k8s-addon: leader-migration.rbac.addons.k8s.io
name: system::leader-locking-migration
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: system::leader-locking-migration
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: system:kube-controller-manager
- kind: ServiceAccount
name: kube-controller-manager
namespace: kube-system
- kind: ServiceAccount
name: aws-cloud-controller-manager
namespace: kube-system

View File

@ -22,7 +22,7 @@ APIServerConfig:
- https://127.0.0.1:4001
etcdServersOverrides:
- /events#https://127.0.0.1:4002
image: k8s.gcr.io/kube-apiserver:v1.21.0
image: k8s.gcr.io/kube-apiserver:v1.23.0
kubeletPreferredAddressTypes:
- InternalIP
- Hostname
@ -52,17 +52,17 @@ APIServerConfig:
-----END RSA PUBLIC KEY-----
Assets:
amd64:
- 681c81b7934ae2bf38b9f12d891683972d1fbbf6d7d97e50940a47b139d41b35@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubelet
- 9f74f2fa7ee32ad07e17211725992248470310ca1988214518806b39b1dad9f0@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubectl
- 977824932d5667c7a37aa6a3cbba40100a6873e7bd97e83e8be837e3e7afd0a8@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz
- f6120552408175ca332fd3b5d31c5edd115d8426d6731664e4ea3951c5eee3b4@https://github.com/containerd/containerd/releases/download/v1.4.12/cri-containerd-cni-1.4.12-linux-amd64.tar.gz
- 4756ff345dd80704b749d87efb8eb294a143a1f4a251ec586197d26ad20ea518@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/amd64/kubelet
- 2d0f5ba6faa787878b642c151ccb2c3390ce4c1e6c8e2b59568b3869ba407c4f@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/amd64/kubectl
- 962100bbc4baeaaa5748cdbfce941f756b1531c2eadb290129401498bfac21e7@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.9.1/cni-plugins-linux-amd64-v0.9.1.tgz
- 9a33654970a73bec7ae32b1e7dffd4dd0217291ca2072f6944e241ee1b1d7fe5@https://github.com/containerd/containerd/releases/download/v1.6.0-beta.4/cri-containerd-cni-1.6.0-beta.4-linux-amd64.tar.gz
- f90ed6dcef534e6d1ae17907dc7eb40614b8945ad4af7f0e98d2be7cde8165c6@https://artifacts.k8s.io/binaries/kops/1.21.0-alpha.1/linux/amd64/protokube,https://github.com/kubernetes/kops/releases/download/v1.21.0-alpha.1/protokube-linux-amd64
- 9992e7eb2a2e93f799e5a9e98eb718637433524bc65f630357201a79f49b13d0@https://artifacts.k8s.io/binaries/kops/1.21.0-alpha.1/linux/amd64/channels,https://github.com/kubernetes/kops/releases/download/v1.21.0-alpha.1/channels-linux-amd64
arm64:
- 17832b192be5ea314714f7e16efd5e5f65347974bbbf41def6b02f68931380c4@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/arm64/kubelet
- a4dd7100f547a40d3e2f83850d0bab75c6ea5eb553f0a80adcf73155bef1fd0d@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/arm64/kubectl
- ae13d7b5c05bd180ea9b5b68f44bdaa7bfb41034a2ef1d68fd8e1259797d642f@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.7/cni-plugins-linux-arm64-v0.8.7.tgz
- 87a4219c54552797ffd38790b72832372a90eceb7c8e451c36a682093d57dae6@https://download.docker.com/linux/static/stable/aarch64/docker-20.10.11.tgz
- a546fb7ccce69c4163e4a0b19a31f30ea039b4e4560c23fd6e3016e2b2dfd0d9@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/arm64/kubelet
- 1d77d6027fc8dfed772609ad9bd68f611b7e4ce73afa949f27084ad3a92b15fe@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/arm64/kubectl
- ef17764ffd6cdcb16d76401bac1db6acc050c9b088f1be5efa0e094ea3b01df0@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.9.1/cni-plugins-linux-arm64-v0.9.1.tgz
- c84a7600a5d95306be48c85a5966011f714ee78ba990ee4526b25f042d17528d@https://github.com/containerd/containerd/releases/download/v1.6.0-beta.4/cri-containerd-cni-1.6.0-beta.4-linux-arm64.tar.gz
- 2f599c3d54f4c4bdbcc95aaf0c7b513a845d8f9503ec5b34c9f86aa1bc34fc0c@https://artifacts.k8s.io/binaries/kops/1.21.0-alpha.1/linux/arm64/protokube,https://github.com/kubernetes/kops/releases/download/v1.21.0-alpha.1/protokube-linux-arm64
- 9d842e3636a95de2315cdea2be7a282355aac0658ef0b86d5dc2449066538f13@https://artifacts.k8s.io/binaries/kops/1.21.0-alpha.1/linux/arm64/channels,https://github.com/kubernetes/kops/releases/download/v1.21.0-alpha.1/channels-linux-arm64
CAs:
@ -252,16 +252,18 @@ KubeletConfig:
node-role.kubernetes.io/master: ""
node.kubernetes.io/exclude-from-external-load-balancers: ""
podManifestPath: /etc/kubernetes/manifests
protectKernelDefaults: true
registerSchedulable: false
UpdatePolicy: automatic
channels:
- memfs://clusters.example.com/minimal-ipv6.example.com/addons/bootstrap-channel.yaml
containerdConfig:
logLevel: info
version: 1.4.12
version: 1.6.0-beta.4
etcdManifests:
- memfs://clusters.example.com/minimal-ipv6.example.com/manifests/etcd/main.yaml
- memfs://clusters.example.com/minimal-ipv6.example.com/manifests/etcd/events.yaml
staticManifests:
- key: kube-apiserver-healthcheck
path: manifests/static/kube-apiserver-healthcheck.yaml
useInstanceIDForNodeName: true

View File

@ -1,14 +1,14 @@
Assets:
amd64:
- 681c81b7934ae2bf38b9f12d891683972d1fbbf6d7d97e50940a47b139d41b35@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubelet
- 9f74f2fa7ee32ad07e17211725992248470310ca1988214518806b39b1dad9f0@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubectl
- 977824932d5667c7a37aa6a3cbba40100a6873e7bd97e83e8be837e3e7afd0a8@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz
- f6120552408175ca332fd3b5d31c5edd115d8426d6731664e4ea3951c5eee3b4@https://github.com/containerd/containerd/releases/download/v1.4.12/cri-containerd-cni-1.4.12-linux-amd64.tar.gz
- 4756ff345dd80704b749d87efb8eb294a143a1f4a251ec586197d26ad20ea518@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/amd64/kubelet
- 2d0f5ba6faa787878b642c151ccb2c3390ce4c1e6c8e2b59568b3869ba407c4f@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/amd64/kubectl
- 962100bbc4baeaaa5748cdbfce941f756b1531c2eadb290129401498bfac21e7@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.9.1/cni-plugins-linux-amd64-v0.9.1.tgz
- 9a33654970a73bec7ae32b1e7dffd4dd0217291ca2072f6944e241ee1b1d7fe5@https://github.com/containerd/containerd/releases/download/v1.6.0-beta.4/cri-containerd-cni-1.6.0-beta.4-linux-amd64.tar.gz
arm64:
- 17832b192be5ea314714f7e16efd5e5f65347974bbbf41def6b02f68931380c4@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/arm64/kubelet
- a4dd7100f547a40d3e2f83850d0bab75c6ea5eb553f0a80adcf73155bef1fd0d@https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/arm64/kubectl
- ae13d7b5c05bd180ea9b5b68f44bdaa7bfb41034a2ef1d68fd8e1259797d642f@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.7/cni-plugins-linux-arm64-v0.8.7.tgz
- 87a4219c54552797ffd38790b72832372a90eceb7c8e451c36a682093d57dae6@https://download.docker.com/linux/static/stable/aarch64/docker-20.10.11.tgz
- a546fb7ccce69c4163e4a0b19a31f30ea039b4e4560c23fd6e3016e2b2dfd0d9@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/arm64/kubelet
- 1d77d6027fc8dfed772609ad9bd68f611b7e4ce73afa949f27084ad3a92b15fe@https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/arm64/kubectl
- ef17764ffd6cdcb16d76401bac1db6acc050c9b088f1be5efa0e094ea3b01df0@https://storage.googleapis.com/k8s-artifacts-cni/release/v0.9.1/cni-plugins-linux-arm64-v0.9.1.tgz
- c84a7600a5d95306be48c85a5966011f714ee78ba990ee4526b25f042d17528d@https://github.com/containerd/containerd/releases/download/v1.6.0-beta.4/cri-containerd-cni-1.6.0-beta.4-linux-arm64.tar.gz
CAs:
kubernetes-ca: |
-----BEGIN CERTIFICATE-----
@ -56,9 +56,11 @@ KubeletConfig:
kubernetes.io/role: node
node-role.kubernetes.io/node: ""
podManifestPath: /etc/kubernetes/manifests
protectKernelDefaults: true
UpdatePolicy: automatic
channels:
- memfs://clusters.example.com/minimal-ipv6.example.com/addons/bootstrap-channel.yaml
containerdConfig:
logLevel: info
version: 1.4.12
version: 1.6.0-beta.4
useInstanceIDForNodeName: true

View File

@ -33,7 +33,7 @@ spec:
iam: {}
kubelet:
anonymousAuth: false
kubernetesVersion: v1.21.0
kubernetesVersion: v1.23.0
masterInternalName: api.internal.minimal-ipv6.example.com
masterPublicName: api.minimal-ipv6.example.com
networkCIDR: 172.20.0.0/16

View File

@ -818,6 +818,14 @@ resource "aws_s3_bucket_object" "minimal-ipv6-example-com-addons-kubelet-api-rba
server_side_encryption = "AES256"
}
resource "aws_s3_bucket_object" "minimal-ipv6-example-com-addons-leader-migration-rbac-addons-k8s-io-k8s-1-23" {
bucket = "testingBucket"
content = file("${path.module}/data/aws_s3_bucket_object_minimal-ipv6.example.com-addons-leader-migration.rbac.addons.k8s.io-k8s-1.23_content")
key = "clusters.example.com/minimal-ipv6.example.com/addons/leader-migration.rbac.addons.k8s.io/k8s-1.23.yaml"
provider = aws.files
server_side_encryption = "AES256"
}
resource "aws_s3_bucket_object" "minimal-ipv6-example-com-addons-limit-range-addons-k8s-io" {
bucket = "testingBucket"
content = file("${path.module}/data/aws_s3_bucket_object_minimal-ipv6.example.com-addons-limit-range.addons.k8s.io_content")

View File

@ -106,7 +106,7 @@ func (e *Subnet) Find(c *fi.Context) (*Subnet, error) {
actual.ResourceBasedNaming = fi.Bool(aws.StringValue(subnet.PrivateDnsNameOptionsOnLaunch.HostnameType) == ec2.HostnameTypeResourceName)
if *actual.ResourceBasedNaming {
if !aws.BoolValue(subnet.PrivateDnsNameOptionsOnLaunch.EnableResourceNameDnsARecord) {
if fi.StringValue(actual.CIDR) != "" && !aws.BoolValue(subnet.PrivateDnsNameOptionsOnLaunch.EnableResourceNameDnsARecord) {
actual.ResourceBasedNaming = nil
}
if fi.StringValue(actual.IPv6CIDR) != "" && !aws.BoolValue(subnet.PrivateDnsNameOptionsOnLaunch.EnableResourceNameDnsAAAARecord) {
@ -175,9 +175,8 @@ func (s *Subnet) CheckChanges(a, e, changes *Subnet) error {
errors = append(errors, field.Required(fieldPath.Child("VPC"), "must specify a VPC"))
}
if e.CIDR == nil {
// TODO: Auto-assign CIDR?
errors = append(errors, field.Required(fieldPath.Child("CIDR"), "must specify a CIDR"))
if e.CIDR == nil && e.IPv6CIDR == nil {
errors = append(errors, field.Required(fieldPath.Child("CIDR"), "must specify a CIDR or IPv6CIDR"))
}
}
@ -256,7 +255,7 @@ func (_ *Subnet) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Subnet) error {
}
if a == nil {
klog.V(2).Infof("Creating Subnet with CIDR: %q", *e.CIDR)
klog.V(2).Infof("Creating Subnet with CIDR: %q IPv6CIDR: %q", fi.StringValue(e.CIDR), fi.StringValue(e.IPv6CIDR))
request := &ec2.CreateSubnetInput{
CidrBlock: e.CIDR,
@ -266,6 +265,10 @@ func (_ *Subnet) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Subnet) error {
TagSpecifications: awsup.EC2TagSpecification(ec2.ResourceTypeSubnet, e.Tags),
}
if e.CIDR == nil {
request.Ipv6Native = aws.Bool(true)
}
response, err := t.Cloud.EC2().CreateSubnet(request)
if err != nil {
return fmt.Errorf("error creating subnet: %v", err)
@ -300,13 +303,24 @@ func (_ *Subnet) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Subnet) error {
return fmt.Errorf("error modifying hostname type: %w", err)
}
request = &ec2.ModifySubnetAttributeInput{
SubnetId: e.ID,
EnableResourceNameDnsARecordOnLaunch: &ec2.AttributeBooleanValue{Value: changes.ResourceBasedNaming},
}
_, err = t.Cloud.EC2().ModifySubnetAttribute(request)
if err != nil {
return fmt.Errorf("error modifying A records: %w", err)
if fi.StringValue(e.CIDR) == "" {
request = &ec2.ModifySubnetAttributeInput{
SubnetId: e.ID,
EnableDns64: &ec2.AttributeBooleanValue{Value: aws.Bool(true)},
}
_, err = t.Cloud.EC2().ModifySubnetAttribute(request)
if err != nil {
return fmt.Errorf("error enabling DNS64: %w", err)
}
} else {
request = &ec2.ModifySubnetAttributeInput{
SubnetId: e.ID,
EnableResourceNameDnsARecordOnLaunch: &ec2.AttributeBooleanValue{Value: changes.ResourceBasedNaming},
}
_, err = t.Cloud.EC2().ModifySubnetAttribute(request)
if err != nil {
return fmt.Errorf("error modifying A records: %w", err)
}
}
if fi.StringValue(e.IPv6CIDR) != "" {

View File

@ -174,6 +174,10 @@ func assignCIDRsToSubnets(c *kops.Cluster, cloud fi.Cloud) error {
if subnet.CIDR != "" {
continue
}
// TODO: Replace this with a check against type "dualstack" if has IPv6CIDR
if subnet.IPv6CIDR != "" && subnet.Name != subnet.Zone {
continue
}
if len(bigCIDRs) == 0 {
return fmt.Errorf("insufficient (big) CIDRs remaining for automatic CIDR allocation to subnet %q", subnet.Name)