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/二、AWS WAF(Web 應用程序防火牆)集成、綜合訪問日誌以及運行情況檢查等。html

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

術語

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

  • 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 集羣。github

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

Ingress 的建立

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

  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。

更多資源:

相關文章
相關標籤/搜索