Как настроить сеть для контейнера, который загружается с помощью containerd с помощью плагинов cni? - PullRequest
0 голосов
/ 28 апреля 2020

Я использую инструмент ctr cmdline, который похож на инструмент docker cmdline для containerd, для загрузки контейнера. Это команда, которую я использовал: sudo ctr run -t --rm docker.io/library/busybox:latest hello sh.

Я использовал плагины cni для настройки сети контейнера. Я следовал официальной документации cni . Я написал /etc/cni/net.d/10-mynet.conf и /etc/cni/net.d/99-loopback.conf как показ учебника. Когда я хотел выполнить эту команду: sudo CNI_PATH=$CNI_PATH ./priv-net-run.sh ifconfig. Содержание priv- net -run. sh выглядит следующим образом:

#!/usr/bin/env bash                                              
set -e
if [[ ${DEBUG} -gt 0 ]]; then set -x; fi

# Run a command in a private network namespace
# set up by CNI plugins
contid=$(printf '%x%x%x%x' $RANDOM $RANDOM $RANDOM $RANDOM)
netnspath=/var/run/netns/$contid

ip netns add $contid
./exec-plugins.sh add $contid $netnspath


function cleanup() {
    ./exec-plugins.sh del $contid $netnspath
    ip netns delete $contid
}
trap cleanup EXIT

ip netns exec $contid "$@"

И exe c -plugins. sh выглядит следующим образом:

#!/usr/bin/env bash                                                      

if [[ ${DEBUG} -gt 0 ]]; then set -x; fi

NETCONFPATH=${NETCONFPATH-/etc/cni/net.d}

function exec_plugins() {
    i=0
    contid=$2
    netns=$3
    export CNI_COMMAND=$(echo $1 | tr '[:lower:]' '[:upper:]')
    export PATH=$CNI_PATH:$PATH
    export CNI_CONTAINERID=$contid
    export CNI_NETNS=$netns

    for netconf in $(echo $NETCONFPATH/*.conf | sort); do
        name=$(jq -r '.name' <$netconf)
        plugin=$(jq -r '.type' <$netconf)
        export CNI_IFNAME=$(printf eth%d $i)

        res=$($plugin <$netconf)
        if [ $? -ne 0 ]; then
            errmsg=$(echo $res | jq -r '.msg')
            if [ -z "$errmsg" ]; then
                errmsg=$res
            fi

            echo "${name} : error executing $CNI_COMMAND: $errmsg"
            exit 1
        elif [[ ${DEBUG} -gt 0 ]]; then
            echo ${res} | jq -r .
        fi

        let "i=i+1"
    done
}

if [ $# -ne 3 ]; then
    echo "Usage: $0 add|del CONTAINER-ID NETNS-PATH"
    echo "  Adds or deletes the container specified by NETNS-PATH to the networks"
    echo "  specified in \$NETCONFPATH directory"
    exit 1
fi

exec_plugins $1 $2 $3  

Я думал, что netnspath должен быть моим пространством имен сети контейнеров. Я нашел pid контейнера и установил netnspath как /proc/$(pid)/ns/net. Тогда я exe c sudo CNI_PATH=$CNI_PATH ./priv-net-run.sh ifconfig но ничего не произошло. Когда я использую ifconfig для просмотра информации о сети, на моем хосте появилась только новая сетевая карта с именем cni0. В контейнере не было сетевой карты, кроме lo.

Интересно, как использовать плагины cni для настройки сети для контейнера.

...