更新於 2024/09/04閱讀時間約 7 分鐘

Azure kubernetes內安裝Nginx作為Ingress Control

raw-image

在雲端建立AKS後,運行後有許多Container會被外部服務呼叫使用。但我們知道當我們佈署到AKS,如果要被外面服務呼叫,就要在YAML將Type設定成Loadbalance,一旦這樣設定,就會變成每個Container就會多出一個對外的IP,Container變多了,對外IP就會擴增很快,也不好管理再加上資訊安全也不好做。因此,如何做好管理,可以透過Nginx當作Ingress Controller。當然還有其他套可以使用,只是剛好因為在企業內部也用這套,用起來會比較順手

安裝Nginx

要安裝Nginx前,我們必須要先登入AKS,在登入這地方,在叢集系統管理員 ClusterRoleBinding的設定方式不同,做法也不同。如果今天,除了AKS外,又有很多服務在Azure上面運行,我會建議最少要使用Azure AD驗證的模式。這樣與其他服務溝通都可以透過識別身分方式溝通,可以確保資訊安全

那樣,有沒有啟用AAD認證差別會在哪邊呢?主要差異就是必須要安裝kubelogin作為驗證外掛之用。要完整安裝kubelogin,可以參考下面三篇文章,就可以完成

如果不是使用AAD認證的人,就不需要安裝這個外掛套件,安裝完畢後,使用Azure Cli進行下面幾個操作,就可以登入AKS

  • Az login
  • 指定好訂閱
az account set - subscription XXXXXX
  • 下載AKS叢集認證 :
az aks get-credentials --resource-group groupname --name resourcename
  • 啟動 kubelogin 程式進行驗證
kubelogin convert-kubeconfig -l azurecli

上面幾個步驟就登入,然後,我們可以來查所有命名空間中的部署,來確定是否真的有進去

kubectl get deployments --all-namespaces=true

然後,就開始準備安裝Nginx。要安裝Nginx,除了可以手動一步一步做,目前我會先將別人寫的YAML檔案,下載回來自己修正。這樣可以節省一些時間。取得YAML的URL:

https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

內容中我會將裡面對應的Loadbalance去指定我要指定的Public IP,如果對裡面命名不符合自己公司規範,也可以自己修改

修改好之後,就直接用kubectl apply -f 佈署Yaml檔案,完成後就可以看到Nginx在運行

設定Nginx Proxy

當我們建立好Nginx時候,再來是要設定Nginx的Proxy檔案,讓Nginx導向內部的Container的應用系統。下面,是Nginx Proxy範例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: btiaaks-ingress
namespace: api-service
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /cccapi(/|$)(.*)
pathType: Prefix
backend:
service:
name: azure-ai-service
port:
number: 7000
- path: /bbbapi(/|$)(.*)
pathType: Prefix
backend:
service:
name: bbb-service
port:
number: 7001
- path: /aaapi(/|$)(.*)
pathType: Prefix
backend:
service:
name: azure-service
port:
number: 7002
  • Namespace: 當你的服務與Nginx不同Namespace,就要特別掛上去指定是針對服務的Namespace
  • Path:是透過Nginx呼叫後端服務要帶入的路徑
  • Name:是指Container服務名稱

設定好,也是用kubectl apply -f 方式佈署這個設定檔的Yaml

如果,應用程式都用Container方式佈署在AKS內,AKS內的系統要互相呼叫,不需要使用Nginx的路由從外面再進來,直接在內部用URL呼叫就可以,避免路由從內到外,再從外進入裡面的Container。因此,設定URL規則如下:

ContaineName.Namespace.svc.cluster.local:Port

記住不要再加入Nginx Prefix,自己就忘記,導致花很多時間

如何測試AKS內部的Container

一旦Container是用AKS內部IP,那樣我們就不可能從外部去測試它,雖然我們可以從Azure Portal看這個服務是否有沒有啟動。但不能代表我們可以知道系統是否真的沒問題

最好方式,直接到AKS內部測試Container是否有無問題。要這樣測試,需要多幾個步驟。首先要安裝terminal在ASK內,Namespace要跟服務是同一個Namespace

kubectl run -it --rm aks-ingress-test --image=mcr.microsoft.com/dotnet/runtime-deps:6.0 --namespace ingress-basic

並安裝curl ,後續用curl 進行測試

apt-get update && apt-get install -y curl

然後在AKS的服務與輸入的地方,找出要測試的Container的IP

透過下面語法測試

curl -L http://10.0.80.77

如果是Web的container會回傳下面這樣訊息

如果是API,語法可以這樣,就會回傳API要回傳的結果

curl --location --request POST 'http://10.0.34.206:7000/weatherforecast/getdata2'

用以上方式,就可以建立unmanaged ingress controller,並用熟悉的Nginx方式運行和設定

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.