前言
因為工作的關係,每天必須接觸 Kubernetes 服務,就萌生了將目前的 side project 搬上 Kubernetes 的想法。一來可以有環境可實作與測試,二來也可以減少一些成本,一舉兩得。本篇文章即是搬移過程中的紀錄,除了提供自己後續搬移時參考,也提供有興趣的朋友參考。本篇文章若有錯誤或任何建議,請各位先進不吝提出。
說明
整個操作步驟大概如下:
- 安裝 ingress-nginx (透過 Helm Chart)
- 準備憑證相關檔案
- 建立 Secret (可以透過 kubectl create secret 指令產生)
- 建立 Ingress
中間過程中若發生憑證安全性問題,檢視憑證為 Kubernetes Ingress Controller Fake Certificate,則表示在設定上有問題,請檢視是否有輸入錯誤名稱情況。
雖然我是使用 Azure Kubernetes Services,但會透過 ngiex 作為 ingress 而不是使用 Azure app gateway,而考量的原因在於通用性,若有需要搬移至不同雲端環境,仍可以透過相同的步驟方式進行。若您是企業用戶或所有服務皆在 Azure 上,您可以考慮使用 app gateway 作為 ingress,以提供更完善服務與防護。
建立步驟
安裝 ingerss-nginx 指令。下列指令包含加入 Helm Chart Repo、更新與安裝 ingerss-nginx。
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--create-namespace \
--namespace $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
安裝完成後,我們可以透過下列指令取得服務,檢視 ingress 狀態。
kubectl get services
若你要直接使用 YAML 方式產生 tls secret 會很辛苦 (幾個內容值需要轉換格式)。您可以透過下列指令與既有的憑證檔案 (.pem 與 key),直接建立 Secret。
kubectl create secret tls webtools-tls-secret --key webtool.key --cert webtools.pem
若你想要想要建立的同時也輸出成 yaml 檔案,可以透過下列指令 (增加參數 -o yaml)
kubectl create secret tls webtools-tls-secret --key=webtool.key --cert=webtools.pem -o yaml
透過下列指令,查詢 Secret 是否建立成功。
最後建立/更新 Ingress 檔案,參考如下。主要在於 tls 內容中的 hosts 與 secretName 是否正確,還有 rules 內的 hosts 是否正確。
piVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
ingressClassName: nginx
tls:
- hosts:
- online-toolset.com
secretName: webtools-tls-secret
rules:
- host: online-toolset.com
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp
port:
number: 80
最後,kubectl apply 您的 ingress yaml 檔案即可。我的範例是將三者寫在同一個 deploy-webapp.yaml 檔案內,一次更新。
kubectl apply -f deploy-webapp.yml
開啟瀏覽器,輸入網址,即可看見您的網站有 HTTPS 保護