diff --git a/cmd/kubepkg/templates/latest/deb/kubelet/debian/control b/cmd/kubepkg/templates/latest/deb/kubelet/debian/control index 4b3c1d5dff4..518f11895d4 100644 --- a/cmd/kubepkg/templates/latest/deb/kubelet/debian/control +++ b/cmd/kubepkg/templates/latest/deb/kubelet/debian/control @@ -10,6 +10,9 @@ Vcs-Browser: https://github.com/kubernetes/kubernetes Package: kubelet Architecture: {{ .BuildArch }} -Depends: iptables (>= 1.4.21), kubernetes-cni (>= {{ index .Dependencies "kubernetes-cni" }}), iproute2, socat, util-linux, mount, ebtables, ethtool, conntrack, ${misc:Depends} +Depends: iptables (>= 1.4.21), iproute2, socat, util-linux, mount, ebtables, ethtool, conntrack, ${misc:Depends} +Provides: kubernetes-cni +Conflicts: kubernetes-cni +Replaces: kubernetes-cni Description: Kubernetes Node Agent The node agent of Kubernetes, the container cluster manager diff --git a/cmd/kubepkg/templates/latest/deb/kubelet/debian/kubelet.install b/cmd/kubepkg/templates/latest/deb/kubelet/debian/kubelet.install index b88ef340d95..ea6318194cd 100644 --- a/cmd/kubepkg/templates/latest/deb/kubelet/debian/kubelet.install +++ b/cmd/kubepkg/templates/latest/deb/kubelet/debian/kubelet.install @@ -1,2 +1,3 @@ usr/bin/kubelet usr/bin/ lib/systemd/system/kubelet.service lib/systemd/system/ +bin/ opt/cni diff --git a/cmd/kubepkg/templates/latest/deb/kubelet/debian/rules b/cmd/kubepkg/templates/latest/deb/kubelet/debian/rules index 5c7271def77..a45168e919c 100755 --- a/cmd/kubepkg/templates/latest/deb/kubelet/debian/rules +++ b/cmd/kubepkg/templates/latest/deb/kubelet/debian/rules @@ -17,6 +17,10 @@ else "{{ .DownloadLinkBase }}/bin/linux/{{ .GoArch }}/kubelet" endif chmod +x usr/bin/kubelet + mkdir -p ./bin + curl -sSL --fail --retry 5 \ + "https://storage.googleapis.com/k8s-artifacts-cni/release/v{{ .CNIVersion }}/cni-plugins-linux-{{ .GoArch }}-v{{ .CNIVersion }}.tgz" \ + | tar -C ./bin -xz dh_testroot dh_auto_install dh_shlibdeps diff --git a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/.gitignore b/cmd/kubepkg/templates/latest/deb/kubernetes-cni/.gitignore deleted file mode 100644 index e660fd93d31..00000000000 --- a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bin/ diff --git a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/changelog b/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/changelog deleted file mode 100644 index 952fa8b5509..00000000000 --- a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/changelog +++ /dev/null @@ -1,6 +0,0 @@ -kubernetes-cni ({{ .Version }}-{{ .Revision }}) {{ .Channel }}; urgency=medium - - * https://git.k8s.io/kubernetes/CHANGELOG/README.md - - -- Kubernetes Authors {{ date }} - diff --git a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/compat b/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/compat deleted file mode 100644 index ec635144f60..00000000000 --- a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/control b/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/control deleted file mode 100644 index 3129168ab32..00000000000 --- a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/control +++ /dev/null @@ -1,15 +0,0 @@ -Source: kubernetes-cni -Section: misc -Priority: optional -Maintainer: Kubernetes Authors -Build-Depends: curl, ca-certificates, debhelper (>= 8.0.0) -Standards-Version: 3.9.4 -Homepage: https://kubernetes.io -Vcs-Git: https://github.com/kubernetes/kubernetes.git -Vcs-Browser: https://github.com/kubernetes/kubernetes - -Package: kubernetes-cni -Architecture: {{ .BuildArch }} -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: Kubernetes CNI - The binaries required to provision container networking diff --git a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/copyright b/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/copyright deleted file mode 100644 index 382d7e8faaf..00000000000 --- a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/copyright +++ /dev/null @@ -1,18 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: kubernetes-cni -Source: https://github.com/kubernetes/kubernetes - -Files: * -Copyright: 2016 The Linux Foundation and its contributors -License: Apache-2.0 - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - . - http://www.apache.org/licenses/LICENSE-2.0 - . - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/kubernetes-cni.install b/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/kubernetes-cni.install deleted file mode 100644 index 001a3b4c7b1..00000000000 --- a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/kubernetes-cni.install +++ /dev/null @@ -1 +0,0 @@ -bin/ opt/cni diff --git a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/rules b/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/rules deleted file mode 100755 index 26d9c78064d..00000000000 --- a/cmd/kubepkg/templates/latest/deb/kubernetes-cni/debian/rules +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -#export DH_VERBOSE=1 - -build: - echo noop - -binary: - mkdir -p ./bin - curl -sSL --fail --retry 5 \ - "{{ .CNIDownloadLink }}" \ - | tar -C ./bin -xz - dh_testroot - dh_auto_install - dh_shlibdeps - dh_install - dh_installdeb - dh_gencontrol - dh_md5sums - dh_builddeb - -%: - dh $@ diff --git a/cmd/kubepkg/templates/latest/rpm/kubelet/kubelet.spec b/cmd/kubepkg/templates/latest/rpm/kubelet/kubelet.spec index 71bcbbc8836..e208f5ac8c1 100644 --- a/cmd/kubepkg/templates/latest/rpm/kubelet/kubelet.spec +++ b/cmd/kubepkg/templates/latest/rpm/kubelet/kubelet.spec @@ -6,23 +6,26 @@ Summary: Container cluster management License: ASL 2.0 URL: https://kubernetes.io Source0: {{ .DownloadLinkBase }}/bin/linux/{{ .GoArch }}/kubelet +Source1: {{ .CNIDownloadLink }} BuildRequires: systemd BuildRequires: curl Requires: iptables >= 1.4.21 -Requires: kubernetes-cni >= {{ index .Dependencies "kubernetes-cni" }} Requires: socat Requires: util-linux Requires: ethtool Requires: iproute Requires: ebtables Requires: conntrack +Obsoletes: kubernetes-cni +Conflicts: kubernetes-cni %description The node agent of Kubernetes, the container cluster manager. %prep cp -p %SOURCE0 %{_builddir}/ +%setup -c -D -T -a 5 -n cni-plugins # TODO: Do we need these? #%autosetup @@ -43,6 +46,9 @@ install -p -m 755 -t %{buildroot}%{_bindir}/ kubelet install -p -m 644 -t %{buildroot}%{_unitdir}/ kubelet.service install -m 755 -d %{buildroot}%{_sysconfdir}/sysconfig/ install -p -m 644 -T kubelet.env %{buildroot}%{_sysconfdir}/sysconfig/kubelet +install -m 755 -d %{buildroot}%{_sysconfdir}/cni/net.d/ +install -m 755 -d %{buildroot}/opt/cni/bin +mv cni-plugins/* %{buildroot}/opt/cni/bin/ # TODO: Do we need this? #%make_install @@ -50,6 +56,8 @@ install -p -m 644 -T kubelet.env %{buildroot}%{_sysconfdir}/sysconfig/kubelet %files %{_bindir}/kubelet %{_unitdir}/kubelet.service +%{_sysconfdir}/kubernetes/manifests/ +/opt/cni %config(noreplace) %{_sysconfdir}/sysconfig/kubelet @@ -59,6 +67,9 @@ install -p -m 644 -T kubelet.env %{buildroot}%{_sysconfdir}/sysconfig/kubelet %changelog +* Fri May 22 2020 Stephen Augustus - 1.18.4 +- Bundle CNI plugins (v0.8.6) in kubelet package + * Sat Jan 4 2020 Stephen Augustus - 1.18.0 - Move kubeadm into separate spec file - Move kubectl into separate spec file diff --git a/cmd/kubepkg/templates/latest/rpm/kubernetes-cni/kubernetes-cni.spec b/cmd/kubepkg/templates/latest/rpm/kubernetes-cni/kubernetes-cni.spec deleted file mode 100644 index 1315de76a56..00000000000 --- a/cmd/kubepkg/templates/latest/rpm/kubernetes-cni/kubernetes-cni.spec +++ /dev/null @@ -1,48 +0,0 @@ -Name: kubernetes-cni -Version: {{ .Version }} -Release: {{ .Revision }} -Summary: Binaries required to provision kubernetes container networking - -License: ASL 2.0 -URL: https://kubernetes.io -Source0: {{ .CNIDownloadLink }} - -BuildRequires: systemd -BuildRequires: curl -Requires: kubelet - -%description -Binaries required to provision container networking. - -%prep -%setup -c -D -T -a 5 -n cni-plugins - -# TODO: Do we need these? -#%autosetup -#%build -#%configure -#%make_build - -%install -# TODO: Do we need this? -#rm -rf $RPM_BUILD_ROOT - -cd %{_builddir} -install -m 755 -d %{buildroot}%{_sysconfdir}/cni/net.d/ -install -m 755 -d %{buildroot}/opt/cni/bin -mv cni-plugins/* %{buildroot}/opt/cni/bin/ - -# TODO: Do we need this? -#%make_install - -%files -/opt/cni - -# TODO: Do we need these? -#%license add-license-file-here -#%doc add-docs-here - - -%changelog -* Sat Jan 4 2020 Stephen Augustus - 1.18.0 -- Create separate spec file for kubernetes-cni diff --git a/pkg/kubepkg/kubepkg.go b/pkg/kubepkg/kubepkg.go index d3380525f93..5d84498a0aa 100644 --- a/pkg/kubepkg/kubepkg.go +++ b/pkg/kubepkg/kubepkg.go @@ -45,8 +45,8 @@ const ( ChannelNightly ChannelType = "nightly" minimumKubernetesVersion = "1.13.0" - MinimumCNIVersion = "0.7.5" - Pre117CNIVersion = "0.7.5" + CurrentCNIVersion = "0.8.6" + MinimumCNIVersion = "0.8.6" kubeadmConf = "10-kubeadm.conf" ) @@ -147,6 +147,7 @@ type PackageDefinition struct { DownloadLinkBase string KubeadmKubeletConfigFile string + CNIVersion string CNIDownloadLink string } @@ -189,8 +190,8 @@ func (c *Client) ConstructBuilds() ([]Build, error) { packageDef.KubernetesVersion = c.options.KubeVersion() switch b.Package { - case "kubernetes-cni": - packageDef.Version = c.options.CNIVersion() + case "kubelet": + packageDef.CNIVersion = c.options.CNIVersion() case "cri-tools": packageDef.Version = c.options.CRIToolsVersion() } @@ -312,7 +313,12 @@ func (c *Client) buildPackage(build Build, packageDef *PackageDefinition, arch, bc.BuildArch = getBuildArch(bc.GoArch, bc.Type) - bc.CNIDownloadLink, err = GetCNIDownloadLink(pd, bc.GoArch) + bc.CNIVersion, err = GetCNIVersion(pd) + if err != nil { + return errors.Wrap(err, "getting CNI version") + } + + bc.CNIDownloadLink, err = GetCNIDownloadLink(pd.Version, bc.GoArch) if err != nil { return errors.Wrap(err, "getting CNI download link") } @@ -393,10 +399,7 @@ func (c *Client) GetPackageVersion(packageDef *PackageDefinition) (string, error } logrus.Infof("Setting version for %s package...", packageDef.Name) - switch packageDef.Name { - case "kubernetes-cni": - return GetCNIVersion(packageDef) - case "cri-tools": + if packageDef.Name == "cri-tools" { return c.GetCRIToolsVersion(packageDef) } @@ -431,27 +434,24 @@ func GetCNIVersion(packageDef *PackageDefinition) (string, error) { return "", errors.New("package definition cannot be nil") } + // TODO: Ensure version is not less than MinimumCNIVersion logrus.Infof("Getting CNI version...") + if packageDef.CNIVersion != "" { + cniSemVer, err := util.TagStringToSemver(packageDef.CNIVersion) + if err != nil { + return "", errors.Wrap(err, "parsing CNI version") + } + minCNISemVer, err := util.TagStringToSemver(MinimumCNIVersion) + if err != nil { + return "", errors.Wrap(err, "parsing CNI version") + } - kubeSemver, err := util.TagStringToSemver(packageDef.KubernetesVersion) - if err != nil { - return "", err - } - - v117, err := semver.Make("1.17.0-alpha.0") - if err != nil { - return "", err - } - - if packageDef.Version != "" { - if kubeSemver.LT(v117) { - logrus.Infof("Kubernetes version earlier than 1.17 must use CNI version <= %s", Pre117CNIVersion) - logrus.Infof("Setting CNI version to %s", Pre117CNIVersion) - return Pre117CNIVersion, nil + if cniSemVer.LT(minCNISemVer) { + return "", errors.Errorf("specified CNI version (%s) cannot be lower than %s", packageDef.CNIVersion, MinimumCNIVersion) } - logrus.Infof("Setting CNI version to %s", packageDef.Version) - return packageDef.Version, nil + logrus.Infof("Setting CNI version to %s", packageDef.CNIVersion) + return packageDef.CNIVersion, nil } logrus.Infof("Setting CNI version to %s", MinimumCNIVersion) @@ -583,13 +583,9 @@ func GetDependencies(packageDef *PackageDefinition) (map[string]string, error) { deps := make(map[string]string) - switch packageDef.Name { - case "kubelet": - deps["kubernetes-cni"] = MinimumCNIVersion - case "kubeadm": + if packageDef.Name == "kubeadm" { deps["kubelet"] = minimumKubernetesVersion deps["kubectl"] = minimumKubernetesVersion - deps["kubernetes-cni"] = MinimumCNIVersion deps["cri-tools"] = minimumCRIToolsVersion } @@ -600,24 +596,10 @@ func getBuildArch(goArch string, buildType options.BuildType) string { return buildArchMap[goArch][buildType] } -func GetCNIDownloadLink(packageDef *PackageDefinition, arch string) (string, error) { - if packageDef == nil { - return "", errors.New("package definition cannot be nil") - } - - sv, err := util.TagStringToSemver(packageDef.Version) - if err != nil { - return "", err - } - - v075, err := semver.Make(Pre117CNIVersion) - if err != nil { - return "", err - } - - if sv.LTE(v075) { - return fmt.Sprintf("https://github.com/containernetworking/plugins/releases/download/v%s/cni-plugins-%s-v%s.tgz", packageDef.Version, arch, packageDef.Version), nil +func GetCNIDownloadLink(version, arch string) (string, error) { + if _, err := util.TagStringToSemver(version); err != nil { + return "", errors.Wrap(err, "parsing CNI version") } - return fmt.Sprintf("https://github.com/containernetworking/plugins/releases/download/v%s/cni-plugins-linux-%s-v%s.tgz", packageDef.Version, arch, packageDef.Version), nil + return fmt.Sprintf("https://storage.googleapis.com/k8s-artifacts-cni/release/v%s/cni-plugins-linux-%s-v%s.tgz", version, arch, version), nil } diff --git a/pkg/kubepkg/kubepkg_test.go b/pkg/kubepkg/kubepkg_test.go index 2eaf11c70a9..3adafe240b5 100644 --- a/pkg/kubepkg/kubepkg_test.go +++ b/pkg/kubepkg/kubepkg_test.go @@ -75,7 +75,7 @@ func TestConstructBuilds(t *testing.T) { builds, err := sut.ConstructBuilds() require.Nil(t, err) require.NotEmpty(t, builds) - require.Len(t, builds, 5) + require.Len(t, builds, 4) require.Len(t, builds[0].Definitions, 3) require.Equal(t, "kubelet", builds[0].Package) require.Equal(t, options.BuildRpm, builds[0].Type) @@ -180,13 +180,6 @@ func TestGetPackageVersionSuccess(t *testing.T) { name: "Kubernetes version not supplied", expected: "", }, - { - name: "CNI version", - packageName: "kubernetes-cni", - version: "0.8.3", - kubeVersion: "1.17.0", - expected: "0.8.3", - }, { name: "CRI tools version", packageName: "cri-tools", @@ -257,21 +250,15 @@ func TestGetKubernetesVersionFailure(t *testing.T) { func TestGetCNIVersionSuccess(t *testing.T) { testcases := []struct { name string - version string + cniVersion string kubeVersion string expected string }{ { - name: "CNI version supplied, Kubernetes version < 1.17", - version: "0.8.3", - kubeVersion: "1.16.0", - expected: kubepkg.Pre117CNIVersion, - }, - { - name: "CNI version supplied, Kubernetes version >= 1.17", - version: "0.8.3", + name: "CNI version supplied", + cniVersion: "0.8.7", kubeVersion: "1.17.0", - expected: "0.8.3", + expected: "0.8.7", }, { name: "CNI version not supplied", @@ -283,7 +270,7 @@ func TestGetCNIVersionSuccess(t *testing.T) { for _, tc := range testcases { actual, err := kubepkg.GetCNIVersion( &kubepkg.PackageDefinition{ - Version: tc.version, + CNIVersion: tc.cniVersion, KubernetesVersion: tc.kubeVersion, }, ) @@ -294,8 +281,28 @@ func TestGetCNIVersionSuccess(t *testing.T) { } func TestGetCNIVersionFailure(t *testing.T) { - _, err := kubepkg.GetCNIVersion(nil) - require.NotNil(t, err) + testcases := []struct { + name string + packageDef *kubepkg.PackageDefinition + }{ + { + name: "package definition is nil", + packageDef: nil, + }, + { + name: "CNI version supplied less than minimum allowed CNI version", + packageDef: &kubepkg.PackageDefinition{ + CNIVersion: "0.8.3", + KubernetesVersion: "1.17.0", + }, + }, + } + + for _, tc := range testcases { + _, err := kubepkg.GetCNIVersion(tc.packageDef) + + require.NotNil(t, err) + } } func TestGetCRIToolsVersionSuccess(t *testing.T) { @@ -450,21 +457,13 @@ func TestGetDependenciesSuccess(t *testing.T) { packageName string expected map[string]string }{ - { - name: "get kubelet deps", - packageName: "kubelet", - expected: map[string]string{ - "kubernetes-cni": "0.7.5", - }, - }, { name: "get kubeadm deps", packageName: "kubeadm", expected: map[string]string{ - "kubelet": "1.13.0", - "kubectl": "1.13.0", - "kubernetes-cni": "0.7.5", - "cri-tools": "1.13.0", + "kubelet": "1.13.0", + "kubectl": "1.13.0", + "cri-tools": "1.13.0", }, }, } @@ -494,26 +493,15 @@ func TestGetCNIDownloadLinkSuccess(t *testing.T) { expected string }{ { - name: "CNI <= 0.7.5", - version: "0.7.5", - arch: "amd64", - expected: "https://github.com/containernetworking/plugins/releases/download/v0.7.5/cni-plugins-amd64-v0.7.5.tgz", - }, - { - name: "CNI > 0.8.3", - version: "0.8.3", + name: "minimum CNI version", + version: "0.8.6", arch: "amd64", - expected: "https://github.com/containernetworking/plugins/releases/download/v0.8.3/cni-plugins-linux-amd64-v0.8.3.tgz", + expected: "https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz", }, } for _, tc := range testcases { - actual, err := kubepkg.GetCNIDownloadLink( - &kubepkg.PackageDefinition{ - Version: tc.version, - }, - tc.arch, - ) + actual, err := kubepkg.GetCNIDownloadLink(tc.version, tc.arch) require.Nil(t, err) require.Equal(t, tc.expected, actual) @@ -521,6 +509,6 @@ func TestGetCNIDownloadLinkSuccess(t *testing.T) { } func TestGetCNIDownloadLinkFailure(t *testing.T) { - _, err := kubepkg.GetCNIDownloadLink(nil, "amd64") + _, err := kubepkg.GetCNIDownloadLink("badversion", "amd64") require.NotNil(t, err) } diff --git a/pkg/kubepkg/options/options.go b/pkg/kubepkg/options/options.go index a99aab07f75..57d306f19e1 100644 --- a/pkg/kubepkg/options/options.go +++ b/pkg/kubepkg/options/options.go @@ -59,7 +59,7 @@ const ( var ( supportedPackages = []string{ - "kubelet", "kubectl", "kubeadm", "kubernetes-cni", "cri-tools", + "kubelet", "kubectl", "kubeadm", "cri-tools", } supportedChannels = []string{ "release", "testing", "nightly",