對 Docker swarm 中 service 進行 rolling update

當在 Docker swarm 群集中有更新版本的 docker image 要部署時,我們可以透過以下步驟進行:

  1. 在 service 建立時,指定 update-delay 時間,讓 Docker 依照這個間隔依序下載新的 image 並部署(重啟 container):

如果要拉 private docker registry 的話,先 docker login 後傳遞 –with-registry-auth 參數在下面的指令

1
2
3
4
5
docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
  1. 部署新版本時,使用 update 指令開始 rolling update:
1
docker service update --image redis:3.0.7 redis
  1. 透過 inspectps 指令觀察其更新情形:
1
docker service inspect --pretty redis
1
2
3
4
5
6
7
8
9
10
11
12
13
ID:             0u6a4s31ybk7yw2wyvtikmu50
Name: redis
Service Mode: Replicated
Replicas: 3
Placement:
Strategy: Spread
UpdateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.7
Resources:
Endpoint Mode: vip
1
docker service ps redis
1
2
3
4
5
6
7
NAME                                   IMAGE        NODE       DESIRED STATE  CURRENT STATE            ERROR
redis.1.dos1zffgeofhagnve8w864fco redis:3.0.7 worker1 Running Running 37 seconds
\_ redis.1.88rdo6pa52ki8oqx6dogf04fh redis:3.0.6 worker2 Shutdown Shutdown 56 seconds ago
redis.2.9l3i4j85517skba5o7tn5m8g0 redis:3.0.7 worker2 Running Running About a minute
\_ redis.2.66k185wilg8ele7ntu8f6nj6i redis:3.0.6 worker1 Shutdown Shutdown 2 minutes ago
redis.3.egiuiqpzrdbxks3wxgn8qib1g redis:3.0.7 worker1 Running Running 48 seconds
\_ redis.3.ctzktfddb2tepkr45qcmqln04 redis:3.0.6 mmanager1 Shutdown Shutdown 2 minutes ago

References

不關機調整 VM 磁碟空間

在一些時候我們會遇到 VM 磁碟空間不足,又因為一些原因不方便將 VM 關機進行調整的窘境,其實只要透過下面的方法就可以達到不用關機調整磁碟空間:

注意事項

  • 需使用可調整 Raw Disk 磁碟大小的 VM 軟體如 VMWare, VirtualBox, Proxmox 等
  • VM 虛擬的磁碟控制器必須是 SCSI 介面

操作步驟

  1. 擴充 Raw Disk 磁碟大小
  2. 在 Guest Linux 中找到磁碟所在的 SCSI 匯流排位置 (找到如下面的 2:0:0:0)
1
2
3
4
# dmesg | grep sda
[ 4.312047] sd 2:0:0:0: [sda] 41943040 512-byte logical blocks: (21.5 GB/20.0 GiB)
[ 4.313812] sd 2:0:0:0: [sda] Write Protect is off
[ 4.313817] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
  1. 對該 SCSI 位置做 rescan
1
echo 1 > /sys/class/scsi_device/2\:0\:0\:0/device/rescan
  1. 進行新磁區的分割, 如 fdisk 或 LVM 的 pv, vg, lv 系列指令

使用 LVM 管理磁碟的話應該不會有太大問題,但若是採用調大 fdisk 中分割區大小的方式,編輯完儲存後還要記得執行 partprobe && resize2fs /dev/sdaX 才會見效。

References

The Twelve-Factor

The Twelve-Factor 是由 Heroku Founder 同時也是 CTO 的 Adam Wiggins 所提出。他在參與了數以百計的軟體開發部署,加上他在 Heroku 間接見證數十萬應用軟體發展後,所構築出的理論。綜合了關於 SaaS 所有的經驗與智慧,提出理想中最佳實踐 (Best practices) 的準則。其中特別關注應用軟體如何保持良性成長,開發者之間如何進行有效的程式碼協作。

摘要

在現在的時代,軟體一般會以服務的形式來交付,稱為 軟體及服務SaaS (Software-as-a-service),Twelve-Factor 為建構 SaaS 應用服務關注以下這些面向:

  • 使用自動化的標準流程,從而使新的開發者以最少的學習成本加入這個專案
  • 和作業系統之間儘可能的劃清界限,在各個系統中提供最大的可移植性
  • 適合部署在現代的雲端運算平台,從而在伺服器與系統管理方面節省資源
  • 將開發環境和生產環境的差異降至最低,並使用持續交付實施敏捷開發
  • 可以在工具、架構和開發流程不發生明顯變化的前提下達成擴充

這套理論適用於任意語言和後端服務(資料庫、訊息佇列、記憶體快取等)開發的應用服務。

準則

  1. 基準程式碼:一份版本管理的基準程式碼,多份部署
    Codebase - One codebase tracked in revision control, many deploys

  2. 相依性:外顯示地宣告相依關係
    Dependencies - Explicitly declare and isolate dependencies

  3. 設定檔:在環境中儲存設定檔
    Config - Store config in the environment

  4. 後端服務:把後端服務當作附加資源
    Backing services - Treat backing services as attached resources

  5. 建置,發佈,執行:嚴格分離建置和執行
    Build, release, run - Strictly separate build and run stages

  6. 程序:以一個或多個無狀態的程序執行應用程式
    Processes - Execute the app as one or more stateless processes

  7. 通訊埠綁定:使用通訊埠綁定方式提供服務
    Port binding - Export services via port binding

  8. 併發:透過程序模型進行擴充
    Concurrency - Scale out via the process model

  9. 可拋棄性:快速啟動和優雅終止可最大化穩健性
    Disposability - Maximize robustness with fast startup and graceful shutdown

  10. 開發環境與線上環境等價:儘可能的保持開發,預發佈,線上環境相同
    Dev/prod parity - Keep development, staging, and production as similar as possible

  11. 日誌:把日誌當作事件流
    Logs - Treat logs as event streams

  12. 管理程序:後台管理任務當作一次性程序執行
    Admin processes - Run admin/management tasks as one-off processes