在雲端建立AKS後,運行後有許多Container會被外部服務呼叫使用。但我們知道當我們佈署到AKS,如果要被外面服務呼叫,就要在YAML將Type設定成Loadbalance,一旦這樣設定,就會變成每個Container就會多出一個對外的IP,Container變多了,對外IP就會擴增很快,也不好管理再加上資訊安全也不好做。因此,如何做好管理,可以透過Nginx當作Ingress Controller。當然還有其他套可以使用,只是剛好因為在企業內部也用這套,用起來會比較順手
要安裝Nginx前,我們必須要先登入AKS,在登入這地方,在叢集系統管理員 ClusterRoleBinding的設定方式不同,做法也不同。如果今天,除了AKS外,又有很多服務在Azure上面運行,我會建議最少要使用Azure AD驗證的模式。這樣與其他服務溝通都可以透過識別身分方式溝通,可以確保資訊安全
那樣,有沒有啟用AAD認證差別會在哪邊呢?主要差異就是必須要安裝kubelogin作為驗證外掛之用。要完整安裝kubelogin,可以參考下面三篇文章,就可以完成
如果不是使用AAD認證的人,就不需要安裝這個外掛套件,安裝完畢後,使用Azure Cli進行下面幾個操作,就可以登入AKS
az account set - subscription XXXXXX
az aks get-credentials --resource-group groupname --name resourcename
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時候,再來是要設定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
設定好,也是用kubectl apply -f 方式佈署這個設定檔的Yaml
如果,應用程式都用Container方式佈署在AKS內,AKS內的系統要互相呼叫,不需要使用Nginx的路由從外面再進來,直接在內部用URL呼叫就可以,避免路由從內到外,再從外進入裡面的Container。因此,設定URL規則如下:
ContaineName.Namespace.svc.cluster.local:Port
記住不要再加入Nginx Prefix,自己就忘記,導致花很多時間
一旦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方式運行和設定