github.com/containerd/Containerd@v1.4.13/script/setup/install-cni-windows (about) 1 #!/bin/bash 2 3 # Copyright The containerd Authors. 4 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 9 # http://www.apache.org/licenses/LICENSE-2.0 10 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 set -eu -o pipefail 18 19 DESTDIR="${DESTDIR:-"C:\\Program Files\\containerd"}" 20 WINCNI_BIN_DIR="${DESTDIR}/cni" 21 WINCNI_PKG=github.com/Microsoft/windows-container-networking 22 WINCNI_VERSION=aa10a0b31e9f72937063436454def1760b858ee2 23 24 git clone "https://${WINCNI_PKG}.git" "${GOPATH}/src/${WINCNI_PKG}" 25 cd "${GOPATH}/src/${WINCNI_PKG}" 26 git checkout "${WINCNI_VERSION}" 27 make all 28 install -D -m 755 "out/nat.exe" "${WINCNI_BIN_DIR}/nat.exe" 29 install -D -m 755 "out/sdnbridge.exe" "${WINCNI_BIN_DIR}/sdnbridge.exe" 30 install -D -m 755 "out/sdnoverlay.exe" "${WINCNI_BIN_DIR}/sdnoverlay.exe" 31 32 CNI_CONFIG_DIR="${DESTDIR}/cni/conf" 33 mkdir -p "${CNI_CONFIG_DIR}" 34 35 # split_ip splits ip into a 4-element array. 36 split_ip() { 37 local -r varname="$1" 38 local -r ip="$2" 39 for i in {0..3}; do 40 eval "$varname"[$i]=$( echo "$ip" | cut -d '.' -f $((i + 1)) ) 41 done 42 } 43 44 # subnet gets subnet for a gateway, e.g. 192.168.100.0/24. 45 calculate_subnet() { 46 local -r gateway="$1" 47 local -r prefix_len="$2" 48 split_ip gateway_array "$gateway" 49 local len=$prefix_len 50 for i in {0..3}; do 51 if (( len >= 8 )); then 52 mask=255 53 elif (( len > 0 )); then 54 mask=$(( 256 - 2 ** ( 8 - len ) )) 55 else 56 mask=0 57 fi 58 (( len -= 8 )) 59 result_array[i]=$(( gateway_array[i] & mask )) 60 done 61 result="$(printf ".%s" "${result_array[@]}")" 62 result="${result:1}" 63 echo "$result/$((32 - prefix_len))" 64 } 65 66 # nat already exists on the Windows VM, the subnet and gateway 67 # we specify should match that. 68 gateway="$(powershell -c "(Get-NetIPAddress -InterfaceAlias 'vEthernet (nat)' -AddressFamily IPv4).IPAddress")" 69 prefix_len="$(powershell -c "(Get-NetIPAddress -InterfaceAlias 'vEthernet (nat)' -AddressFamily IPv4).PrefixLength")" 70 71 subnet="$(calculate_subnet "$gateway" "$prefix_len")" 72 73 # The "name" field in the config is used as the underlying 74 # network type right now (see 75 # https://github.com/microsoft/windows-container-networking/pull/45), 76 # so it must match a network type in: 77 # https://docs.microsoft.com/en-us/windows-server/networking/technologies/hcn/hcn-json-document-schemas 78 bash -c 'cat >"'"${CNI_CONFIG_DIR}"'"/0-containerd-nat.conf <<EOF 79 { 80 "cniVersion": "0.2.0", 81 "name": "nat", 82 "type": "nat", 83 "master": "Ethernet", 84 "ipam": { 85 "subnet": "'$subnet'", 86 "routes": [ 87 { 88 "GW": "'$gateway'" 89 } 90 ] 91 }, 92 "capabilities": { 93 "portMappings": true, 94 "dns": true 95 } 96 } 97 EOF'