Skip to content

Commit 561677c

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 da54074 commit 561677c

14 files changed

Lines changed: 37 additions & 48 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: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ installKubeletKubectlPkgFromPMC() {
1313
installRPMPackageFromFile() {
1414
local packageName="${1}"
1515
local desiredVersion="${2}"
16-
local targetBinDir="${3:-"/usr/local/bin"}"
16+
local targetBinDir="${3:-"/opt/bin"}"
1717

1818
echo "installing ${packageName} version ${desiredVersion} by manually unpacking the RPM"
1919
if [ "${packageName}" != "kubelet" ] && [ "${packageName}" != "kubectl" ] && [ "${packageName}" != "azure-acr-credential-provider" ]; then
@@ -52,19 +52,8 @@ installRPMPackageFromFile() {
5252
fi
5353

5454
echo "Unpacking usr/bin/${rpmBinaryName} from ${downloadDir}/${packageName}-${desiredVersion}*"
55-
pushd ${downloadDir} || exit 1
56-
rpm2cpio "${rpmFile}" | cpio -idmv
57-
mkdir -p "${targetBinDir}"
58-
if [ -f "usr/bin/${rpmBinaryName}" ]; then
59-
mv "usr/bin/${rpmBinaryName}" "${targetBinDir}/${targetBinaryName}"
60-
elif [ -f "usr/local/bin/${rpmBinaryName}" ]; then
61-
mv "usr/local/bin/${rpmBinaryName}" "${targetBinDir}/${targetBinaryName}"
62-
else
63-
popd || exit 1
64-
rm -rf ${downloadDir}
65-
return 1
66-
fi
67-
popd || exit 1
55+
# This assumes that the binary will either be in /usr/bin or /usr/local/bin, but not both.
56+
rpm2cpio "${rpmFile}" | cpio -i --to-stdout "./usr/bin/${rpmBinaryName}" "./usr/local/bin/${rpmBinaryName}" | install -m0755 /dev/stdin "${targetBinDir}/${targetBinaryName}"
6857
rm -rf ${downloadDir}
6958
}
7059

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ AZURELINUX_KATA_OS_NAME="AZURELINUXKATA"
171171
AZURELINUX_OS_NAME="AZURELINUX"
172172
FLATCAR_OS_NAME="FLATCAR"
173173
AZURELINUX_OSGUARD_OS_VARIANT="OSGUARD"
174-
KUBECTL=/usr/local/bin/kubectl
174+
KUBECTL=/opt/bin/kubectl
175175
DOCKER=/usr/bin/docker
176176
# this will be empty during VHD build
177177
# but vhd build runs with `set -o nounset`
@@ -1234,6 +1234,7 @@ extract_tarball() {
12341234
local tarball="$1"
12351235
local dest="$2"
12361236
shift 2
1237+
mkdir -p "$dest"
12371238
# Use tar options if provided, otherwise default to -xzf
12381239
case "$tarball" in
12391240
*.tar.gz|*.tgz)

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -459,15 +459,15 @@ installAzureCNI() {
459459
}
460460

461461
# extract the cached or downloaded kube package and remove
462-
extractKubeBinariesToUsrLocalBin() {
462+
extractKubeBinariesToOptBin() {
463463
local k8s_tgz_tmp=$1
464464
local k8s_version=$2
465465
local is_private_url=$3
466466

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

501501
echo "cached package ${k8s_tgz_tmp} found, will extract that"
502502
# remove the current kubelet and kubectl binaries before extracting new binaries from the cached package
503-
rm -rf /usr/local/bin/kubelet-* /usr/local/bin/kubectl-*
503+
rm -rf /opt/bin/kubelet-* /opt/bin/kubectl-*
504504
else
505505
k8s_tgz_tmp="${k8s_downloads_dir}/${k8s_tgz_tmp_filename}"
506506
mkdir -p ${k8s_downloads_dir}
@@ -523,7 +523,7 @@ extractKubeBinaries() {
523523
fi
524524
fi
525525

526-
extractKubeBinariesToUsrLocalBin "${k8s_tgz_tmp}" "${k8s_version}" "${is_private_url}"
526+
extractKubeBinariesToOptBin "${k8s_tgz_tmp}" "${k8s_version}" "${is_private_url}"
527527
}
528528

529529
installToolFromBootstrapProfileRegistry() {
@@ -579,7 +579,7 @@ installKubeletKubectlFromBootstrapProfileRegistry() {
579579
local registry_server=$1
580580
local kubernetes_version=$2
581581
for tool_name in $(get_kubernetes_tools); do
582-
install_path="/usr/local/bin/${tool_name}"
582+
install_path="/opt/bin/${tool_name}"
583583
if ! installToolFromBootstrapProfileRegistry "${tool_name}" "${registry_server}" "${kubernetes_version}" "${install_path}"; then
584584
# SHOULD_ENFORCE_KUBE_PMC_INSTALL will only be set for e2e tests, which should not fallback to reflect result of package installation behavior
585585
# TODO: remove SHOULD_ENFORCE_KUBE_PMC_INSTALL check when the test cluster supports > 1.34.0 case
@@ -604,7 +604,7 @@ installKubeletKubectlFromURL() {
604604

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

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

619619
# 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
620-
if [ ! -f "/usr/local/bin/kubectl-${KUBERNETES_VERSION}" ] || [ ! -f "/usr/local/bin/kubelet-${KUBERNETES_VERSION}" ]; then
620+
if [ ! -f "/opt/bin/kubectl-${KUBERNETES_VERSION}" ] || [ ! -f "/opt/bin/kubelet-${KUBERNETES_VERSION}" ]; then
621621
if [ "$install_default_if_missing" = "true" ]; then
622622
if [ -n "${BOOTSTRAP_PROFILE_CONTAINER_REGISTRY_SERVER}" ]; then
623623
# network isolated cluster
@@ -635,11 +635,10 @@ installKubeletKubectlFromURL() {
635635
fi
636636
fi
637637
fi
638-
mv "/usr/local/bin/kubelet-${KUBERNETES_VERSION}" "/usr/local/bin/kubelet"
639-
mv "/usr/local/bin/kubectl-${KUBERNETES_VERSION}" "/usr/local/bin/kubectl"
638+
install -m0755 "/opt/bin/kubelet-${KUBERNETES_VERSION}" /opt/bin/kubelet
639+
install -m0755 "/opt/bin/kubectl-${KUBERNETES_VERSION}" /opt/bin/kubectl
640640

641-
chmod a+x /usr/local/bin/kubelet /usr/local/bin/kubectl
642-
rm -rf /usr/local/bin/kubelet-* /usr/local/bin/kubectl-* /home/hyperkube-downloads &
641+
rm -rf /opt/bin/kubelet-* /opt/bin/kubectl-* /home/hyperkube-downloads &
643642
}
644643

645644
pullContainerImage() {

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: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ installCredentialProviderFromPMC() {
189189
mkdir -p "${CREDENTIAL_PROVIDER_BIN_DIR}"
190190
chown -R root:root "${CREDENTIAL_PROVIDER_BIN_DIR}"
191191
installRPMPackageFromFile "azure-acr-credential-provider" "${packageVersion}" || exit $ERR_CREDENTIAL_PROVIDER_DOWNLOAD_TIMEOUT
192-
mv "/usr/local/bin/azure-acr-credential-provider" "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
192+
ln -snf /usr/bin/azure-acr-credential-provider "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
193193
}
194194

195195
installKubeletKubectlPkgFromPMC() {
@@ -395,7 +395,8 @@ installRPMPackageFromFile() {
395395
if ! dnf_install 30 1 600 ${rpmFile}; then
396396
exit $ERR_APT_INSTALL_TIMEOUT
397397
fi
398-
mv "/usr/bin/${packageName}" "/usr/local/bin/${packageName}"
398+
mkdir -p /opt/bin
399+
ln -snf "/usr/bin/${packageName}" "/opt/bin/${packageName}"
399400
rm -rf ${downloadDir}
400401
}
401402

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
KUBELET_EXECUTABLE="/usr/local/bin/kubelet"
1313
SECURITY_PATCH_TMP_DIR="/tmp/security-patch"
1414

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ installCredentialProviderFromPMC() {
202202
mkdir -p "${CREDENTIAL_PROVIDER_BIN_DIR}"
203203
chown -R root:root "${CREDENTIAL_PROVIDER_BIN_DIR}"
204204
installPkgWithAptGet "azure-acr-credential-provider" "${packageVersion}" || exit $ERR_CREDENTIAL_PROVIDER_DOWNLOAD_TIMEOUT
205-
mv "/usr/local/bin/azure-acr-credential-provider" "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
205+
ln -snf /usr/bin/azure-acr-credential-provider "$CREDENTIAL_PROVIDER_BIN_DIR/acr-credential-provider"
206206
}
207207

208208
installKubeletKubectlPkgFromPMC() {
@@ -307,7 +307,8 @@ installPkgWithAptGet() {
307307

308308
logs_to_events "AKS.CSE.install${packageName}.installDebPackageFromFile" "installDebPackageFromFile ${debFile}" || exit $ERR_APT_INSTALL_TIMEOUT
309309

310-
mv "/usr/bin/${packageName}" "/usr/local/bin/${packageName}"
310+
mkdir -p /opt/bin
311+
ln -snf "/usr/bin/${packageName}" "/opt/bin/${packageName}"
311312
rm -rf ${downloadDir}
312313
}
313314

parts/linux/cloud-init/artifacts/ubuntu/ubuntu-snapshot-update.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ set -e
77
# -------------------------------------------------------------------------------------------------
88
SECURITY_PATCH_CONFIG_DIR=/var/lib/security-patch
99
KUBECONFIG="/var/lib/kubelet/kubeconfig"
10-
KUBECTL="/usr/local/bin/kubectl --kubeconfig ${KUBECONFIG}"
10+
KUBECTL="/opt/bin/kubectl --kubeconfig ${KUBECONFIG}"
1111
DEFAULT_ENDPOINT="snapshot.ubuntu.com"
1212

1313
# Function definitions used in this file.

0 commit comments

Comments
 (0)