如何在 Azure Kubernetes Service 上透過 Docker 部屬 Full Stack 網頁應用

Chonyy
7 min readSep 7, 2020

--

若方便閱讀英文的話,還請讀下方的英文版,此篇中文版可能會有些許的文法和中文翻譯誤差。

前言

這篇文章會一步一步帶領讓一個全端網頁應用在 AKS 上跑起來,我們範例的計算機 App 是由分離的 React 前端和 Flask 後端組成的。兩者都被包成了 Docker image 放在 Docker Hub 上。如果太簡略的話還請見諒,原本只是想當記錄方便自己以後要用的話可以看XD

內容涵蓋:

  • Azure Kubernetes Service
  • NGINX Ingress Controller
  • Docker Container
  • Azure CLI
  • Kubectl, Helm
  • React 前端, Flask 後端

概要

我們會建立兩個 Kubernetes 部屬,一個 React 前端和一個 Flask 後端。兩個 Kubernetes 服務也會被建立,讓我們能夠訪問被部屬的 App。

當前端和後端都在 k8s 的 cluster 中運作後,我們建立一個 Ingress 資源用來路由。透過 ingress controller 和 ingress rules,單一個 IP 可以被路由到 cluster 中的多個服務。

Source: https://www.nginx.com/products/nginx/kubernetes-ingress-controller/

開始動手做

建立 AKS Cluster

我們要做的第一件事是建立一個 AKS cluster。在自己喜歡的區域建立完資源群組後,我們可以透過 UI 或 Azure CLI 來建立 cluster。

連接 Cluster

我們透過 kubectl 來管理 k8s cluster。在 Azure CLI (紅框框) 執行以下指令來設定 kubectl 並連接到我們先前建立的 cluster。

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

建立 NGINX Ingress Controller

# 為了 ingress 資源建立一個 K8s namespace
kubectl create namespace ingress-basic
# 新增 ingress-nginx repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 使用 Helm 部屬 NGINX ingress controller
helm install nginx-ingress ingress-nginx/ingress-nginx \
--namespace ingress-basic \
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux

執行 Application

App 透過 YAML 檔案部屬到 cluster。我們用下方的 YAML 檔案來建立兩個 deployments 和各自對應的 service。

在此範例中,我們透過 Azure CLI 建立此檔案 code calculator.yaml

複製貼上下方的 manifest。請注意在 line 17 和 line 54,我們從先前建立的 docker image 取得檔案,也很歡迎各位使用自己的 image。

kubectl apply 在 namespace 中執行前端和後端

kubectl apply -f calculator.yaml --namespace ingress-basic

建立 Ingress 路由

現在前端和後端都在 k8s cluster 中運行中,接著我們建立一個 ingress 資源來設定路由規則。我們用和上方差不多的方法建立資源 code ingress.yaml

這檔案最重要的部分在 line 15 ~ 22。我們把要到 root URL 的路由到前端網頁,相同的,我們把要到 /api 的路由到 API 服務。

建立 ingress 資源

kubectl apply -f ingress.yaml

測試!

Kubernetes 的 load balancer service 為了 NGINX ingress controller 建立, 我們可以透過被分配的動態公開 IP 位址訪問 App 。

kubectl --namespace ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller

打開瀏覽器到 EXTERNAL-IP (紅框框).

我們可以到達計算機 UI,因為我們到 root URL 的訪問被 NGINX ingress controller 路由到了前端網頁服務。

當我們按下 Calculate 按鈕,他會發送一個 HTTP POST request 到 /api ,相同的,此訪問會被 NGINX 路由到後端 API。答案在後端 API 被計算,回應的答案會被前端網頁收到並且彈出成功視窗。歡呼~

範例程式碼

參考資料

--

--