簡介
本文檔介紹如何為基於IR1101 ARM的物聯網(IoT)網關準備、構建和部署基於Docker的IOx軟體套件。
必要條件
需求
思科建議您瞭解以下主題:
採用元件
本文中的資訊係根據以下軟體和硬體版本:
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您的網路正在作用,請確保您已瞭解任何指令可能造成的影響。
背景資訊
IR1101與大多數其他IOx平台相比稍有不同,因為這些平台主要基於x86。IR1101以ARM64v8架構為基礎,因此您無法直接在平台上部署針對x86構建的容器或IOx軟體套件。本文檔從頭開始,為構建基於ARM64v8的Docker容器準備環境,並說明如何使用x86 PC在IR1101上構建、打包和部署這些容器。
例如,使用非常小的Python指令碼,該指令碼是一個簡單的Web伺服器,並構建了一個Docker容器,最終將其打包在IR1101上運行。Webserver唯一要做的事情是在預定義埠(9000)上偵聽,並在收到GET請求時返回簡單頁面。這可讓您測試執行您自己的程式碼的能力,並讓您在IOx應用程式開始執行後,測試其網路存取權。
該軟體套件由Docker工具使用Alpine Linux構建。Alpine Linux是一個小型Linux映像(約5MB),通常用作Docker容器的基礎。
由於大部分的桌上型電腦/筆記型電腦/虛擬機器器都採用x86架構,因此您需要在建置容器的x86機器上模擬ARM64v8架構。您可以使用快速模擬器(QEMU)使用者模擬輕鬆完成此作業。這允許在非原生架構中執行可執行檔,就像在原生架構上執行一樣。
設定
第1部分。為IR1101構建IOx軟體套件
1. 在Linux主機上安裝和準備IOx客戶端
您需要ioxclient,以便在生成Docker容器時將其打包為IOx包,因此讓我們首先準備此程式。
第一次複製或下載ioxclient軟體套件。可從https://software.cisco.com/download/release.html?mdfid=286306005&softwareid=286306762獲取。
jedepuyd@deb9:~$ scp jedepuyd@192.168.56.101:/home/jedepuyd/ioxclient_1.7.0.0_linux_amd64.tar.gz .
jedepuyd@192.168.56.101's password:
ioxclient_1.7.0.0_linux_amd64.tar.gz 100% 4798KB 75.2MB/s 00:00
解壓縮包:
jedepuyd@deb9:~$ tar -xvzf ioxclient_1.7.0.0_linux_amd64.tar.gz
ioxclient_1.7.0.0_linux_amd64/ioxclient
ioxclient_1.7.0.0_linux_amd64/README.md
將路徑增加到PATH變數,以便在不使用完整位置的情況下使用該變數。如果重新啟動電腦或交換機使用者,則不要忘記重複此步驟:
jedepuyd@deb9:~$ export PATH=$PATH:/home/jedepuyd/ioxclient_1.7.0.0_linux_amd64/
首次啟動ioxclient以建立強制配置檔案。由於您僅使用ioxclient來封裝Docker容器,因此這些值可以保留為預設值:
jedepuyd@deb9:~$ ioxclient -v
ioxclient version 1.7.0.0
jedepuyd@deb9:~/iox_aarch64_webserver$ ioxclient profiles reset
Active Profile : default
Your current config details will be lost. Continue (y/N) ? : y
Current config backed up at /tmp/ioxclient731611124
Config data deleted.
jedepuyd@deb9:~/iox_aarch64_webserver$ ioxclient -v
Config file not found : /home/jedepuyd/.ioxclientcfg.yaml
Creating one time configuration..
Your / your organization's name :
Your / your organization's URL :
Your IOx platform's IP address[127.0.0.1] :
Your IOx platform's port number[8443] :
Authorized user name[root] :
Password for root :
Local repository path on IOx platform[/software/downloads]:
URL Scheme (http/https) [https]:
API Prefix[/iox/api/v2/hosting/]:
Your IOx platform's SSH Port[2222]:
Your RSA key, for signing packages, in PEM format[]:
Your x.509 certificate in PEM format[]:
Activating Profile default
Saving current configuration
ioxclient version 1.7.0.0
2. 在Linux生成電腦上安裝和準備Docker環境
此Docker用於從Alpine基礎映像構建容器並包括使用案例所需的檔案。以下步驟以Docker Community Edition (CE) for Debian的官方安裝指南為基礎:https://docs.docker.com/install/linux/docker-ce/debian/
更新您電腦上的封裝清單:
jedepuyd@deb9:~$ sudo apt-get update
...
Reading package lists... Done
安裝相依性以使用Docker回購:
jedepuyd@deb9:~$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
Reading package lists... Done
Building dependency tree
...
Processing triggers for dbus (1.10.26-0+deb9u1) ...
增加Docker GNU Privacy Guard (GPG)金鑰作為有效的GPG金鑰:
jedepuyd@deb9:~$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
OK
驗證已安裝的GPG金鑰的指紋:
jedepuyd@deb9:~$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
增加Docker穩定回購:
jedepuyd@deb9:~$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
在您新增Docker回購時,再次更新封裝清單:
jedepuyd@deb9:~$ sudo apt-get update
...
Reading package lists... Done
安裝Docker:
jedepuyd@deb9:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io
Reading package lists... Done
Building dependency tree
...
Processing triggers for systemd (232-25+deb9u9) ...
若要以一般使用者身分存取/執行Docker,請將此使用者新增至Docker群組,並重新整理群組成員資格:
jedepuyd@deb9:~$ sudo usermod -a -G docker jedepuyd
jedepuyd@deb9:~$ newgrp docker
3. 安裝QEMU使用者模擬套件
安裝Docker之後,您需要安裝QEMU使用者模擬程式。使用Docker容器中的靜態連結QEMU模擬程式,這樣您便可以在基於x86的Linux電腦上運行ARM64v8的容器,儘管目標容器是針對ARM64v8體系結構設計的。
安裝套裝軟體:
jedepuyd@deb9:~$ sudo apt-get install qemu-user qemu-user-static
Reading package lists... Done
Building dependency tree
...
Processing triggers for man-db (2.7.6.1-2) ...
安裝完成後,以下是在/usr/bin中可用的靜態連結的QEMU模擬器:
jedepuyd@deb9:~$ ls -al /usr/bin/qemu-*static
-rwxr-xr-x 1 root root 3468784 Nov 8 16:41 /usr/bin/qemu-aarch64-static
-rwxr-xr-x 1 root root 2791408 Nov 8 16:41 /usr/bin/qemu-alpha-static
-rwxr-xr-x 1 root root 3399344 Nov 8 16:41 /usr/bin/qemu-armeb-static
-rwxr-xr-x 1 root root 3391152 Nov 8 16:41 /usr/bin/qemu-arm-static
-rwxr-xr-x 1 root root 2800400 Nov 8 16:41 /usr/bin/qemu-cris-static
...
清單中的第一個是您需要的:aarch64是ARM64v8 for Linux的拱形名稱。
4. 測試aarch64/ARV64v8容器是否在x86 Linux機器上運行
現在您已安裝Docker和必要的QEMU二進位檔,就可以測試您是否能在x86機器上執行為ARM64v8建立的Docker容器:
jedepuyd@deb9:~$ docker run -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static --rm -ti arm64v8/alpine:3.7
Unable to find image 'arm64v8/alpine:3.7' locally
3.7: Pulling from arm64v8/alpine
40223db5366f: Pull complete
Digest: sha256:a50c0cd3b41129046184591963a7a76822777736258e5ade8445b07c88bfdcc3
Status: Downloaded newer image for arm64v8/alpine:3.7
/ # uname -a
Linux 1dbba69b60c5 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) aarch64 Linux
正如您在輸出中所看到的,arm64v8 Alpine容器已獲得,並且可透過訪問模擬程式運行。
如果您請求容器的體系結構,則可以看到代碼已針對aarch64進行編譯。與IR1101的目標拱門完全相同。
5. 準備檔案以建置Docker Webserver容器
現在,所有準備工作都完成了,您可以為需要在IR1101上運行的Web伺服器容器建立必要的檔案。
第一個檔案是webserver.py,您希望在容器中運行的Python指令碼。由於這只是一個示例,很顯然,您用實際代碼替換此代碼以便在IOx應用程式中運行:
jedepuyd@deb9:~$ mkdir iox_aarch64_webserver
jedepuyd@deb9:~$ cd iox_aarch64_webserver
jedepuyd@deb9:~/iox_aarch64_webserver$ vi webserver.py
jedepuyd@deb9:~/iox_aarch64_webserver$ cat webserver.py
#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import os
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_GET(self):
self._set_headers()
self.wfile.write("<html><body><h1>IOX python webserver on arm64v8</h1></body></html>")
logf.write('Got GET\n')
logf.flush()
def run(server_class=HTTPServer, handler_class=S, port=9000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting webserver...'
logf.write('Starting webserver....\n')
logf.flush()
httpd.serve_forever()
if __name__ == "__main__":
log_file_dir = os.getenv("CAF_APP_LOG_DIR", "/tmp")
log_file_path = os.path.join(log_file_dir, "webserver.log")
logf = open(log_file_path, 'w')
run()
logf.close()
此程式碼包含寫入記錄檔的邏輯,可供本機管理員查閱。
需要的第二個檔案是Dockerfile。這定義了容器的構建方式:
jedepuyd@deb9:~/iox_aarch64_webserver$ vi Dockerfile
jedepuyd@deb9:~/iox_aarch64_webserver$ cat Dockerfile
FROM arm64v8/alpine:3.7
COPY qemu-aarch64-static /usr/bin
RUN apk add --no-cache python
COPY webserver.py /webserver.py
Dockerfile定義容器的建置方式。從ARM64v8的Apline基礎影像開始,複製容器中的模擬器,執行apk以新增Python套件,並將Web伺服器指令碼複製到容器中。
在構建容器之前需要的最後一個準備是將qemu-aarch64-static複製到從中構建容器的目錄:
jedepuyd@deb9:~/iox_aarch64_webserver$ cp /usr/bin/qemu-aarch64-static .
6. 建立Docker容器
現在所有準備工作都已完成,您可以使用Dockerfile建立容器:
jedepuyd@deb9:~/iox_aarch64_webserver$ docker build -t iox_aarch64_webserver .
Sending build context to Docker daemon 3.473MB
Step 1/4 : FROM arm64v8/alpine:3.7
---> e013d5426294
Step 2/4 : COPY qemu-aarch64-static /usr/bin
---> addf4e1cc965
Step 3/4 : RUN apk add --no-cache python
---> Running in ff3768926645
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/aarch64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/aarch64/APKINDEX.tar.gz
(1/10) Installing libbz2 (1.0.6-r6)
(2/10) Installing expat (2.2.5-r0)
(3/10) Installing libffi (3.2.1-r4)
(4/10) Installing gdbm (1.13-r1)
(5/10) Installing ncurses-terminfo-base (6.0_p20171125-r1)
(6/10) Installing ncurses-terminfo (6.0_p20171125-r1)
(7/10) Installing ncurses-libs (6.0_p20171125-r1)
(8/10) Installing readline (7.0.003-r0)
(9/10) Installing sqlite-libs (3.25.3-r0)
(10/10) Installing python2 (2.7.15-r2)
Executing busybox-1.27.2-r11.trigger
OK: 51 MiB in 23 packages
Removing intermediate container ff3768926645
---> eda469dab9c6
Step 4/4 : COPY webserver.py /webserver.py
---> ccf7ee7227c9
Successfully built ccf7ee7227c9
Successfully tagged iox_aarch64_webserver:latest
作為測試,請運行剛剛構建的容器,並檢查指令碼是否有效:
jedepuyd@deb9:~/iox_aarch64_webserver$ docker run -ti iox_aarch64_webserver
/ # uname -a
Linux dae047f1a6b2 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) aarch64 Linux
/ # python webserver.py &
/ # Starting webserver...
/ # netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 13/qemu-aarch64-sta
/ # exit
正如您在此輸出中所看到的,容器的體系結構是目標的aarch64。啟動指令碼後,您會看到它正在偵聽埠9000上的請求。
7. 構建IOx包
容器已準備好進行封裝。在要求ioxclient執行此操作之前,首先需要建立包描述符:package.yaml。
此檔案說明封裝的外觀、需要執行多少資源以及啟動什麼。
jedepuyd@deb9:~/iox_aarch64_webserver$ vi package.yaml
jedepuyd@deb9:~/iox_aarch64_webserver$ cat package.yaml
descriptor-schema-version: "2.7"
info:
name: "iox_aarch64_webserver"
description: "simple docker webserver for arm64v8"
version: "1.0"
author-link: "http://www.cisco.com"
author-name: "Jens Depuydt"
app:
cpuarch: "aarch64"
type: "docker"
resources:
profile: c1.tiny
network:
-
interface-name: eth0
ports:
tcp: ["9000"]
startup:
rootfs: rootfs.tar
target: ["python","/webserver.py"]
如您所見,CPU架構已設定為aarch64。要獲得訪問TCP埠9000的許可權,請使用rootfs.tar作為rootfs,並在啟動時運行python/webserver.py。
在打包前,最後需要做的就是從Docker容器中提取rootfs.tar:
jedepuyd@deb9:~/iox_aarch64_webserver$ docker save -o rootfs.tar iox_aarch64_webserver
此時,您可以使用ioxclient來構建用於IR1101的IOx包:
jedepuyd@deb9:~/iox_aarch64_webserver$ ioxclient package .
Currently active profile : default
Command Name: package
No rsa key and/or certificate files provided to sign the package
Checking if package descriptor file is present..
Validating descriptor file /home/jedepuyd/iox_aarch64_webserver/package.yaml with package schema definitions
Parsing descriptor file..
Found schema version 2.7
Loading schema file for version 2.7
Validating package descriptor file..
File /home/jedepuyd/iox_aarch64_webserver/package.yaml is valid under schema version 2.7
Created Staging directory at : /tmp/017226485
Copying contents to staging directory
Creating an inner envelope for application artifacts
Generated /tmp/017226485/artifacts.tar.gz
Calculating SHA1 checksum for package contents..
Updated package metadata file : /tmp/017226485/.package.metadata
Root Directory : /tmp/017226485
Output file: /tmp/475248592
Path: .package.metadata
SHA1 : 95abe28fc05395fc5f71f7c28f59eceb1495bf9b
Path: artifacts.tar.gz
SHA1 : bdf5596a0747eae51bb0a1d2870fd09a5a16a098
Path: package.yaml
SHA1 : e65a6fcbe96725dd5a09b60036448106acc0c138
Generated package manifest at package.mf
Generating IOx Package..
Package generated at /home/jedepuyd/iox_aarch64_webserver/package.tar
現在,有一個軟體套件要部署在IR1101上,並準備為package.tar。下一部分說明如何準備部署裝置。
第2部分配置IR1101的IOx
1. 啟用Web介面、IOx和本機管理員
Local Manager是一種GUI,用於部署、啟用、啟動、管理並排除IOx應用故障。對於IR1101,它嵌入在常規管理Web介面中。因此,您需要先啟用該功能。
在IR1101上執行這些步驟以啟用IOx和Web介面。
BRU_IR1101_20#conf t
Enter configuration commands, one per line. End with CNTL/Z.
BRU_IR1101_20(config)#iox
BRU_IR1101_20(config)#ip http server
BRU_IR1101_20(config)#ip http secure-server
BRU_IR1101_20(config)#ip http authentication local
BRU_IR1101_20(config)#username admin privilege 15 password 0 cisco
最後一行將增加具有15個許可權的使用者。此使用者有權訪問Web介面和IOx本地管理器。
2. 配置IOx網路
在訪問Web介面之前,讓我們為IOx網路增加所需的配置。背景資訊可以在IOx的IR1101文檔中找到:https://www.cisco.com/c/en/us/td/docs/routers/access/1101/software/configuration/guide/b-cisco-ir1101-scg.html
簡而言之,IOx應用程式可以使用VirtualPortGroup0介面與外界通訊(與IR809上的Gi2和IR829介面上的Gi5相當)。
BRU_IR1101_20(config)#interface VirtualPortGroup0
BRU_IR1101_20(config-if)# ip address 192.168.1.1 255.255.255.0
BRU_IR1101_20(config-if)# ip nat inside
BRU_IR1101_20(config-if)# ip virtual-reassembly
BRU_IR1101_20(config-if)#exit
在將VirtualPortGroup0介面配置為內部網路地址轉換(NAT)時,需要在Gi 0/0/0介面上增加ip nat outside語句,以允許使用NAT與IOx應用程式進行雙向通訊:
BRU_IR1101_20(config)#interface gigabitEthernet 0/0/0
BRU_IR1101_20(config-if)#ip nat outside
BRU_IR1101_20(config-if)#ip virtual-reassembly
為了允許訪問容器的埠9000(可以為192.168.1.15),您需要增加一個埠轉發:
BRU_IR1101_20(config)#$ip nat inside source static tcp 192.168.1.15 9000 interface GigabitEthernet0/0/0 9000
在本指南中,使用每個IOx應用的靜態配置的IP。如果要為應用程式動態分配IP地址,則需要為VirtualPortGroup0子網中的DHCP伺服器增加配置。
第3部分。訪問本地管理器並部署IOx應用程式
將這些行增加到配置後,可以使用Web介面訪問IR1101。使用瀏覽器導航到Gi 0/0/0 IP地址,如圖所示。
使用步驟1中建立的許可權15帳戶,以登入Web介面並導航到配置 - IOx,如圖所示。
在IOx Local Manager登入中,使用相同的帳戶繼續,如圖所示。
按一下Add New,選擇IOx應用程式的名稱,然後選擇在第1部分中構建的package.tar,如圖所示。
上傳封裝後,您可以將其啟用,如下圖所示。
在Resources頁籤中,打開介面設定以指定要分配給應用程式的固定IP,如圖所示。
按一下OK,然後Activate。動作完成時,導覽回主Local Manager頁面(頂端功能表上的Applications按鈕),然後啟動應用程式,如下圖所示。
完成這些步驟後,您的應用程式將運行,並使用IR1101的Gi 0/0/0介面透過埠9000可用。
驗證
使用本節內容,確認您的組態是否正常運作。
要進行驗證,您可以使用埠9000訪問IR1101上Gi 0/0/0介面的IP地址。
如果一切順利的話,就會如同Python指令碼中建立的一樣。
疑難排解
本節提供的資訊可用於對組態進行疑難排解。
為了排除故障,您可以使用本地管理器檢查您在Python指令碼中建立的日誌檔案。
導覽至Applications,按一下iox_web應用程式上的Manage,然後選擇Logs索引標籤,如下圖所示。