はじめに
このドキュメントでは、IR1101 ARMベースのInternet of Things(IoT)ゲートウェイ用のDockerベースのIOxパッケージを準備、構築、および導入する方法について説明します。
前提条件
要件
次の項目に関する知識があることが推奨されます。
使用するコンポーネント
このドキュメントの情報は、次のソフトウェアとハードウェアのバージョンに基づいています。
このドキュメントの情報は、特定のラボ環境にあるデバイスに基づいて作成されました。このドキュメントで使用するすべてのデバイスは、クリアな(デフォルト)設定で作業を開始しています。対象のネットワークが実稼働中である場合には、どのようなコマンドについても、その潜在的な影響について確実に理解しておく必要があります。
背景説明
IR1101は主にx86ベースであるため、他のほとんどのIOxプラットフォームとは少し異なります。IR1101はARM64v8アーキテクチャに基づいているため、x86用に構築されたコンテナやIOxパッケージをプラットフォームに直接展開することはできません。このドキュメントでは、最初からARM64v8ベースのDockerコンテナを構築するための環境を準備し、x86 PCを使用してIR1101上でコンテナを構築、パッケージ、導入する方法について説明します。
例として、単純なWebサーバである非常に小さなPythonスクリプトが使用され、Dockerコンテナが構築されて、最終的にパッケージ化されてIR1101で実行されます。Webサーバが行うのは、事前に定義されたポート(9000)でリッスンし、GET要求を受信したときに単純なpagevを返す以外にありません。これにより、独自のコードを実行する機能をテストし、IOxアプリケーションの実行を開始した後にそのアプリケーションへのネットワークアクセスをテストできます。
パッケージはAlpine Linuxを使用してDockerツールによって構築されます。Alpine Linuxは小さなLinuxイメージ(約5MB)で、Dockerコンテナのベースとしてよく使用されます。
デスクトップ/ラップトップ/VMの大部分はx86ベースであるため、コンテナが構築されているx86ベースのマシンでARM64v8アーキテクチャをエミュレートする必要があります。これは、クイックエミュレータ(QEMU)ユーザエミュレーションを使用して簡単に実行できます。これにより、ネイティブ・アーキテクチャ上で実行されるのと同様に、非ネイティブ・アーキテクチャで実行可能ファイルを実行できます。
設定
パート1:IR1101用IOxパッケージの構築
1. LinuxホストへのIOxクライアントのインストールと準備
Dockerコンテナを構築したら、それをIOxパッケージとしてパッケージ化するためにioxclientが必要になります。ではまず、これを準備しましょう。
まず、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を初めて起動します。Dockerコンテナのパッケージ化にioxclientのみを使用する場合、値はデフォルトのままにしておくことができます。
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ベースイメージからコンテナを構築し、ユースケースに必要なファイルを含めるために使用されます。この手順は、Debian用のDocker Community Edition(CE)の公式インストールガイド(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) ...
有効なGPGキーとしてDocker GNU Privacy Guard(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エミュレータを使用すると、ターゲットコンテナはARM64v8アーキテクチャ用に設計されていますが、ARM64v8用のコンテナをx86ベースのLinuxマシン上で実行できます。
パッケージをインストールします。
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は、Linux用のARM64v8のarch-nameです。
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 Webサーバコンテナを構築するためのファイルの準備
すべての準備が完了したので、IR1101で実行する必要があるWebサーバコンテナに必要なファイルを作成できます。
最初のファイルは、コンテナ内で実行するPythonスクリプトwebserver.pyです。これは単なる例であるため、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()
このコードには、ログファイルに書き込むためのロジックが含まれています。ログファイルは、Local Managerからのコンサルテーションに使用できます。
必要な2番目のファイルは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:IOx用のIR1101の設定
1. Webインターフェイス、IOx、およびローカルマネージャを有効にする
Local Managerは、IOxアプリケーションの導入、アクティブ化、開始、管理、およびトラブルシューティングを行うためのGUIです。IR1101の場合は、通常の管理Webインターフェイスに組み込まれています。そのためには、まずこれを有効にする必要があります。
IOxとWebインターフェイスを有効にするには、IR1101で次の手順を実行します。
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)内部として設定する場合、NATを使用してIOxアプリケーションとの通信を可能にするために、Gi 0/0/0インターフェイスにip nat outsideステートメントを追加する必要があります。
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
192.168.1.15を付与できるコンテナのポート9000へのアクセスを許可するには、次のようにポートを追加する必要があります。
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:Local ManagerへのアクセスとIOxアプリケーションの導入
これらの回線を設定に追加した後、Webインターフェイスを使用してIR1101にアクセスできます。図に示すように、ブラウザを使用してGi 0/0/0 IPアドレスに移動します。
ステップ1で作成した権限15のアカウントを使用してWebインターフェイスにログインし、図に示すようにConfiguration - 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タブを選択します。