Skip to content

Commit 656b5d3

Browse files
committed
feat: install Kubernetes binaries and symlinks to /opt/bin
/usr/local/bin is generally read-only on immutable distributions, so these binaries cannot be installed there. The packages published to PMC and the system extensions built from those install their binaries to /usr/bin. These were previously moved to /usr/local/bin, but since this is no longer possible, symlinks are now created in /opt/bin instead. Symlinks are not used when installing from a tarball because the versioned binaries (e.g. kubelet-*) are removed, leading to dangling links. The `install` command has been used to write these binaries because it removes the existing file first (rather than following a symlink) and takes care of making the new file executable.
1 parent 7342175 commit 656b5d3

15 files changed

Lines changed: 34 additions & 39 deletions

File tree

e2e/kubelet/generate-kubelet-flags.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ for KUBE_BINARY_VERSION in $KUBE_BINARY_VERSIONS; do
2929
K8S_TGZ_TMP=${KUBE_BINARY_URL##*/}
3030
retrycmd_get_tarball 120 5 "$K8S_DOWNLOADS_DIR/${K8S_TGZ_TMP}" ${KUBE_BINARY_URL} || exit 120
3131
tar --transform="s|.*|&-${KUBE_BINARY_VERSION}|" --show-transformed-names -xzvf "$K8S_DOWNLOADS_DIR/${K8S_TGZ_TMP}" \
32-
--strip-components=3 -C /usr/local/bin kubernetes/node/bin/kubelet kubernetes/node/bin/kubectl
32+
--strip-components=3 -C /opt/bin kubernetes/node/bin/kubelet kubernetes/node/bin/kubectl
3333
rm -f "$K8S_DOWNLOADS_DIR/${K8S_TGZ_TMP}"
3434
export KUBE_BINARY_VERSION
3535
pushd e2e || exit 1

e2e/kubelet/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func run() error {
2626
}
2727

2828
fmt.Println("k8s version is:", k8sVersion)
29-
binaryPath := fmt.Sprintf("/usr/local/bin/kubelet-%s", k8sVersion)
29+
binaryPath := fmt.Sprintf("/opt/bin/kubelet-%s", k8sVersion)
3030

3131
r, w := io.Pipe()
3232

parts/linux/cloud-init/artifacts/azlosguard/cse_install_osguard.sh

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,7 @@ installRPMPackageFromFile() {
4141
fi
4242

4343
echo "Unpacking usr/bin/${packageName} from ${downloadDir}/${packageName}-${desiredVersion}*"
44-
pushd ${downloadDir} || exit 1
45-
rpm2cpio "${rpmFile}" | cpio -idmv
46-
mv "usr/bin/${packageName}" "/usr/local/bin/${packageName}"
47-
popd || exit 1
44+
rpm2cpio "${rpmFile}" | cpio -i --to-stdout "./usr/bin/${packageName}" | install -m0755 /dev/stdin "/opt/bin/${packageName}"
4845
rm -rf ${downloadDir}
4946
}
5047

parts/linux/cloud-init/artifacts/cse_helpers.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ AZURELINUX_KATA_OS_NAME="AZURELINUXKATA"
161161
AZURELINUX_OS_NAME="AZURELINUX"
162162
FLATCAR_OS_NAME="FLATCAR"
163163
AZURELINUX_OSGUARD_OS_VARIANT="OSGUARD"
164-
KUBECTL=/usr/local/bin/kubectl
164+
KUBECTL=/opt/bin/kubectl
165165
DOCKER=/usr/bin/docker
166166
# this will be empty during VHD build
167167
# but vhd build runs with `set -o nounset`
@@ -1096,6 +1096,7 @@ extract_tarball() {
10961096
local tarball="$1"
10971097
local dest="$2"
10981098
shift 2
1099+
mkdir -p "$dest"
10991100
# Use tar options if provided, otherwise default to -xzf
11001101
case "$tarball" in
11011102
*.tar.gz|*.tgz)

parts/linux/cloud-init/artifacts/cse_install.sh

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -462,15 +462,15 @@ installAzureCNI() {
462462
}
463463

464464
# extract the cached or downloaded kube package and remove
465-
extractKubeBinariesToUsrLocalBin() {
465+
extractKubeBinariesToOptBin() {
466466
local k8s_tgz_tmp=$1
467467
local k8s_version=$2
468468
local is_private_url=$3
469469

470-
extract_tarball "${k8s_tgz_tmp}" "/usr/local/bin" \
470+
extract_tarball "${k8s_tgz_tmp}" "/opt/bin" \
471471
--transform="s|.*|&-${k8s_version}|" --show-transformed-names --strip-components=3 \
472472
kubernetes/node/bin/kubelet kubernetes/node/bin/kubectl || exit $ERR_K8S_INSTALL_ERR
473-
if [ ! -f "/usr/local/bin/kubectl-${k8s_version}" ] || [ ! -f "/usr/local/bin/kubelet-${k8s_version}" ]; then
473+
if [ ! -f "/opt/bin/kubectl-${k8s_version}" ] || [ ! -f "/opt/bin/kubelet-${k8s_version}" ]; then
474474
exit $ERR_K8S_INSTALL_ERR
475475
fi
476476
if [ "$is_private_url" = "false" ]; then
@@ -503,7 +503,7 @@ extractKubeBinaries() {
503503

504504
echo "cached package ${k8s_tgz_tmp} found, will extract that"
505505
# remove the current kubelet and kubectl binaries before extracting new binaries from the cached package
506-
rm -rf /usr/local/bin/kubelet-* /usr/local/bin/kubectl-*
506+
rm -rf /opt/bin/kubelet-* /opt/bin/kubectl-*
507507
else
508508
k8s_tgz_tmp="${k8s_downloads_dir}/${k8s_tgz_tmp_filename}"
509509
mkdir -p ${k8s_downloads_dir}
@@ -526,7 +526,7 @@ extractKubeBinaries() {
526526
fi
527527
fi
528528

529-
extractKubeBinariesToUsrLocalBin "${k8s_tgz_tmp}" "${k8s_version}" "${is_private_url}"
529+
extractKubeBinariesToOptBin "${k8s_tgz_tmp}" "${k8s_version}" "${is_private_url}"
530530
}
531531

532532
installKubeletKubectlFromURL() {
@@ -538,7 +538,7 @@ installKubeletKubectlFromURL() {
538538

539539
if [ ! -z "${CUSTOM_KUBE_BINARY_DOWNLOAD_URL}" ]; then
540540
# remove the kubelet and kubectl binaries to make sure the only binary left is from the CUSTOM_KUBE_BINARY_DOWNLOAD_URL
541-
rm -rf /usr/local/bin/kubelet-* /usr/local/bin/kubectl-*
541+
rm -rf /opt/bin/kubelet-* /opt/bin/kubectl-*
542542

543543
# NOTE(mainred): we expect kubelet binary to be under `kubernetes/node/bin`. This suits the current setting of
544544
# kube binaries used by AKS and Kubernetes upstream.
@@ -551,7 +551,7 @@ installKubeletKubectlFromURL() {
551551
fi
552552

553553
# if the custom url is not specified and the required kubectl/kubelet-version via private url is not installed, install using the default url/package
554-
if [ ! -f "/usr/local/bin/kubectl-${KUBERNETES_VERSION}" ] || [ ! -f "/usr/local/bin/kubelet-${KUBERNETES_VERSION}" ]; then
554+
if [ ! -f "/opt/bin/kubectl-${KUBERNETES_VERSION}" ] || [ ! -f "/opt/bin/kubelet-${KUBERNETES_VERSION}" ]; then
555555
if [ "$install_default_if_missing" = "true" ]; then
556556
if [ -n "${BOOTSTRAP_PROFILE_CONTAINER_REGISTRY_SERVER}" ]; then
557557
# network isolated cluster
@@ -569,11 +569,10 @@ installKubeletKubectlFromURL() {
569569
fi
570570
fi
571571
fi
572-
mv "/usr/local/bin/kubelet-${KUBERNETES_VERSION}" "/usr/local/bin/kubelet"
573-
mv "/usr/local/bin/kubectl-${KUBERNETES_VERSION}" "/usr/local/bin/kubectl"
572+
install -m0755 "/opt/bin/kubelet-${KUBERNETES_VERSION}" /opt/bin/kubelet
573+
install -m0755 "/opt/bin/kubectl-${KUBERNETES_VERSION}" /opt/bin/kubectl
574574

575-
chmod a+x /usr/local/bin/kubelet /usr/local/bin/kubectl
576-
rm -rf /usr/local/bin/kubelet-* /usr/local/bin/kubectl-* /home/hyperkube-downloads &
575+
rm -rf /opt/bin/kubelet-* /opt/bin/kubectl-* /home/hyperkube-downloads &
577576
}
578577

579578
pullContainerImage() {

parts/linux/cloud-init/artifacts/cse_main.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ function nodePrep {
421421
tee "/etc/systemd/system/nvidia-device-plugin.service.d/10-binary-path.conf" > /dev/null <<'EOF'
422422
[Service]
423423
ExecStart=
424-
ExecStart=/usr/local/bin/nvidia-device-plugin
424+
ExecStart=/opt/bin/nvidia-device-plugin
425425
EOF
426426
# Reload systemd to pick up the base path override
427427
systemctl daemon-reload
@@ -431,7 +431,7 @@ EOF
431431
[Service]
432432
Environment="MIG_STRATEGY=--mig-strategy single"
433433
ExecStart=
434-
ExecStart=/usr/local/bin/nvidia-device-plugin $MIG_STRATEGY
434+
ExecStart=/opt/bin/nvidia-device-plugin $MIG_STRATEGY
435435
EOF
436436
# Reload systemd to pick up drop-ins
437437
systemctl daemon-reload

parts/linux/cloud-init/artifacts/kubelet.service

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[Unit]
22
Description=Kubelet
3-
ConditionPathExists=/usr/local/bin/kubelet
3+
ConditionPathExists=/opt/bin/kubelet
44
Wants=network-online.target containerd.service
55
After=network-online.target containerd.service
66

@@ -22,7 +22,7 @@ ExecStartPre=-/sbin/iptables -t nat --numeric --list
2222

2323
ExecStartPre=/bin/bash /opt/azure/containers/validate-kubelet-credentials.sh
2424

25-
ExecStart=/usr/local/bin/kubelet \
25+
ExecStart=/opt/bin/kubelet \
2626
--enable-server \
2727
--node-labels="${KUBELET_NODE_LABELS}" \
2828
--v=2 \

parts/linux/cloud-init/artifacts/mariner/cse_install_mariner.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ installCredentialProviderFromPMC() {
168168
mkdir -p "${CREDENTIAL_PROVIDER_BIN_DIR}"
169169
chown -R root:root "${CREDENTIAL_PROVIDER_BIN_DIR}"
170170
installRPMPackageFromFile "azure-acr-credential-provider" "${packageVersion}" || exit $ERR_CREDENTIAL_PROVIDER_DOWNLOAD_TIMEOUT
171-
mv "/usr/local/bin/azure-acr-credential-provider" "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
171+
ln -snf /usr/bin/azure-acr-credential-provider "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
172172
}
173173

174174
installKubeletKubectlPkgFromPMC() {
@@ -204,7 +204,7 @@ installRPMPackageFromFile() {
204204
if ! dnf_install 30 1 600 ${rpmFile}; then
205205
exit $ERR_APT_INSTALL_TIMEOUT
206206
fi
207-
mv "/usr/bin/${packageName}" "/usr/local/bin/${packageName}"
207+
ln -snf "/usr/bin/${packageName}" "/opt/bin/${packageName}"
208208
rm -rf ${downloadDir}
209209
}
210210

parts/linux/cloud-init/artifacts/mariner/mariner-package-update.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ set -e
88
OS_RELEASE_FILE="/etc/os-release"
99
SECURITY_PATCH_REPO_DIR="/etc/yum.repos.d"
1010
KUBECONFIG="/var/lib/kubelet/kubeconfig"
11-
KUBECTL="/usr/local/bin/kubectl --kubeconfig ${KUBECONFIG}"
11+
KUBECTL="/opt/bin/kubectl --kubeconfig ${KUBECONFIG}"
1212

1313
# Function definitions used in this file.
1414
# functions defined until "${__SOURCED__:+return}" are sourced and tested in -

parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ installCredentialProviderFromPMC() {
139139
mkdir -p "${CREDENTIAL_PROVIDER_BIN_DIR}"
140140
chown -R root:root "${CREDENTIAL_PROVIDER_BIN_DIR}"
141141
installPkgWithAptGet "azure-acr-credential-provider" "${packageVersion}" || exit $ERR_CREDENTIAL_PROVIDER_DOWNLOAD_TIMEOUT
142-
mv "/usr/local/bin/azure-acr-credential-provider" "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
142+
ln -snf /usr/bin/azure-acr-credential-provider "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
143143
}
144144

145145
installKubeletKubectlPkgFromPMC() {
@@ -175,7 +175,7 @@ installPkgWithAptGet() {
175175

176176
logs_to_events "AKS.CSE.install${packageName}.installDebPackageFromFile" "installDebPackageFromFile ${debFile}" || exit $ERR_APT_INSTALL_TIMEOUT
177177

178-
mv "/usr/bin/${packageName}" "/usr/local/bin/${packageName}"
178+
ln -snf "/usr/bin/${packageName}" "/opt/bin/${packageName}"
179179
rm -rf ${downloadDir}
180180
}
181181

0 commit comments

Comments
 (0)