簡體   English   中英

使用 kolla-ansible 時如何固定 openstack 容器版本?

[英]How to pin openstack container versions when using kolla-ansible?

通過 kolla-ansible 安裝 openstack 時,您在 globals.yml 中指定 openstack 版本,即:openstack_release: "victoria"。 這是盡可能具體的,沒有時間點標簽,只是像“維多利亞”這樣的移動目標。

根據我的經驗,容器是隨機更新的,而不是一次性更新,而且是經常更新的。 每次我重建時,我都不得不等待 docker 拉下自上次部署以來發生變化的事情。 由於多種原因,這是有問題的,最嚴重的是:

  • 這是一個快速發展的社區驅動項目。 由於更改,我每次重建時都必須解決新問題。
  • 如果我部署到一組主機上,然后在幾個小時后部署到更多主機上,我將再次等待更新,並且我的堆棧正在運行不同版本的容器。
  • 這些拉動需要時間,並使我的部署容易受到超時和網絡問題的影響。

為了強調第二個問題是什么問題,通常我可以重置失敗的部署並重試,但並非總是如此。 有時我會遇到遺留問題,由於我的菜鳥,轉儲新磁盤並重新開始會更快。 我正在使用與計算節點位於同一位置的外部 ceph(kolla-ansible:victoria 中唯一的 ceph 選項)。 將池 / OSD state 重置到更早的時間點還沒有在我的工具箱中,所以我還擦除了我的 OSD 並重做 ceph 安裝。 我可以在 ceph 容器上固定版本,但是一旦 kolla-ansible 安裝開始,我就會開始出汗。 對於 4 小時的總安裝,此時另一個容器發生更改的可能性不小。

對於專業從事 IT 或軟件的任何人來說,顯而易見的答案是將我的 kolla:* 容器版本固定到特定的時間點標簽,而不是“維多利亞”。 我可以將每個容器固定到摘要中,但這在劇本中不支持。 我需要編輯 ansible 劇本並為我要固定的每個容器添加一個變量。 然后在添加新容器時保持該邏輯。 我現在正在拉 43 個容器。 這種方法感覺就像“2 個拖車公園女孩 go '圍繞外面”。

我計划的一個更簡單的方法是拉出所有帶有“victoria”標簽的容器,然后通過將它們推回我自己的 docker 存儲庫(例如,“victoria-feralcoder-20120321”)進行迭代,然后更新全局變量。 yml 來使用這個穩定的標簽。 我是管理自己的 docker 存儲庫的新手,所以我不知道是否可以在拉出緩存中重新標記圖像,或者是否需要為此設置私有存儲庫,所以我可能還必須切換 kolla - 可以在 docker.io 和私人 feralcoder 存儲庫之間進行操作,具體取決於我是要進行最新拉動還是固定拉動。 那會有點“嘿十九”,更干凈,更好,但仍然不太正確......

我覺得這種 pull-retag-push-reconfigure-redeploy 方法是 hack jankery。 有人有更好的建議嗎? 比如,如果本地鏡像中已經有標簽匹配,不檢查上游的容器更改? 或者也許是一種在注冊表級別進行拉通和重新標記的方法?

在此先感謝,也感謝 kolla-ansible 貢獻者所做的所有工作,除了不提供版本穩定性。

這是我目前首選的解決方案,誠然,它仍然是一個 hack:

批量拉取最新圖像,然后標記它們並將它們推送到本地注冊表。

首先,我需要 2 個 docker 注冊表:我無法推送到拉入式緩存,因此我還需要設置一個可以推送到的私有注冊表。

我需要在 kolla-ansible 部署期間來回切換 globals.yml 中的設置以實現此目的:

  • 當我運行“kolla-ansible bootstrap-servers”時,我需要配置本地注冊表,以便為堆棧主機配置適當的不安全注冊表配置。
  • 當我想更新時,我使用“kolla-ansible pull”來預取最新的包。 為此,我將 globals.yml 重新配置為指向 kolla/*:victoria。
  • 在我獲取最新的容器后,我在我的一個堆棧主機上運行一個循環,以從我的直通緩存中提取它們,使用日期戳標記將它們標記到我的本地注冊表,然后將它們推送到我的本地注冊表。
  • 在我運行實際部署之前,我配置 globals.yml 以使用我的本地注冊表和標簽。

這些是感興趣的 globals.yml 設置:

## PINNED CONTAINER VERSIONS
#docker_registry: 192.168.127.220:4001
#docker_namespace: "feralcoder"
#openstack_release: "feralcoder-20210321"

# LATEST CONTAINER VERSIONS
docker_registry:
docker_registry_username: feralcoder
docker_namespace: "kolla"
openstack_release: "victoria"

我的偽代碼是這樣的(中間步驟被剪掉了……):

use_localized_containers () {
  cp $KOLLA_SETUP_DIR/files/kolla-globals-localpull.yml /etc/kolla/globals.yml
  cat $KOLLA_SETUP_DIR/files/kolla-globals-remainder.yml >> /etc/kolla/globals.yml
}

use_latest_dockerhub_containers () {
  # We switch to dockerhub container fetches, to get the latest "victoria" containers
  cp $KOLLA_SETUP_DIR/files/kolla-globals-dockerpull.yml /etc/kolla/globals.yml
  cat $KOLLA_SETUP_DIR/files/kolla-globals-remainder.yml >> /etc/kolla/globals.yml
}

localize_latest_containers () {
  for CONTAINER in `ls $KOLLA_PULL_THRU_CACHE`; do
    ssh_control_run_as_user root "docker image pull kolla/$CONTAINER:victoria" $PULL_HOST
    ssh_control_run_as_user root "docker image tag kolla/$CONTAINER:victoria $LOCAL_REGISTRY/feralcoder/$CONTAINER:$TAG" $PULL_HOST
    ssh_control_run_as_user root "docker image push $LOCAL_REGISTRY/feralcoder/$CONTAINER:$TAG" $PULL_HOST
  done
}

use_localized_containers 
kolla-ansible -i $INVENTORY  bootstrap-servers
use_latest_dockerhub_containers
kolla-ansible -i $INVENTORY pull
localize_latest_containers
use_localized_containers
kolla-ansible -i $INVENTORY deploy

對於現有部署,這是一個答案:

如果您已經將容器拉到所有主機,您可以編輯一些 ansible 或 python 以便所有容器的 docker_container.pull=false。

這是實現模塊:
.../lib/python3.6/site-packages/ansible/modules/cloud/docker/docker_container.py。
該文件可能位於 /usr/local/share/kolla-ansible/,或.../venvs/kolla-ansible/。 為 false 時,如果容器存在於主機上,則不會被拉回。

這無助於主機尚未拉取 package 並且您的本地鏡像中已有版本的情況。 在這種情況下,堆棧主機將拉取容器,而您的拉取緩存將拉取自上次拉取以來的所有容器更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM