當我們將一個Web應用部署於k8s上,若要接收外部的HTTP請求,則需透過配置一個Ingress Controller來接收與處理。早期自己在搭建服務時,大多都是在 VM上安裝一個Nginx作為反向代理的服務器,透過Nginx高性能的特性來進行請求下發至對應的機器或服務上,而在Kubernetes上也是透過類似的方法進行請求的轉發。
Kubernetes普遍所使用的反向代理機制為官方所推出的ingress-nginx。根據官方的安裝手冊,首先透過以下之Kube操作指令,對於所需要的元件進行安裝與設定:
>
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
注意:執行此指令可能需要相對較高的Kubernetes操作權限(它包含創建ServiceAccount、ConfigMap、Namespace等),如果有興趣可以打開透過瀏覽器連打開此yaml,觀察到底安裝了哪些東西。安裝的版本也會隨著你輸入的release而變動,剛剛上面是使用nginx-0.30.0版本。
我們都知道Kubernetes的底層其實是以多個VM或主機所組成的集群,但通常我們的網址(域名)透過DNS的設定,後面都是連結一個IP進行解析。這種情況下要怎麼使多個節點的集群都對應到同一個Domain上,即是透過LoadBalancer進行請求的轉發。
安裝與設定完必要的元件後,針對不同的雲服務商Azure、Google、AWS等,或者Local測試環境(Docker For Mac、minikube等)再執行LoadBalancer(負載平衡)的Service設定。換句話說,不同服務商所使用的LoadBalancer配置與架構還是有所不同。這裡以使用DigitalOcean的kubernetes集群為例,我們只要挑選Generic的方法,即可完成LoadBalancer的設定,對應的指令如下:
>
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/cloud-generic.yaml
一切都執行完畢後,可以利用以下指令確認是否有正確的配置好 ingress-nginx 與其相關的設定。若看到Status在運行(Running)的狀態,代表已經在正確的運作
>
kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx
透過上述的這些指令,即可在DigitalOcean成功部署ingress-nginx。接下來可以利用以下指令確認是否成功建立 LoadBalencer
。此時即可看到EXTERNAL-IP
下已經有了對應的IP位置,並對應到Port 80與Port 443。先記下這個IP位置,之後到您網域的DNS管理進行A紀錄的增加,將網域綁定到該IP,即可將外部請求導向至k8s集群。
>
kubectl get svc —n ingress-nginx
設定好ingress-nginx之後,即可為Web應用設定對應的ingress。利用以下的App Service的ingress設定為例。透過這樣的設定,可以將上面所配置的Ingress Controller將對於app.domain.com的請求轉發至Service app的Pod的Port 8080之上。(此範例略過service app的部署過程)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: app-ingress namespace: test spec: rules: - host: app.domain.com http: paths: - backend: serviceName: app servicePort: 8080 |
透過上述yaml,即可成功設定 Ingress,此時打開Browser,輸入所設定的domain應該就可以連上所對應的Web Service。
接下來,將會有如何將Nginx-Ingress透過TLS強化連線安全,使Web應用在Kubernetes上全部使用HTTPS連線!!
希望透過Kubernetes筆記與大家一起成長學習。如果有任何不正確地方,歡迎大家與我聯繫並給予指教!!