852f6b2
$WARNING
852f6b2
852f6b2
%global with_debug   0
852f6b2
852f6b2
%if 0%{?with_debug}
852f6b2
# https://bugzilla.redhat.com/show_bug.cgi?id=995136#c12
852f6b2
%global _dwz_low_mem_die_limit 0
852f6b2
%else
852f6b2
%global debug_package %{nil}
852f6b2
%endif
852f6b2
852f6b2
%global provider                github
852f6b2
%global provider_tld            com
852f6b2
%global owner                   kubernetes
852f6b2
%global repo                    kubernetes
852f6b2
# https://github.com/kubernetes/kubernetes
852f6b2
852f6b2
%global provider_prefix         %{provider}.%{provider_tld}/%{owner}/%{repo}
852f6b2
%global import_path             kubernetes.io/
852f6b2
852f6b2
# **** release metadata ****
852f6b2
# populated by envsubst in newrelease.sh
852f6b2
%global gittag                  $GIT_TAG
852f6b2
%global tar_ver                 $TAR_VERSION
852f6b2
%global k8s_name                $SPEC_NAME
852f6b2
%global k8s_ver                 $SPEC_VERSION
852f6b2
# golang 'built with' version
852f6b2
%global golangver               $GOLANG_VERSION
852f6b2
852f6b2
# last release version of these rpms prior to F40 restructure
852f6b2
# should not change once restructure goes into rawhide
916edfd
%global switchver              1.29.0
852f6b2
852f6b2
# Needed otherwise "version_ldflags=$(kube::version_ldflags)" doesn't work
852f6b2
%global _buildshell  /bin/bash
852f6b2
%global _checkshell  /bin/bash
852f6b2
852f6b2
##############################################
852f6b2
Name:           %{k8s_name}
852f6b2
Version:        %{k8s_ver}
852f6b2
Release:        %autorelease
852f6b2
Summary:        Open Source Production-Grade Container Scheduling And Management Platform
852f6b2
License:        ASL 2.0
852f6b2
URL:            https://%{import_path}
852f6b2
ExclusiveArch:  x86_64 aarch64 ppc64le s390x %{arm}
852f6b2
Source0:        https://%{provider_prefix}/archive/%{gittag}/%{repo}-%{tar_ver}.tar.gz
852f6b2
852f6b2
Source101:      kube-proxy.service
852f6b2
Source102:      kube-apiserver.service
852f6b2
Source103:      kube-scheduler.service
852f6b2
Source104:      kube-controller-manager.service
852f6b2
Source105:      kubelet.service
852f6b2
Source106:      environ-apiserver
852f6b2
Source107:      environ-config
852f6b2
Source108:      environ-controller-manager
852f6b2
Source109:      environ-kubelet
852f6b2
Source110:      environ-kubelet.kubeconfig
852f6b2
Source111:      environ-proxy
852f6b2
Source112:      environ-scheduler
852f6b2
Source113:      kubernetes-accounting.conf
70415da
Source114:      10-kubeadm.conf
852f6b2
Source115:      kubernetes.conf
852f6b2
Source116:      %{repo}.sysusers
852f6b2
852f6b2
Patch3:         build-with-debug-info.patch
852f6b2
852f6b2
##############################################
8282aed
# main package components - installs kubelet and necessary
8282aed
# configuration files. Recommends kubernetes-client and
8282aed
# kubernetes-kubeadm.
852f6b2
8282aed
# build requirements for kubelet
852f6b2
BuildRequires: golang >= %{golangver}
4d9de00
BuildRequires: go-rpm-macros
852f6b2
BuildRequires: make
852f6b2
BuildRequires: go-md2man
852f6b2
BuildRequires: systemd
852f6b2
BuildRequires: rsync
852f6b2
852f6b2
# needed per fedora documentation - may drop as /run not used
852f6b2
# and kube user no longer needed
852f6b2
BuildRequires: systemd-rpm-macros
852f6b2
%{?sysusers_requires_compat}
852f6b2
852f6b2
# additonal kubelet requirements
852f6b2
Requires:   (containerd or cri-o)
852f6b2
Recommends: cri-o = %{version}-%{release}
852f6b2
Requires:   conntrack-tools
852f6b2
852f6b2
Requires(pre): shadow-utils
852f6b2
Requires:      socat
852f6b2
Recommends:    %{name}-client = %{version}-%{release}
8282aed
Recommends:    %{name}-kubeadm = %{version}-%{release}
852f6b2
8282aed
# require same version for kubernetes-kubeadm if installed
8282aed
Conflicts: %{name}-kubeadm < %{version}-%{release}
8282aed
Conflicts: %{name}-kubeadm > %{version}-%{release}
852f6b2
852f6b2
# require same version for kubernetes-client if installed
852f6b2
Conflicts: %{name}-client < %{version}-%{release}
852f6b2
Conflicts: %{name}-client > %{version}-%{release}
852f6b2
852f6b2
# provides and obsoletes kubernetes-node and kubernetes-kubeadm
852f6b2
Provides: kubernetes-node = %{version}-%{release}
916edfd
Obsoletes: kubernetes-node < %{switchver}
852f6b2
852f6b2
%description
852f6b2
%{summary}
8282aed
Installs kubelet, the kubernetes agent on each machine in a
8282aed
cluster. The kubernetes-client sub-package,
852f6b2
containing kubectl, is recommended but not strictly required.
852f6b2
The kubernetes-client sub-package should be installed on
852f6b2
control plane machines.
852f6b2
852f6b2
##############################################
8282aed
%package  kubeadm
8282aed
Summary:  Kubernetes tool for standing up clusters
8282aed
Requires: kubernetes = %{version}-%{release}
8282aed
8282aed
BuildRequires: golang >= %{golangver}
8282aed
BuildRequires: systemd
8282aed
Requires: containernetworking-plugins
8282aed
Requires: cri-tools
8282aed
8282aed
# require same version for kubernetes
8282aed
Conflicts: %{name} < %{version}-%{release}
8282aed
Conflicts: %{name} > %{version}-%{release}
8282aed
8282aed
%description kubeadm
8282aed
Kubernetes tool for standing up clusters. Not mandatory. If used,
8282aed
install on each machine in the cluster. Used to initialize each node,
8282aed
and to join new machines to an existing cluster.
8282aed
8282aed
##############################################
852f6b2
%package client
852f6b2
Summary: Kubernetes client tools
852f6b2
852f6b2
BuildRequires: golang >= %{golangver}
852f6b2
BuildRequires: make
852f6b2
852f6b2
Conflicts: %{name} < %{version}-%{release}
852f6b2
Conflicts: %{name} > %{version}-%{release}
852f6b2
852f6b2
%description client
852f6b2
Installs kubectl, the Kubernetes command line client.
852f6b2
852f6b2
##############################################
916edfd
%package systemd
916edfd
Summary: Systemd services for control plane and/or node
852f6b2
852f6b2
BuildRequires: golang >= %{golangver}
852f6b2
BuildRequires: systemd
852f6b2
BuildRequires: rsync
852f6b2
BuildRequires: make
852f6b2
BuildRequires: go-md2man
852f6b2
852f6b2
Requires(pre): shadow-utils
852f6b2
Requires: %{name} = %{version}-%{release}
852f6b2
852f6b2
# obsoletes kubernetes-master in part
852f6b2
Provides: kubernetes-master = %{version}-%{release}
916edfd
Provides: kubernetes-legacy-systemd = %{version}-%{release}
916edfd
Obsoletes: kubernetes-master < %{switchver}
916edfd
916edfd
%description systemd
916edfd
Systemd services needed for manual installation of Kubernetes
916edfd
on control plane or node machines. If kubeadm is used to bootstrap
916edfd
Kubernetes then this rpm is not needed as kubeadm will install
916edfd
these services as static pods in the cluster on nodes as needed.
916edfd
If these systemd services are used, enable all services except
916edfd
kube-proxy on each control plane. Enable kube-proxy on all machines
916edfd
nodes that runs kubelet, including control plane machines with
916edfd
kubelet.
852f6b2
852f6b2
##############################################
852f6b2
##############################################
852f6b2
%prep
852f6b2
%setup -q -n %{repo}-%{tar_ver}
852f6b2
852f6b2
%if 0%{?with_debug}
852f6b2
%patch3 -p1
852f6b2
%endif
852f6b2
852f6b2
# src/k8s.io/kubernetes/pkg/util/certificates
852f6b2
# Patch the code to remove eliptic.P224 support
852f6b2
# For whatever reason:
852f6b2
# https://groups.google.com/forum/#!topic/Golang-nuts/Oq4rouLEvrU
852f6b2
for dir in vendor/github.com/google/certificate-transparency/go/x509 pkg/util/certificates; do
852f6b2
  if [ -d "${dir}" ]; then
852f6b2
    pushd ${dir}
852f6b2
    sed -i "/^[^=]*$/ s/oidNamedCurveP224/oidNamedCurveP256/g" *.go
852f6b2
    sed -i "/^[^=]*$/ s/elliptic\.P224/elliptic.P256/g" *.go
852f6b2
    popd
852f6b2
  fi
852f6b2
done
852f6b2
852f6b2
mkdir -p src/k8s.io/kubernetes
852f6b2
mv $(ls | grep -v "^src$") src/k8s.io/kubernetes/.
852f6b2
852f6b2
# mv command above skips all dot files. Move .generated_files and all
852f6b2
#.go* files
852f6b2
mv .generated_files src/k8s.io/kubernetes/.
852f6b2
mv .go* src/k8s.io/kubernetes/.
852f6b2
852f6b2
###############
852f6b2
852f6b2
%build
852f6b2
852f6b2
# As of K8S 1.26.3/1.25.8/1.24.12 upstream now builds with an explicit
852f6b2
# version of go and will try to fetch that version if not present.
852f6b2
# FORCE_HOTS_GO=y overrides that specification by using the host's
852f6b2
# version of go. This spec file continues to use build requires to
852f6b2
# require as a minimum the 'built with' go version from upstream.
852f6b2
#
852f6b2
# Packagers need to ensure that the go version on the build host contains
852f6b2
# any security patches and other critical fixes that are part of the
852f6b2
# "built with" version. Go maintainers typically release patch updates
852f6b2
# for both supported versions of Go that contain the same security
852f6b2
# updates.
852f6b2
export FORCE_HOST_GO=y
852f6b2
852f6b2
pushd src/k8s.io/kubernetes/
852f6b2
source hack/lib/init.sh
852f6b2
kube::golang::setup_env
852f6b2
852f6b2
export KUBE_GIT_TREE_STATE="clean"
87da9c2
export KUBE_GIT_VERSION=v%{version}
852f6b2
export KUBE_EXTRA_GOPATH=$(pwd)/Godeps/_workspace
852f6b2
4d9de00
# go internal linker does not provide build ids; use
4d9de00
# KUBE_CGO_OVERRIDES to force external linker; consistent
4d9de00
# with Fedora go standards
4d9de00
export KUBE_CGO_OVERRIDES="kube-proxy kubeadm kube-apiserver kube-controller-manager kubelet kube-scheduler kubectl"
4d9de00
4d9de00
# Use settings from gobuild macro to populate GOFLAGS and
4d9de00
# GOLDFLAGS - see Makefile (make help) for more information
4d9de00
export GOFLAGS="-buildmode=pie -compiler=gc -tags=rpm_crashtraceback${BUILDTAGS:+,}${BUILDTAGS:-}"
4d9de00
71bf7b1
export GOLDFLAGS="%{?currentgoldflags} -B 0x$(echo '%{name}-%{version}-%{release}-${SOURCE_DATE_EPOCH:-}' | sha1sum | cut -d ' ' -f1) -compressdwarf=false -linkmode=external -extldflags '%{build_ldflags} %{?__golang_extldflags}'"
87da9c2
852f6b2
# Build each binary separately to generate a unique build-id.
852f6b2
# Otherwise: Duplicate build-ids /builddir/build/BUILDROOT/.../usr/bin/kube-apiserver and /builddir/build/BUILDROOT/.../usr/bin/kubeadm
71bf7b1
make WHAT="cmd/kube-proxy"
71bf7b1
make WHAT="cmd/kube-apiserver"
71bf7b1
make WHAT="cmd/kube-controller-manager"
71bf7b1
make WHAT="cmd/kubelet"
71bf7b1
make WHAT="cmd/kubeadm"
71bf7b1
make WHAT="cmd/kube-scheduler"
71bf7b1
make WHAT="cmd/kubectl"
852f6b2
852f6b2
# Gen docs
852f6b2
make WHAT="cmd/gendocs"
852f6b2
make WHAT="cmd/genkubedocs"
852f6b2
make WHAT="cmd/genman"
852f6b2
make WHAT="cmd/genyaml"
852f6b2
kube::util::gen-docs .
852f6b2
852f6b2
###############
852f6b2
852f6b2
%install
852f6b2
pushd src/k8s.io/kubernetes/
852f6b2
source hack/lib/init.sh
852f6b2
kube::golang::setup_env
852f6b2
852f6b2
%ifarch ppc64le
852f6b2
output_path="_output/local/go/bin"
852f6b2
%else
852f6b2
output_path="${KUBE_OUTPUT_BINPATH}/$(kube::golang::host_platform)"
852f6b2
%endif
852f6b2
852f6b2
echo "+++ INSTALLING binaries"
852f6b2
install -m 755 -d %{buildroot}%{_bindir}
852f6b2
install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kube-proxy
852f6b2
install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kube-apiserver
852f6b2
install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kube-controller-manager
852f6b2
install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kubelet
852f6b2
install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kubeadm
852f6b2
install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kube-scheduler
852f6b2
install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kubectl
852f6b2
852f6b2
echo "+++ INSTALLING kubelet service config"
852f6b2
install -d -m 0755 %{buildroot}/%{_unitdir}/kubelet.service.d
852f6b2
install -p -m 0644 -t %{buildroot}/%{_unitdir}/kubelet.service.d %{SOURCE114}
852f6b2
852f6b2
echo "+++ INSTALLING shell completion"
852f6b2
install -dm 0755 %{buildroot}/%{bash_completions_dir}
852f6b2
%{buildroot}%{_bindir}/kubectl completion bash > %{buildroot}/%{bash_completions_dir}/kubectl
852f6b2
install -dm 0755 %{buildroot}/%{fish_completions_dir}
852f6b2
%{buildroot}%{_bindir}/kubectl completion fish > %{buildroot}/%{fish_completions_dir}/kubectl.fish
852f6b2
install -dm 0755 %{buildroot}/%{zsh_completions_dir}
852f6b2
%{buildroot}%{_bindir}/kubectl completion zsh > %{buildroot}/%{zsh_completions_dir}/_kubectl
852f6b2
852f6b2
echo "+++ INSTALLING config files"
852f6b2
%define remove_environ_prefix() %(echo -n %1|sed 's/.*environ-//g')
852f6b2
install -d -m 0755 %{buildroot}%{_sysconfdir}/%{repo}
852f6b2
install -d -m 0700 %{buildroot}%{_sysconfdir}/%{repo}/manifests
852f6b2
install -m 644 -T %{SOURCE106} %{buildroot}%{_sysconfdir}/%{repo}/%{remove_environ_prefix %{SOURCE106}}
852f6b2
install -m 644 -T %{SOURCE107} %{buildroot}%{_sysconfdir}/%{repo}/%{remove_environ_prefix %{SOURCE107}}
852f6b2
install -m 644 -T %{SOURCE108} %{buildroot}%{_sysconfdir}/%{repo}/%{remove_environ_prefix %{SOURCE108}}
852f6b2
install -m 644 -T %{SOURCE109} %{buildroot}%{_sysconfdir}/%{repo}/%{remove_environ_prefix %{SOURCE109}}
852f6b2
install -m 644 -T %{SOURCE110} %{buildroot}%{_sysconfdir}/%{repo}/%{remove_environ_prefix %{SOURCE110}}
852f6b2
install -m 644 -T %{SOURCE111} %{buildroot}%{_sysconfdir}/%{repo}/%{remove_environ_prefix %{SOURCE111}}
852f6b2
install -m 644 -T %{SOURCE112} %{buildroot}%{_sysconfdir}/%{repo}/%{remove_environ_prefix %{SOURCE112}}
852f6b2
852f6b2
# place systemd/tmpfiles.d/kubernetes.conf to /usr/lib/tmpfiles.d/kubernetes.conf
852f6b2
install -d -m 0755 %{buildroot}%{_tmpfilesdir}
852f6b2
install -p -m 0644 -t %{buildroot}/%{_tmpfilesdir} %{SOURCE115}
852f6b2
852f6b2
echo "+++ INSTALLING sysusers.d"
852f6b2
install -D -m 0644 -vp %{SOURCE116}       %{buildroot}%{_sysusersdir}/%{repo}.conf
852f6b2
852f6b2
# enable CPU and Memory accounting
852f6b2
install -d -m 0755 %{buildroot}/%{_sysconfdir}/systemd/system.conf.d
852f6b2
install -p -m 0644 -t %{buildroot}/%{_sysconfdir}/systemd/system.conf.d %{SOURCE113}
852f6b2
852f6b2
echo "+++ INSTALLING service files"
852f6b2
install -d -m 0755 %{buildroot}%{_unitdir}
852f6b2
install -m 0644 -t %{buildroot}%{_unitdir} %{SOURCE101}
852f6b2
install -m 0644 -t %{buildroot}%{_unitdir} %{SOURCE102}
852f6b2
install -m 0644 -t %{buildroot}%{_unitdir} %{SOURCE103}
852f6b2
install -m 0644 -t %{buildroot}%{_unitdir} %{SOURCE104}
852f6b2
install -m 0644 -t %{buildroot}%{_unitdir} %{SOURCE105}
852f6b2
852f6b2
echo "+++ INSTALLING manpages"
852f6b2
install -d %{buildroot}%{_mandir}/man1
852f6b2
# from k8s tarball copied docs/man/man1/*.1
852f6b2
install -p -m 644 docs/man/man1/*.1 %{buildroot}%{_mandir}/man1
852f6b2
852f6b2
# install the place the kubelet defaults to put volumes and default folder structure
852f6b2
install -d %{buildroot}%{_sharedstatedir}/kubelet
852f6b2
852f6b2
mkdir -p %{buildroot}/run
852f6b2
install -d -m 0755 %{buildroot}/run/%{repo}/
852f6b2
popd
852f6b2
852f6b2
mv src/k8s.io/kubernetes/CHANGELOG/CHANGELOG-*.md .
852f6b2
mv src/k8s.io/kubernetes/*.md .
852f6b2
mv src/k8s.io/kubernetes/LICENSE .
852f6b2
# CHANGELOG.md is symlink to CHANGELOG/README.md and not actual
852f6b2
# change log. no need to include generated rpms
852f6b2
rm CHANGELOG.md
852f6b2
852f6b2
%check
852f6b2
if [ 1 != 1 ]; then
852f6b2
echo "******Testing the commands*****"
852f6b2
hack/test-cmd.sh
852f6b2
echo "******Benchmarking kube********"
852f6b2
hack/benchmark-go.sh
852f6b2
852f6b2
# In Fedora 20 and RHEL7 the go cover tools isn't available correctly
852f6b2
echo "******Testing the go code******"
852f6b2
hack/test-go.sh
852f6b2
echo "******Testing integration******"
852f6b2
hack/test-integration.sh --use_go_build
852f6b2
fi
852f6b2
852f6b2
##############################################
852f6b2
%files
852f6b2
%license LICENSE
852f6b2
%doc *.md
852f6b2
852f6b2
# kubelet
852f6b2
%{_mandir}/man1/kubelet.1*
852f6b2
%{_bindir}/kubelet
852f6b2
%{_unitdir}/kubelet.service
852f6b2
%{_sysusersdir}/%{repo}.conf
852f6b2
%dir %{_sharedstatedir}/kubelet
852f6b2
%dir %{_sysconfdir}/%{repo}
852f6b2
%dir %{_sysconfdir}/%{repo}/manifests
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/config
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/kubelet
852f6b2
# % config(noreplace) % {_sysconfdir}/% {repo}/proxy
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/kubelet.kubeconfig
852f6b2
%config(noreplace) %{_sysconfdir}/systemd/system.conf.d/kubernetes-accounting.conf
852f6b2
%{_tmpfilesdir}/kubernetes.conf
852f6b2
%verify(not size mtime md5) %attr(755, kube,kube) %dir /run/%{repo}
852f6b2
8282aed
##############################################
8282aed
%files kubeadm
8282aed
%license LICENSE
8282aed
%doc *.md
852f6b2
%{_mandir}/man1/kubeadm.1*
852f6b2
%{_mandir}/man1/kubeadm-*
852f6b2
%{_bindir}/kubeadm
852f6b2
%dir %{_unitdir}/kubelet.service.d
8282aed
%{_unitdir}/kubelet.service.d/10-kubeadm.conf
852f6b2
852f6b2
##############################################
852f6b2
%files client
852f6b2
%license LICENSE
852f6b2
%doc *.md
852f6b2
%{_mandir}/man1/kubectl.1*
852f6b2
%{_mandir}/man1/kubectl-*
852f6b2
%{_bindir}/kubectl
852f6b2
%{bash_completions_dir}/kubectl
852f6b2
%{fish_completions_dir}/kubectl.fish
852f6b2
%{zsh_completions_dir}/_kubectl
852f6b2
852f6b2
##############################################
916edfd
%files systemd
852f6b2
%license LICENSE
852f6b2
%doc *.md
852f6b2
%{_mandir}/man1/kube-apiserver.1*
852f6b2
%{_mandir}/man1/kube-controller-manager.1*
852f6b2
%{_mandir}/man1/kube-scheduler.1*
852f6b2
%{_mandir}/man1/kube-proxy.1*
852f6b2
%attr(754, -, kube) %caps(cap_net_bind_service=ep) %{_bindir}/kube-apiserver
852f6b2
%{_bindir}/kube-controller-manager
852f6b2
%{_bindir}/kube-scheduler
852f6b2
%{_bindir}/kube-proxy
852f6b2
%{_unitdir}/kube-proxy.service
852f6b2
%{_unitdir}/kube-apiserver.service
852f6b2
%{_unitdir}/kube-controller-manager.service
852f6b2
%{_unitdir}/kube-scheduler.service
852f6b2
%{_sysusersdir}/%{repo}.conf
852f6b2
%dir %{_sysconfdir}/%{repo}
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/apiserver
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/scheduler
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/config
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/controller-manager
852f6b2
%config(noreplace) %{_sysconfdir}/%{repo}/proxy
852f6b2
%{_tmpfilesdir}/kubernetes.conf
852f6b2
%verify(not size mtime md5) %attr(755, kube,kube) %dir /run/%{repo}
852f6b2
852f6b2
##############################################
852f6b2
916edfd
%pre systemd
852f6b2
%sysusers_create_compat %{SOURCE116}
852f6b2
916edfd
%post systemd
852f6b2
%systemd_post kube-apiserver kube-scheduler kube-controller-manager kube-proxy
852f6b2
916edfd
%preun systemd
852f6b2
%systemd_preun kube-apiserver kube-scheduler kube-controller-manager kube-proxy
852f6b2
916edfd
%postun systemd
852f6b2
%systemd_postun kube-apiserver kube-scheduler kube-controller-manager kube-proxy
852f6b2
852f6b2
852f6b2
%pre
852f6b2
%sysusers_create_compat %{SOURCE116}
852f6b2
852f6b2
%post
852f6b2
%systemd_post kubelet
852f6b2
# If accounting is not currently enabled systemd reexec
852f6b2
if [[ `systemctl show kubelet | grep -q -e CPUAccounting=no -e MemoryAccounting=no; echo $?` -eq 0 ]]; then
852f6b2
  systemctl daemon-reexec
852f6b2
fi
852f6b2
852f6b2
%preun
852f6b2
%systemd_preun kubelet
852f6b2
852f6b2
%postun
852f6b2
%systemd_postun kubelet
852f6b2
852f6b2
############################################
852f6b2
%changelog
852f6b2
%autochangelog