在亞馬遜 ECS 實例上安裝安全更新的最佳方式
我們正在使用Ansible在我們所有執行有狀態服務(如數據庫、搜尋引擎等)的 EC2 實例上推出安全更新。這很好用。
我想知道在 ECS 實例(在 Docker 容器中執行無狀態 Web 應用程序)上進行安全更新的最佳方法是什麼。由於自動擴展,實例數量及其 IP 地址有很多動態變化。Ansible使用硬編碼的 IP 地址列表(hosts 文件),所以它似乎並不真正符合目的。
更新這些實例是一個好主意,還是我們應該將它們拆除並每隔一段時間產生新的實例?
DevOps 人員有什麼最佳實踐嗎?
更新:
我發現 Ansible 支持動態庫存。有一個腳本可以從 AWS 獲取有關主機的資訊並為 Ansible 生成動態清單,這很好用。
然而,一個問題仍然存在。每當有一個我以前沒有連接過的新主機時,都會顯示以下消息,必須手動確認。
The authenticity of host '10.0.1.247 (10.0.1.247)' can't be established. ECDSA key fingerprint is SHA256:GSogs6P6CzbOzLm9ByWsXkfz7/2A4qwj4PDvczApS/I. Are you sure you want to continue connecting (yes/no)? yes
這很煩人,因為我想實現一個全自動更新機制。這個問題有解決方案嗎?
每當有一個我以前沒有連接過的新主機時,都會顯示以下消息,必須手動確認。
$$ $$這個問題有解決方案嗎?
修改 的
ssh_connection
,ansible.cfg
使其包含-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
參數。例如:
[ssh_connection] ssh_args = -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s
就地升級容器是一種完全的反模式。這很麻煩,因為您需要升級它們中的每一個並可能送出它們中的每一個。
相反,更新用於生成容器的圖像。這通常是通過在您的部分上
Dockerfile
確保圖像是最新的來完成的,因此修補過程基本上是重建圖像。舉個例子:FROM centos:7.2.1511 MAINTAINER Jane Doe <j.doe@foo.com> RUN yum update -y && \ yum install -y \ bar \ foo && \ yum clean all # The rest of your Dockerfile
不過,推出新映像是我發現 ECS 缺乏的地方。您需要自己制定策略以確保沒有停機時間。
讓服務掃描系統資料庫中的圖像以查找漏洞也是一種最佳實踐。
在不停機的情況下修補主機作業系統(可能需要重新啟動)是我發現 ECS 缺乏編排功能的另一個領域,因為除了節點之間的 ELB 平衡之外,產品中沒有內置任何開箱即用的東西。
其他容器平台(例如 OpenShift)具有從節點撤出容器(pod,因為這是 kubernetes)並將它們調度到其他地方的能力。負載均衡器知道這種變化,確保零停機時間。此外,通常與 OpenShift 一起使用的作業系統具有改進的基於RPM OSTree的修補機制,大大降低了修補主機作業系統的複雜性。