<div class="ebd-block " data-type="text" ><p>在 Kubernetes 我們可以藉由 service type=LoadBalancer 或者是 ingress 讓外界訪問走 http 協定的服務,但注意,這只是 http 而非 https。如果要提升到 https 有兩個已知的辦法:</p><ul><li>在 ingress 上做手腳,例如 k3s 預設搭配 traefik 其實已有內建自簽憑證,也就是不論以 http:// 或 https:// 訪問都可以,只是在瀏覽器要允許例外,用 curl 的時候要加 -k。</li><li>申請一個免費憑證。在 DNS 已確定、80 / 443 埠未被佔用,防火牆開通的狀態下,我們可以透過幾個簡單步驟取得,再轉換成 ingress 可接受的格式。<br></li></ul><p>接下來以 Azure 上的一個 CentOS 7 VM 為例,逐步說明如下:</p><ol><li>虛擬機要取得一個 Public IP,保留或不保留都可以。這裡的差別是重新啟動會不會換 IP 位址,因為我打算讓使用者透過名稱使用服務,IP 位址有沒有換都不影響,不保留還可以省一點錢。</li><li>虛擬機要申請一個 DNS 名稱,這與實體位置有關,例如我開在東亞(香港),後面固定會是 .eastasia.cloudapp.azure.com,前面才是可以自行取名的,例如 gss,只要沒有與他人衝突又符合規則就可以。</li><li>虛擬機本身防火牆預設是關閉的,但在 Azure 上還需要設定相關的 Network security group,允許外界連入 80 / 443 埠。</li><li>在虛擬機安裝 k3s 或其他你熟悉的 k8s。</li><li>在虛擬機安裝 epel-release 與 certbot。注意,雖然之前我們已有 k8s 環境,但憑證申請相關作業是臨時性的,我並不打算放到未來長久性的 k8s 服務環境裡,所以是在外面。</li><li>以 k3s 來說,因為 traefik 已經接管了虛擬機的 80 / 443 埠,而且重開機也會自動啟動,所以我們要暫時關了它:sudo systemctl disable k3s 並重啟系統。</li><li>重啟後的虛擬機應該沒有 k3s 服務以及 traefik 行程,這時我們可以申請免費憑證了:sudo certbot certonly -n -d gss.eastasia.cloudapp.azure.com --standalone。如果一切順利,可以在 /etc/letsencrypt/live/gss.eastasia.cloudapp.azure.com 目錄下找到 fullchain1.pem 以及 privkey1.pem 兩個檔案。</li><li>恢復 k3s 服務:sudo systemctl enable k3s; sudo systemctl start k3s。</li><li>轉換憑證為 ingress 可接受的格式:kubectl create secret tls gss --cert fullchain1.pem --key privkey1.pem。<br></li></ol><p>如此一來我們就有一個名為 gss 的 secret 可被 ingress 引用,在 ingress.yaml 裡面大概是長這樣:</p><ul><li>spec:<ul><li>tls:<ul><li>-secretName: gss<br></li></ul></li></ul></li></ul><p>還不錯,又省下一筆錢。<br></p></div>