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 集群。
Ingress 的創建
依次執行上圖中用藍色圈數字表示的步驟:
- 控制器觀察來自 API 服務器的進站事件。如果發現 Ingress 資源滿足要求,則將開始創建 AWS 資源。
- 為 Ingress 資源創建 ALB。
- 為 Ingress 資源中指定的每個后端創建目標組。
- 為 Ingress 資源注釋中指定的每個端口創建偵聽器。如果未指定端口,則將使用合理的默認值(
80
或443
)。 - 為 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 控制器賦予正確的權限:
- 前往 IAM 控制台並選擇 策略。
- 選擇 創建策略 。
- 在 JSON 部分潛入模板 iam-policy.json 的內容。
- 查看策略 並另存為 “ingressController-iam-policy”
將 IAM 掛載到 EKS 工作線程節點:
- 返回 IAM 控制台。
- 選擇角色 部分,然后搜索您的 EKS 工作線程節點的 NodeInstanceRole。例如:eksctl-attractive-gopher-NodeInstanceRole-xxxxxx
- 掛載策略“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。
更多資源: