#!/usr/bin/env bash # Copyright (c) 2019 Intel Corporation # # SPDX-License-Identifier: Apache-2.0 # set -o errexit set -o pipefail set -o nounset containerd_conf_file="/etc/containerd/config.toml" containerd_conf_file_backup="${containerd_conf_file}.bak" shims=( "qemu" "qemu-tdx" "qemu-sev" "clh" "clh-tdx" ) default_shim="qemu" # If we fail for any reason a message will be displayed die() { msg="$*" echo "ERROR: $msg" >&2 exit 1 } function print_usage() { echo "Usage: $0 [install/cleanup/reset]" } function get_container_runtime() { local runtime=$(kubectl get node $NODE_NAME -o jsonpath='{.status.nodeInfo.containerRuntimeVersion}') if [ "$?" -ne 0 ]; then die "invalid node name" fi if echo "$runtime" | grep -qE 'containerd.*-k3s'; then if systemctl is-active --quiet rke2-agent; then echo "rke2-agent" elif systemctl is-active --quiet rke2-server; then echo "rke2-server" elif systemctl is-active --quiet k3s-agent; then echo "k3s-agent" else echo "k3s" fi else echo "$runtime" | awk -F '[:]' '{print $1}' fi } function install_artifacts() { echo "copying kata artifacts onto host" cp -a /opt/kata-artifacts/opt/confidential-containers/* /opt/confidential-containers/ chmod +x /opt/confidential-containers/bin/* } function configure_cri_runtime() { configure_different_shims_base case $1 in containerd | k3s | k3s-agent | rke2-agent | rke2-server) configure_containerd ;; esac systemctl daemon-reload systemctl restart "$1" } function backup_shim() { local shim_file="$1" local shim_backup="${shim_file}.bak" if [ -f "${shim_file}" ]; then echo "warning: ${shim_file} already exists" >&2 if [ ! -f "${shim_backup}" ]; then mv "${shim_file}" "${shim_backup}" else rm "${shim_file}" fi fi } function configure_different_shims_base() { # Currently containerd has an assumption on the location of the shimv2 implementation # This forces kata-deploy to create files in a well-defined location that's part of # the PATH, pointing to the containerd-shim-kata-v2 binary in /opt/confidential-contaienrs/bin # Issues: # https://github.com/containerd/containerd/issues/3073 # https://github.com/containerd/containerd/issues/5006 local default_shim_file="/usr/local/bin/containerd-shim-kata-v2" mkdir -p /usr/local/bin for shim in "${shims[@]}"; do local shim_binary="containerd-shim-kata-${shim}-v2" local shim_file="/usr/local/bin/${shim_binary}" backup_shim "${shim_file}" ln -sf /opt/confidential-containers/bin/containerd-shim-kata-v2 "${shim_file}" chmod +x "$shim_file" if [ "${shim}" == "${default_shim}" ]; then backup_shim "${default_shim_file}" echo "Creating the default shim-v2 binary" ln -sf "${shim_file}" "${default_shim_file}" fi done } function restore_shim() { local shim_file="$1" local shim_backup="${shim_file}.bak" if [ -f "${shim_backup}" ]; then mv "$shim_backup" "$shim_file" fi } function cleanup_different_shims_base() { local default_shim_file="/usr/local/bin/containerd-shim-kata-v2" for shim in "${shims[@]}"; do local shim_binary="containerd-shim-kata-${shim}-v2" local shim_file="/usr/local/bin/${shim_binary}" rm "${shim_file}" || true restore_shim "${shim_file}" done rm "${default_shim_file}" || true restore_shim "${default_shim_file}" } function configure_containerd_runtime() { local runtime="kata" local configuration="configuration" if [ -n "${1-}" ]; then runtime+="-$1" configuration+="-$1" fi local pluginid=cri if grep -q "version = 2\>" $containerd_conf_file; then pluginid=\"io.containerd.grpc.v1.cri\" fi local runtime_table="plugins.${pluginid}.containerd.runtimes.$runtime" local runtime_type="io.containerd.$runtime.v2" local options_table="$runtime_table.options" local config_path="/opt/confidential-containers/share/defaults/kata-containers/$configuration.toml" if grep -q "\[$runtime_table\]" $containerd_conf_file; then echo "Configuration exists for $runtime_table, overwriting" sed -i "/\[$runtime_table\]/,+1s#runtime_type.*#runtime_type = \"${runtime_type}\"#" $containerd_conf_file else cat < "$containerd_conf_file" fi action=${1:-} if [ -z "$action" ]; then print_usage die "invalid arguments" fi case "$action" in install) install_artifacts configure_cri_runtime "$runtime" kubectl label node "$NODE_NAME" --overwrite katacontainers.io/kata-runtime=true ;; cleanup) cleanup_cri_runtime "$runtime" kubectl label node "$NODE_NAME" --overwrite katacontainers.io/kata-runtime=cleanup remove_artifacts ;; reset) reset_runtime $runtime ;; *) echo invalid arguments print_usage ;; esac #It is assumed this script will be called as a daemonset. As a result, do # not return, otherwise the daemon will restart and rexecute the script sleep infinity } main "$@"