Kubernetes Ingress 與 AWS ALB Ingress 控制器的配合使用


Kubernetes Ingress 是一種 API 對象,借助它可以管理對集群中運行的 Kubernetes 服務的外部(或)內部 HTTP[s] 訪問。Amazon Elastic Load Balancing Application Load Balancer (ALB) 是一個非常受歡迎的 AWS 服務,它可在應用程序層(第 7 層)跨一個區域的多個目標(例如 Amazon EC2 實例)調整傳入流量的負載平衡。ALB 支持多種功能,包括基於主機或路徑的路由、TLS(傳輸層安全性)終止、WebSocket、HTTP/2、AWS WAF(Web 應用程序防火牆)集成、綜合訪問日志以及運行狀況檢查等。

AWS ALB Ingress 控制器將在Kubernetes 用戶聲明集群上的 Ingress 資源時觸發創建 ALB 以及必要的 AWS 支持資源。Ingress 資源通過 ALB 將 HTTP[s] 流量路由至集群內的不同終端節點。AWS ALB Ingress 控制器支持任何 Kubernetes 集群,包括 Amazon Elastic Container Service for Kubernetes (EKS)。

術語

我們將使用下列首字母縮寫詞來詳細介紹 Kubernetes Ingress 概念:

  • ALB:AWS Application Load Balancer
  • ENI:彈性網絡接口
  • NodePort:用戶為 NodePort 設置 type 字段時,Kubernetes 主服務器會從范圍內分配一個靜態端口,每個節點都將該端口作為進入您的服務的代理(每個節點的端口號均相同)。

Kubernetes Ingress 如何與 aws-alb-ingress-controller 配合使用

下圖詳細描述了用戶定義了 Ingress 資源時 aws-alb-ingress-controller 將會創建的 AWS 組件。Ingress 資源將進站流量從 ALB 路由到 Kubernetes 集群。

插圖:Kubernetes Ingress 如何與 aws-alb-ingress-controller 配合使用

Ingress 的創建

依次執行上圖中用藍色圈數字表示的步驟:

  1. 控制器觀察來自 API 服務器的進站事件。如果發現 Ingress 資源滿足要求,則將開始創建 AWS 資源。
  2. 為 Ingress 資源創建 ALB。
  3. 為 Ingress 資源中指定的每個后端創建目標組
  4. 為 Ingress 資源注釋中指定的每個端口創建偵聽器。如果未指定端口,則將使用合理的默認值(80 或 443)。
  5. 為 Ingress 資源中指定的每個路徑創建規則。這將確保指向特定路徑的流量將被路由至所創建的正確目標組。

進站流量

AWS ALB Ingress 控制器支持兩種流量模式:實例模式和 ip 模式。
用戶可以通過在 Ingress 和 Service 定義中聲明 alb.ingress.kubernetes.io/target-type 注釋來指定流量模式。

  • 實例模式:Ingress 流量從 ALB 出發並到達為您的服務開放的 NodePort。然后將流量路由至集群內的容器 Pod。在此模式中,數據包始終會跳躍兩次后才會到達目的地。
  • ip 模式:Ingress 流量從 ALB 出發,然后直接到達集群內的容器 Pod。如要使用此模式,Kubernetes 集群的聯網插件(也就是 適用於 Kubernetes 的 AWS CNI 插件)必須將 ENI 上的第二個 IP 地址作為 Pod IP。在此模式中,數據包始終會跳躍一次就到達目的地。

使用 eksctl 部署 Amazon EKS

首先使用 eksctl cli 工具來部署 Amazon EKS 集群。

macOS 用戶需要使用 Homebrew 來安裝 eksctl:

brew install weaveworks/tap/eksctl

使用集群名稱“attractive-gopher”創建 EKS 集群

eksctl create cluster --name=attractive-gopher

前往 VPC 控制台的“子網”部分。找到您的 EKS 集群的所有公有子網。

例如:
eksctl-attractive-gopher-cluster/SubnetPublic<USWEST2a>
eksctl-attractive-gopher-cluster/SubnetPublic<USWEST2b>
eksctl-attractive-gopher-cluster/SubnetPublic<USWEST2c>

根據此指南的定義在控制台中配置公有子網。(AWS 上的大多數 Kubernetes
分配已經為您完成了此步驟,例如 kops)

部署 AWS ALB Ingress 控制器

然后將 AWS ALB Ingress 控制器部署到 Kubernetes 集群中。

創建 IAM 策略以向 Ingress 控制器賦予正確的權限:

  1. 前往 IAM 控制台並選擇 策略。
  2. 選擇 創建策略 。
  3. 在 JSON 部分潛入模板 iam-policy.json 的內容。
  4. 查看策略 並另存為 “ingressController-iam-policy”

將 IAM 掛載到 EKS 工作線程節點:

  1. 返回 IAM 控制台。
  2. 選擇角色 部分,然后搜索您的 EKS 工作線程節點的 NodeInstanceRole。例如:eksctl-attractive-gopher-NodeInstanceRole-xxxxxx
  3. 掛載策略“ingressController-iam-policy”。

部署 AWS ALB Ingress 控制器需要的 RBAC Roles 和 RoleBindings:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/rbac-role.yaml

將 AWS ALB Ingress 控制器 YAML 下載到本地文件:

curl -sS "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/alb-ingress-controller.yaml" > alb-ingress-controller.yaml

編輯 AWS ALB Ingress 控制器 YAML t以包含 Kubernetes(或)Amazon EKS 集群的 clusterName。

將 –cluster-name 標記編輯為我們的 Kubernetes(或)Amazon EKS 集群的真實名稱。

部署 AWS ALB Ingress 控制器 YAML:

kubectl apply -f alb-ingress-controller.yaml

驗證部署成功,並且控制器已經啟動:

kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o alb-ingress[a-zA-Z0-9-]+)

您應能看到如下輸出:

-------------------------------------------------------------------------------
AWS ALB Ingress controller
  Release: v1.0.0
  Build: git-6ee1276
  Repository: https://github.com/kubernetes-sigs/aws-alb-ingress-controller
-------------------------------------------------------------------------------

部署示例應用程序

然后我們將實例 2048 游戲部署到 Kubernetes 集群並使用 Ingress 資源使其對流量開放:

部署 2048 游戲資源:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-service.yaml

部署 2048 游戲的 Ingress 資源:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-ingress.yaml

等待幾秒后,驗證 Ingress 資源已啟用:

kubectl get ingress/2048-ingress -n 2048-game

您應能看到如下輸出:

NAME         HOSTS         ADDRESS         PORTS   AGE
2048-ingress   *    DNS-Name-Of-Your-ALB    80     3m

打開瀏覽器。復制並粘貼您的“DNS-Name-Of-Your-ALB”。這時您應該可以訪問新部署的 2048 游戲 — 盡情玩吧!

歡迎參與

AWS ALB Ingress 控制器是 Kubernetes SIG(特殊興趣組)AWS 的一個子項目。后者是由 Yang Yang (@M00nf1sh) 和 Kraig Amador (@bigkraig) 維護的一個全開源項目。Kubernetes SIG-AWS 的技術路線圖目前由 3 位 SIG 主席主持:@d-nishi (Nishi Davidson)、@justinsb (Justin Santa Barbara) 和 @krisnova (Kris Nova)。

AWS ALB Ingress 控制器已經確定為 Kubernetes 1.13 的一個阿爾法版功能,將於 2018 年 12 月初發布。AWS 團隊已經使用 Amazon EKS 對 Ingress 控制器進行了測試,它目前支持 Kubernetes 版本 1.10。

更多資源:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM