自帶容器模型在當(dāng)今的現(xiàn)代計(jì)算平臺(tái)上得到廣泛支持。換句話說,您可以在自定義軟件環(huán)境中提供自己的容器映像。
然而,用戶提供的容器必須滿足每個(gè)平臺(tái)的獨(dú)特要求,這可能因平臺(tái)而異。例如,您可能需要:
使用特定的非 root 用戶。
將主目錄放在某個(gè)位置。
安裝依賴軟件包。
在指定端口上運(yùn)行 web 應(yīng)用程序。
保持容器圖像符合這些任意要求可能是一項(xiàng)挑戰(zhàn)。因此,我們迫切希望引入一個(gè)名為 Container Canary 的新開源工具來捕獲這些需求,并針對(duì)它們進(jìn)行自動(dòng)測(cè)試。 Container Canary 提供了一個(gè)規(guī)范,用于將這些需求記錄為可檢入版本控制的清單。然后,可以使用canary CLI 工具根據(jù)該清單驗(yàn)證容器。
這在測(cè)試和持續(xù)集成( CI )環(huán)境中非常有用,可以避免容器中的回歸,同時(shí)允許容器開發(fā)人員快速移動(dòng)。
$ canary validate --file somespec.yaml foo/bar:latest Validating foo/bar: latest against somespec
安裝集 Container Canary
Container Canary 是用 Golang 編寫的,并以靜態(tài)二進(jìn)制文件的形式分發(fā),使其易于移植,易于在 CI 環(huán)境中安裝。
要安裝它,請(qǐng)轉(zhuǎn)到 releases page 并下載適合您系統(tǒng)的發(fā)行版。例如,使用 x86 _ 64 處理器的 Linux 用戶將使用canary_linux_amd64二進(jìn)制文件。確保將以下命令中的VERSION替換為要安裝的版本。
$ curl -L https://github.com/NVIDIA/container-canary/releases/download/VERSION/canary_linux_amd64 > canary_linux_amd64
Container Canary 還提供 sha256 總和來驗(yàn)證二進(jìn)制文件。
$ curl -L https://github.com/NVIDIA/container-canary/releases/download/VERSION/canary_linux_amd64.sha256sum > canary_linux_amd64.sha256sum $ sha256sum --check --status canary_linux_amd64.sha256sum
現(xiàn)在,你可以把二進(jìn)制文件放在你的路徑上。
$ chmod +x canary_linux_amd64 $ mv canary_linux_amd64 /usr/local/bin/canary
最后,驗(yàn)證它是否有效。
$ canary version Container Canary Version: VERSION ...
用 Kubeflow 示例驗(yàn)證容器
安裝了 Container Canary 之后,就可以開始驗(yàn)證容器了。 /examples/ GitHub 目錄包含一些流行容器平臺(tái)的清單,包括 Kubeflow example 。您可以使用這些清單立即開始。
Kubeflow 是設(shè)計(jì)、培訓(xùn)和推斷 machine learning 模型的流行平臺(tái)。 Kubeflow Notebooks 服務(wù)使您能夠在 Kubeflow 內(nèi)部啟動(dòng)基于 web 的開發(fā)環(huán)境。雖然 Kubeflow 社區(qū)為運(yùn)行 JupyterLab 、 RStudio 和 Visual Studio 代碼(代碼服務(wù)器) 等工具維護(hù)了默認(rèn)容器,但您也可以使用自己的軟件環(huán)境選擇自己的容器映像。
要求清單 指定自定義容器必須滿足哪些條件才能在 Kubeflow 筆記本上正確運(yùn)行。該列表如下所示:
Kubeflow 筆記本電腦要使用容器映像,映像必須:
在端口 8888 上公開 HTTP 接口:
kubeflow 在運(yùn)行時(shí)設(shè)置一個(gè)環(huán)境變量 NB _ PREFIX ,其中包含我們希望容器監(jiān)聽的 URL 路徑
kubeflow 使用 iFrame ,因此請(qǐng)確保您的應(yīng)用程序集訪問控制允許源代碼:*在 HTTP 響應(yīng)頭中
以名為 jovyan 的用戶身份運(yùn)行:
jovyan 的主目錄應(yīng)該是/ home / jovyan
喬維安的 UID 應(yīng)該是 1000
在/ home / jovyan 安裝一個(gè)空 PVC ,成功啟動(dòng):
kubeflow 在/ home / jovyan 安裝了一個(gè) PVC ,以在 Pod 重啟期間保持狀態(tài)
對(duì)于 Container Canary ,我們已經(jīng)在示例清單中列出了這些要求。如果您曾經(jīng)編寫過 Kubernetes 吊艙清單,那么您應(yīng)該很熟悉這種語(yǔ)法。您可以看到,每個(gè)需求都以探針的形式寫出來,Container Canary 對(duì)著您的容器運(yùn)行,以檢查是否滿足了需求。
該過程如以下示例所示:
apiVersion: container-canary.nvidia.com/v1 kind: Validator name: kubeflow description: Kubeflow notebooks documentation: https://www.kubeflow.org/docs/components/notebooks/container-images/#custom-images env: - name: NB_PREFIX value: /hub/jovyan/ ports: - port: 8888 protocol: TCP volumes: - mountPath: /home/jovyan checks: - name: user description: User is jovyan probe: exec: command: - /bin/sh - -c - "[ $(whoami) = jovyan ]" - name: uid description: User ID is 1000 probe: exec: command: - /bin/sh - -c - "id | grep uid=1000" - name: home description: Home directory is /home/jovyan probe: exec: command: - /bin/sh - -c - "[ $HOME = /home/jovyan ]" - name: http description: Exposes an HTTP interface on port 8888 probe: httpGet: path: / port: 8888 initialDelaySeconds: 10 - name: NB_PREFIX description: Correctly routes the NB_PREFIX probe: httpGet: path: /hub/jovyan/lab port: 8888 initialDelaySeconds: 10 - name: allow-origin-all description: " Sets 'Access-Control-Allow-Origin: *' header" probe: httpGet: path: / port: 8888 responseHttpHeaders: - name: Access-Control-Allow-Origin value: "*" initialDelaySeconds: 10
既然有了清單,我就可以對(duì)容器進(jìn)行測(cè)試了。首先,我選擇了一個(gè)我知道不會(huì)通過要求的公共形象,比如流行的 web 服務(wù)器 NGINX。
$ canary validate --file https://github.com/NVIDIA/container-canary/raw/main/examples/kubeflow.yaml nginx:latest Cannot find nginx:latest, pulling… Validating nginx:latest against kubeflow Home directory is /home/jovyan [failed] User is jovyan [failed] User ID is 1000 [failed] Exposes an HTTP interface on port 8888 [failed] Sets 'Access-Control-Allow-Origin: *' header [failed] Correctly routes the NB_PREFIX [failed] validation failed
毫不奇怪,這張圖片沒有通過驗(yàn)證。
接下來,我嘗試了一款設(shè)計(jì)用于 Kubeflow 筆記本電腦的官方 Kubeflow 圖片。
$ canary validate --file https://github.com/NVIDIA/container-canary/raw/main/examples/kubeflow.yaml public.ecr.aws/j1r0q0g6/notebooks/notebook-servers/jupyter-pytorch-cuda:v1.5.0 Cannot find public.ecr.aws/j1r0q0g6/notebooks/notebook-servers/jupyter-pytorch-cuda:v1.5.0, pulling… Validating public.ecr.aws/j1r0q0g6/notebooks/notebook-servers/jupyter-pytorch-cuda:v1.5.0 against kubeflow Home directory is /home/jovyan [passed] User is jovyan [passed] User ID is 1000 [passed] Sets 'Access-Control-Allow-Origin: *' header [passed] Correctly routes the NB_PREFIX [passed] Exposes an HTTP interface on port 8888 [passed] validation passed
成功這張圖片通過了驗(yàn)證。
如果要在 Kubeflow 上創(chuàng)建圖像,可以用同樣的方法驗(yàn)證它們,并確信當(dāng)其他用戶來運(yùn)行它們時(shí),所做的更改不會(huì)導(dǎo)致問題。
編寫自己的驗(yàn)證清單
您還可以編寫自己的清單來驗(yàn)證容器。 Container Canary 可以幫助您確保您的容器清單將在您自己的部署和第三方平臺(tái)中運(yùn)行。它還幫助您在容器構(gòu)建上運(yùn)行單元測(cè)試。
每個(gè)清單都是一個(gè)以一些元數(shù)據(jù)開頭的 YAML 文件。
# Manifest versioning apiVersion: container-canary.nvidia.com/v1 kind: Validator # Metadata name: foo # The name of the platform that this manifest validates for description: Foo runs containers for you # Optional, A description of that platform documentation: https://example.com # Optional, A link to the documentation that defines the container requirements in prose
接下來,您可以為容器配置一些運(yùn)行時(shí)選項(xiàng)。當(dāng) Container Canary 啟動(dòng)圖像進(jìn)行驗(yàn)證時(shí),將使用這些選項(xiàng),并應(yīng)模仿在目標(biāo)平臺(tái)上設(shè)置的選項(xiàng)。其中包括環(huán)境變量、要公開的端口和要連接的卷。
env: - name: NB_PREFIX value: /hub/jovyan/ ports: - port: 8888 protocol: TCP volumes: - mountPath: /home/jovyan
然后,指定支票。檢查是針對(duì)容器運(yùn)行的測(cè)試,以確保其符合要求。每個(gè)檢查都包含一個(gè)與容器交互的探針。這些交互包括運(yùn)行命令、發(fā)出 HTTP 請(qǐng)求和 ping TCP 套接字。
Container Canary 中的探針是庫(kù)伯內(nèi)特斯的那些的超集,因此如果您以前使用過這些探針,應(yīng)該對(duì)它們很熟悉。
checks: - name: mycheck # Name of the check description: Ensuring a thing # Description of what is being checked (will be used in output) probe: ... # A probe to run
exec
檢查會(huì)在正在運(yùn)行的容器中運(yùn)行命令。如果命令以 0 退出,則檢查通過。
checks: - name: uid description: User ID is 1234 probe: exec: command: - /bin/sh - -c - "id | grep uid=1234"
HTTP Get
檢查對(duì)您的容器執(zhí)行HTTP GET
請(qǐng)求。如果響應(yīng)代碼< 300 且可選響應(yīng)標(biāo)題匹配,則檢查通過。
checks: - name: http description: Exposes an HTTP interface on port 80 probe: httpGet: path: / port: 80 httpHeaders: # Optional, headers to set in the request - name: Foo-Header value: "myheader" responseHttpHeaders: # Optional, headers that you expect to see in the response - name: Access-Control-Allow-Origin value: "*"
有關(guān)更多信息,請(qǐng)參閱驗(yàn)證程序 API 參考。
編寫清單后,可以使用canary
來測(cè)試帶有清單的容器。
$ canary validate --file examples/awesome.yaml your/container:latest Validating your/container:latest against awesome Required packages are installed [passed] Expected services are running [passed] Your container is awesome [passed] validation passed
使用 GitHub 操作自動(dòng)化容器 Canary 的示例
現(xiàn)在,我已經(jīng)介紹了安裝 Container Canary、驗(yàn)證容器和編寫自己的清單,下面是一個(gè)快速的 CI 示例。
假設(shè)您想要構(gòu)建一個(gè)容器,該容器應(yīng)該在特定端口上運(yùn)行 web 應(yīng)用程序,并且還安裝了 fastapi 。在新的存儲(chǔ)庫(kù)中,您可以使用 Python 創(chuàng)建一個(gè)名為app.py的小型 Python web 應(yīng)用程序。
from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/foo") def foo(): return {"foo": "bar"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=5000, log_level="info")
然后可以創(chuàng)建Dockerfile
將應(yīng)用程序打包到容器中。
FROM python COPY app.py /app.py RUN pip install fastapi uvicorn[standard] EXPOSE 5000 CMD python /app.py
現(xiàn)在,編寫一個(gè) Container Canary 驗(yàn)證器清單,測(cè)試容器映像,確保它在端口 5000 上運(yùn)行 web 服務(wù)器,并且安裝了 Python 。叫它canary-validator.yaml
。
apiVersion: container-canary.nvidia.com/v1 kind: Validator name: example description: Container Canary CI Example env: [] ports: - port: 5000 protocol: TCP volumes: [] checks: - name: http description: Exposes an HTTP interface on port 5000 probe: httpGet: path: /foo port: 5000 failureThreshold: 30 - name: python description: Has Python installed probe: exec: command: - /bin/sh - -c - "which python"
最后,創(chuàng)建一個(gè)GitHub Actions配置來在 CI 中運(yùn)行它。我們?cè)诒纠羞x擇 GitHub Actions 是因?yàn)樗苁軞g迎、免費(fèi)且易于使用,但這種配置應(yīng)該適用于所有 CI 系統(tǒng)。
創(chuàng)建一個(gè)名為.github/workflows/ci.yaml
的文件。
name: ci on: push: pull_request: jobs: canary: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Install Container Canary run: | curl -L https://github.com/NVIDIA/container-canary/releases/download/v0.2.0/canary_linux_amd64 > /usr/local/bin/canary chmod +x /usr/local/bin/canary - name: Build Container run: docker build -t foo/canary-ci-example:latest . - name: Validate container run: canary validate --file canary-validator.yaml foo/canary-ci-example:latest
現(xiàn)在,當(dāng)您將代碼推送到 GitHub 時(shí), Actions runner 會(huì)簽出代碼,安裝容器 Canary ,構(gòu)建容器映像,并使用canary validate對(duì)其進(jìn)行驗(yàn)證。
圖 1 在 GitHub 操作工作流中成功運(yùn)行 Canary 驗(yàn)證
工作流程已經(jīng)執(zhí)行,我們的集裝箱圖像已經(jīng)成功驗(yàn)證——而且很快!有關(guān)更多信息,請(qǐng)參閱 /jacobtomlinson/canary-ci-example GitHub repo 中此示例的所有代碼。
應(yīng)用你學(xué)到的東西
使用 Container Canary ,您可以為您的容器映像定義具體的接口,并驗(yàn)證它們,以確保您構(gòu)建的映像始終符合定義的規(guī)范。
如果您經(jīng)常構(gòu)建容器映像, Container Canary 在測(cè)試和 CI 環(huán)境中非常有用,因此它是測(cè)試工具包中的必備工具。容器開發(fā)人員可以成功地避免容器中的倒退,并更快地完成項(xiàng)目以節(jié)省時(shí)間。
關(guān)于作者
Jacob Tomlinson 是 NVIDIA 的高級(jí) Python 軟件工程師,專注于分布式系統(tǒng)的部署工具。他的工作包括維護(hù)開源項(xiàng)目,包括 RAPIDS 和 Dask 。 RAPIDS 是一套 GPU 加速開源 Python 工具,模擬 PyData 堆棧中的 API ,包括 NumPy 、 pandas 和 SciKit Learn 的 API 。 Dask 為分析提供了高級(jí)并行性,包括核心外計(jì)算、延遲計(jì)算和 PyData 堆棧的分布式執(zhí)行?,旣悺ず蓝驙柺?NVIDIA 全球云合作伙伴營(yíng)銷團(tuán)隊(duì)的成員。她參與了與合作伙伴的各種公司合作的規(guī)劃、物流和營(yíng)銷,最近重點(diǎn)關(guān)注 NVIDIA 和 Microsoft Azure 之間的工作?,旣愖≡谖餮艌D,在高科技市場(chǎng)工作了 10 多年。
審核編輯:郭婷
-
處理器
+關(guān)注
關(guān)注
68文章
19890瀏覽量
235116 -
接口
+關(guān)注
關(guān)注
33文章
9000瀏覽量
153712 -
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213742
發(fā)布評(píng)論請(qǐng)先 登錄
ARM平臺(tái)實(shí)現(xiàn)Docker容器技術(shù)
ARM平臺(tái)實(shí)現(xiàn)Docker容器技術(shù)
想要學(xué)習(xí)在DSP的平臺(tái)上進(jìn)行圖像處理,求推薦入門教材。
如何在嵌入式Linux系統(tǒng)平臺(tái)上設(shè)計(jì)建立圖像視頻?
在arm的云服務(wù)器外樹莓派4上安裝kata-container
在虛擬儀器平臺(tái)上構(gòu)建便攜式車輛綜合測(cè)試系統(tǒng)
在虛擬儀器平臺(tái)上構(gòu)建便攜式車輛綜合測(cè)試系統(tǒng)
微軟的PowerShell 7.0在多個(gè)平臺(tái)上都能用
蘋果M1芯片平臺(tái)上第二種惡意軟件曝光
智匯華云 | kata container virtiofs測(cè)試和技術(shù)分析

Missing Container Metrics容器指標(biāo)收集工具

在AM335X平臺(tái)上運(yùn)行ubuntu系統(tǒng)和docker容器

評(píng)論