使用Let』s Encrypt在Kubernetes上保護Istio的Ingress服務
- 2019 年 12 月 6 日
- 筆記

作者:Berk Gökden 譯者:甄中元 原文地址:https://medium.com/vamp-io/securing-ingress-services-in-istio-with-lets-encrypt-on-kubernetes-f6effd93ef06
這是我在kubernetes之上部署Istio系列文章中的第三篇,內容是關於我們試圖通過Vamp Lamia實現的更多細節以及我們為什麼選擇Istio的原因,可以查看我的第一篇和第二篇文章。
在Vamp.io,我們正在開發Vamp Lamia,以幫助您輕鬆地將您的服務連接到需要SSL/TLS連接的現實世界。最近,許多瀏覽器和其他技術開始強制實施SSL連接。用戶使用Google瀏覽器訪問HTTP鏈接將給予警告,Android現在默認也需要安全連接。
在過去,從權威機構獲取證書是一項艱難而費事的過程。所以需要一種簡便常規的解決方案。Let』s Encrypt免費提供了SSL/TLS認證獲取的最佳實踐。以下是Let』s Encrypt的官方使命。
Let』s Encrypt是一個免費、自動化和開放的證書頒發機構(CA),為公眾的利益而運行。它是由Internet Security Research Group(ISRG)提供的服務。我們為用戶提供所需的數字證書,以便以更友好的方式免費為網站啟用HTTPS(SSL/TLS)。我們這樣做是因為我們想要創建一個更安全、更尊重隱私的Web。 來源:https://letsencrypt.org/
在Istio中,可以通過向網關添加證書來保護ingress service。但這是一個多步驟過程,證書授權沒有記錄。為了使這個過程自動化,我們為Let's Encrypt集成Vamp Lamia。
Let』s Encrypt接受證書授權有兩種方法:HTTP和DNS。我們決定首先實現DNS方法,因為它可以與其他TCP協議(如gRPC)一起使用,並且還允許使用通配符域證書。
對於DNS授權,您仍需要擁有託管DNS服務提供程式。 我們的開發環境主要在Google Cloud Platform上,因此我們開始是集成Google Cloud DNS上的,但我們的系統是模組化的,因此很容易與其他DNS提供商集成,例如Amazon Route 53、CloudFlare等。作為旁註,您的DNS 服務提供商不需要與您的Kubernetes集群服務提供商相同。 您的群集可以在AWS上,您仍然可以使用Google Cloud DNS服務。 如果您需要一些幫助可以聯繫我們。
我們通過公開安全的主機名參數將Let』s Encrypt集成到網關。使用此主機名,我們創建DNS服務條目和證書授權。
這是通過多個步驟完成的,因此首先我們將解釋先決條件。
先決條件
第一步是創建領域,這是域名伺服器重定向所必需的。這是最初的步驟,它可能需要一個手動步驟,所以我會嘗試儘可能地解釋它。
某些域名服務提供商具有固定域名伺服器,但Google Cloud DNS會為每個區域創建一套4個域名伺服器。您需要在域名提供商的設置中將這些域名伺服器設置為你的域名伺服器。對於每個域名這是一次性操作。
我們在name.com註冊了域名democluster.net。您還可以在Google域名服務里創建域名,但我們已經為此部落格帖子提供了一個域名。這是name.com中的域名伺服器配置示例。

檢查您的域名服務配置是否已更新。域名通過互聯網快取,實際更新可能需要48小時。在我們的案例中花了大約2個小時。
請注意,Google DNS提供了多套名稱服務,因此在創建zone時,您應該檢查域名服務並更新它們。
您可以轉到Google DNS頁面並打開您的zone,將會有NS類型下的域名伺服器列表。

創建網關後,Vamp Lamia將為您設置zone記錄,然後在UI中列出域名服務。Let』s Encrypt 身份驗證需要更新域名服務。
現在我們可以繼續使用Vamp Lamia了。
設置網關和服務
要安裝Vamp Lamia,請按照我們的github中的說明進行操作
對於這篇文章,我們將使用vamp-shop作為deployment,它包含在我們的樣本包中。 Vamp Shop是一個虛構的電子商務網站,我們在那裡測試我們的金絲雀發布功能。我們在A/B測試部落格文章中提到過,我們在這篇文章中使用了幾乎相同的架構。 請運行demo-setup.sh將Vamp Shop部署到您的kubernetes集群。
Vamp Lamia定期檢查群集並安裝缺少的Istio組件並檢測新的deployments,建議等待「List Virtual Cluster」頁面,直到看到 vamp-demo
namespace出現,當它可用時你可以編輯它。
對於此demo,您需要添加 google_project_id
和 google_service_account
作為元數據。為此,您必須創建服務帳戶並將json文件的內容複製到值區域。

我們要創建:
- 一個service
- 一個destination rule
- 一個gateway
- 一個virtual service
創建如下service:

創建如下destination rule:

創建如下gateway。
請注意,您需要使用您擁有的domain中的其他主機名。 「Secured Host」將用於註冊DNS和Let's Encrypt。 由於TCP協議限制,每個埠只能有一個安全主機。 HTTPS的默認埠是443。

創建一個如下 virtual service,在這協議是http,SSL/TLS終止發生在集群邊緣,內部服務可以繼續使用http。

您可能需要等待獲取UI中已更新網關的通知。您可以查看「Gateway Details」頁面以查看當前域名服務的列表。

如果一切順利,您可以在瀏覽器上看到你的網站:

了解原理
當定義安全主機時,Vamp Lamia首先設置網關並獲取公網IP,然後嘗試與您的DNS提供商通訊並設置A記錄,以便通過IP地址訪問您的服務。最後,為Vamp Lamia準備設置證書。
Vamp Lamia將生成證書,Let's Encrypt使用DNS Challenge進行認證,並使用您的DNS提供商進行設置。此過程的結果也會在Google DNS頁面上顯示,如下所示:

當客戶端要求證書註冊時,Let's Encrypt會要求對該domain進行授權。有兩種可能的方式:HTTP challenge和DNS challenge。我們正在使用DNS challenge,因為它更靈活。Let』s Encrypt給出一個摘要哈希,我們在 _acme-challenge.shop.democluster.net
下插入了一條TXT記錄。
最後,Vamp Lamia將證書插入Istio網關。
請注意,當您擁有像 service-name.domain-name.com
等服務主機名時,Vamp Lamia會對主機名做出一些假設。我們假設 domain-name.com
將用作您的zone名稱。我們目前為每個主機名創建一個證書,但我們計劃在以後的版本中添加智慧域名證書。
對於當前的互聯網狀態,擁有SSL/TLS證書至關重要。正如我們所提到的,由於擁有安全服務至關重要,因此Google和許多其他軟體提供商都在推動瀏覽器默認使用HTTPS。藉助此功能,在Vamp Lamia託管集群中,可以非常輕鬆地設置安全服務並將其暴露給現實世界。