AWS eks綁定alb 使用aws-load-balancer-controller(Ingress Controller)提供服務(wù)


作者:SRE運(yùn)維博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/211217431135/
相關(guān)話題:https://www.cnsre.cn/tags/aws/


最近在AWS 平臺(tái)創(chuàng)建了EKS 用于測試環(huán)境項(xiàng)目儒旬,EKS 創(chuàng)建完以后我打算使用 Ingress 控制器 來暴露服務(wù)栈源,ingress 前在添加一個(gè)ALB 負(fù)載均衡器盟萨,這樣就可以實(shí)現(xiàn)完全的高可用了捻激。但是在創(chuàng)建好 ingress 卻發(fā)現(xiàn)無法調(diào)通服務(wù)胞谭,查看 aws 官方文檔 Amazon EKS 上的應(yīng)用程序負(fù)載均衡 發(fā)現(xiàn)需要使用 aws-load-balancer-controller.

本文檔的目標(biāo):

  • 創(chuàng)建 EKS ALB 所需要的角色。

  • 創(chuàng)建 EKS aws-load-balancer-controller

  • 創(chuàng)建 EKS pod 服務(wù)

  • 使用 ALB 將 pod 服務(wù)暴露出去

AWS Load Balancer Controller 介紹

AWS Load Balancer Controller 的工作原理

AWS Load Balancer Controller 是幫助管理 Kubernetes 集群的彈性負(fù)載均衡器的控制器。

下圖詳細(xì)說明了此控制器創(chuàng)建的 AWS 組件竞漾。它還演示了從 ALB 到 Kubernetes 集群的路由入口流量。

sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

[1]:控制器監(jiān)視來自 API 服務(wù)器的入口事件。當(dāng)它找到滿足其要求的入口資源時(shí)棍好,它開始創(chuàng)建 AWS 資源。

[2]:在 AWS 中為新的入口資源創(chuàng)建了一個(gè) ALB (ELBv2)爹梁。此 ALB 可以面向 Internet 或內(nèi)部姚垃。您還可以使用注釋指定它在其中創(chuàng)建的子網(wǎng)。

[3]:在 AWS 中為入口資源中描述的每個(gè)獨(dú)特的 Kubernetes 服務(wù)創(chuàng)建目標(biāo)組谦纱。

[4]:為入口資源注釋中詳述的每個(gè)端口創(chuàng)建偵聽器。如果未指定端口川慌,則使用合理的默認(rèn)值 (80443)梦重。證書也可以通過注釋附加琴拧。

[5]:為入口資源中指定的每個(gè)路徑創(chuàng)建規(guī)則嘱支。這可確保將特定路徑的流量路由到正確的 Kubernetes 服務(wù)除师。

安裝前的準(zhǔn)備

  • EKS 已經(jīng)創(chuàng)建完畢
  • 準(zhǔn)備 兩個(gè) Public 子網(wǎng)
  • 能夠創(chuàng)建 IAM 策略 的賬戶

關(guān)于子網(wǎng)的說明:

根據(jù)EKS 最佳實(shí)踐汛聚。EKS 的 worker node贞岭,它們只需要接收來自 alb ingress(通過內(nèi)網(wǎng)轉(zhuǎn)發(fā))的流量搓侄,安全起見就需要把他們放在私有子網(wǎng)讶踪。但是它們又需要去公網(wǎng)上拉一些鏡像,所以它們本身也需要放問公網(wǎng)的能力柱查,這個(gè)時(shí)候它們的子網(wǎng)里配置個(gè) nat唉工,訪問外網(wǎng)的時(shí)候由 NAT 做一個(gè)出向的轉(zhuǎn)發(fā)淋硝,就可以實(shí)現(xiàn)了谣膳,但是因?yàn)?nat 是單向的,外界是無法通過NAT訪問到eks的節(jié)點(diǎn)的烈菌,所以我就需要將ALB 放在 public 子網(wǎng)里芽世。最后就是 ALB 放在 public 來接受流量捂襟,worker node 在私有子網(wǎng)處理業(yè)務(wù)欢峰。

創(chuàng)建AWS Load Balancer Controller 的 IAM 策略

打開 策略 點(diǎn)擊 創(chuàng)建策略 打開 IAM_Policy.json 復(fù)制內(nèi)容粘貼到 json

sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

點(diǎn)擊下一步:標(biāo)簽

sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

然后一直下一步 在下圖中名稱填寫 AWSLoadBalancerControllerIAMPolicy 你也可以自定義名稱宠漩。然后創(chuàng)建策略扒吁。

image

{{< notice info "注意:" >}}
如果以官方提供的 IAM_Policy.json 保存有錯(cuò)的話你可以使用一下策略(權(quán)限會(huì)大一些)
{{< /notice >}}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAddresses",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeVpcs",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeInstances",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeTags",
                "ec2:GetCoipPoolUsage",
                "ec2:DescribeCoipPools",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:DescribeLoadBalancerAttributes",
                "elasticloadbalancing:DescribeListeners",
                "elasticloadbalancing:DescribeListenerCertificates",
                "elasticloadbalancing:DescribeSSLPolicies",
                "elasticloadbalancing:DescribeRules",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:DescribeTargetGroupAttributes",
                "elasticloadbalancing:DescribeTargetHealth",
                "elasticloadbalancing:DescribeTags"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cognito-idp:DescribeUserPoolClient",
                "acm:ListCertificates",
                "acm:DescribeCertificate",
                "iam:ListServerCertificates",
                "iam:GetServerCertificate",
                "waf-regional:GetWebACL",
                "waf-regional:GetWebACLForResource",
                "waf-regional:AssociateWebACL",
                "waf-regional:DisassociateWebACL",
                "wafv2:GetWebACL",
                "wafv2:GetWebACLForResource",
                "wafv2:AssociateWebACL",
                "wafv2:DisassociateWebACL",
                "shield:GetSubscriptionState",
                "shield:DescribeProtection",
                "shield:CreateProtection",
                "shield:DeleteProtection"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateSecurityGroup"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws-cn:ec2:*:*:security-group/*",
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "CreateSecurityGroup"
                },
                "Null": {
                    "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Resource": "arn:aws-cn:ec2:*:*:security-group/*",
            "Condition": {
                "Null": {
                    "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                    "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:DeleteSecurityGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Null": {
                    "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:CreateLoadBalancer",
                "elasticloadbalancing:CreateTargetGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Null": {
                    "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:CreateListener",
                "elasticloadbalancing:DeleteListener",
                "elasticloadbalancing:CreateRule",
                "elasticloadbalancing:DeleteRule"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:AddTags",
                "elasticloadbalancing:RemoveTags"
            ],
            "Resource": [
                "arn:aws-cn:elasticloadbalancing:*:*:targetgroup/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:loadbalancer/net/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:loadbalancer/app/*/*"
            ],
            "Condition": {
                "Null": {
                    "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                    "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:AddTags",
                "elasticloadbalancing:RemoveTags"
            ],
            "Resource": [
                "arn:aws-cn:elasticloadbalancing:*:*:listener/net/*/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:listener/app/*/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:listener-rule/net/*/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:listener-rule/app/*/*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:ModifyLoadBalancerAttributes",
                "elasticloadbalancing:SetIpAddressType",
                "elasticloadbalancing:SetSecurityGroups",
                "elasticloadbalancing:SetSubnets",
                "elasticloadbalancing:DeleteLoadBalancer",
                "elasticloadbalancing:ModifyTargetGroup",
                "elasticloadbalancing:ModifyTargetGroupAttributes",
                "elasticloadbalancing:DeleteTargetGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Null": {
                    "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:RegisterTargets",
                "elasticloadbalancing:DeregisterTargets"
            ],
            "Resource": "arn:aws-cn:elasticloadbalancing:*:*:targetgroup/*/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:SetWebAcl",
                "elasticloadbalancing:ModifyListener",
                "elasticloadbalancing:AddListenerCertificates",
                "elasticloadbalancing:RemoveListenerCertificates",
                "elasticloadbalancing:ModifyRule"
            ],
            "Resource": "*"
        }
    ]
}

賦予 EKS node 權(quán)限

角色 中搜索 nodegrou-NodeInstanceRole 找到你對應(yīng)的 EKS 集群 如下圖

sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

然后點(diǎn)擊該角色-- 點(diǎn)擊附加策略

sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

在搜索框內(nèi) 輸入剛才創(chuàng)建的策略名稱 然后選中饶火,點(diǎn)擊最下邊的附加策略肤寝。

我的策略名稱為:AWSLoadBalancerControllerIAMPolicy

sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

在 EKS 中安裝 AWS Load Balancer Controller

安裝證書管理器

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml

部署 YAML

下載負(fù)載平衡器控制器的規(guī)范鲤看。

wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.3.1/v2_3_1_full.yaml

編輯保存的 yaml 文件刨摩,轉(zhuǎn)到部署規(guī)范,并將控制器 --cluster-name arg 值設(shè)置為您的 EKS 集群名稱

apiVersion: apps/v1
kind: Deployment
. . .
name: aws-load-balancer-controller
namespace: kube-system
spec:
    . . .
    template:
        spec:
            containers:
                - args:
                    - --cluster-name=<INSERT_CLUSTER_NAME>

如果您為服務(wù)賬戶使用 IAM 角色呻征,我們建議您從 yaml 規(guī)范中刪除 ServiceAccount陆赋。如果您從 yaml 規(guī)范中刪除安裝部分嚷闭,這將保留 eksctl 創(chuàng)建的 iamserviceaccount胞锰。

apiVersion: v1
kind: ServiceAccount

應(yīng)用 yaml 文件

kubectl apply -f v2_3_1_full.yaml

部署示例應(yīng)用程序

將游戲 2048 部署為示例應(yīng)用程序嗅榕,以確認(rèn)作為入口對象的結(jié)果,Amazon負(fù)載均衡器控制器是否會(huì)創(chuàng)建 Amazon ALB兼雄。

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/examples/2048/2048_full.yaml

幾分鐘后帽蝶,驗(yàn)證是否已使用以下命令創(chuàng)建入口資源励稳。

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

輸出:

NAME           CLASS    HOSTS   ADDRESS                                                                       PORTS   AGE
ingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.cn-north-1.elb.amazonaws.com.cn   80      3h42m
sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

{{< notice info "注意:" >}}
如果在幾分鐘后尚未創(chuàng)建入口驹尼,請運(yùn)行以下命令以查看負(fù)載均衡器控制器日志扶欣。這些日志包含可幫助您診斷部署中任何問題的錯(cuò)誤消息。
{{< /notice >}}

kubectl logs -n kube-system   deployment.apps/aws-load-balancer-controller

打開瀏覽器并從上一命令輸出導(dǎo)航到 ADDRESS URL 以查看示例應(yīng)用程序骆捧。如果您沒有看到任何內(nèi)容敛苇,請等待幾分鐘顺呕,并刷新您的瀏覽器株茶。

sre運(yùn)維|Linux運(yùn)維|關(guān)鍵詞

作者:SRE運(yùn)維博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/211217431135/
相關(guān)話題:https://www.cnsre.cn/tags/aws/


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹦掐,一起剝皮案震驚了整個(gè)濱河市僵闯,隨后出現(xiàn)的幾起案子鳖粟,更是在濱河造成了極大的恐慌,老刑警劉巖泳秀,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晶默,死亡現(xiàn)場離奇詭異磺陡,居然都是意外死亡漠畜,警方通過查閱死者的電腦和手機(jī)憔狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瘾敢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人射众,你說我怎么就攤上這事晃财《鲜ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長命迈。 經(jīng)常有香客問我躺翻,道長公你,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮剪芥,結(jié)果婚禮上税肪,老公的妹妹穿的比我還像新娘。我一直安慰自己锻梳,他們只是感情好疑枯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布荆永。 她就那樣靜靜地躺著,像睡著了一般滔以。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桃漾,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天撬统,我揣著相機(jī)與錄音敦迄,去河邊找鬼。 笑死罚屋,一個(gè)胖子當(dāng)著我的面吹牛苦囱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脾猛,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撕彤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猛拴?” 一聲冷哼從身側(cè)響起羹铅,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愉昆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跛溉,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焊切,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芳室。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛蒙。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渤愁,靈堂內(nèi)的尸體忽然破棺而出牵祟,到底是詐尸還是另有隱情,我是刑警寧澤抖格,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布诺苹,位于F島的核電站咕晋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏收奔。R本人自食惡果不足惜掌呜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坪哄。 院中可真熱鬧质蕉,春花似錦、人聲如沸翩肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽念祭。三九已至兑宇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粱坤,已是汗流浹背隶糕。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留站玄,地道東北人枚驻。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像株旷,于是被迫代替她去往敵國和親测秸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容