作者: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ù)載均衡器的控制器。
- 它通過供應(yīng)應(yīng)用程序負(fù)載均衡器來滿足 Kubernetes Ingress 資源旺垒。
- 它通過提供 網(wǎng)絡(luò)負(fù)載均衡器來滿足 Kubernetes Service 資源先蒋。
下圖詳細(xì)說明了此控制器創(chuàng)建的 AWS 組件竞漾。它還演示了從 ALB 到 Kubernetes 集群的路由入口流量。
[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)值 (80
或443
)梦重。證書也可以通過注釋附加琴拧。
[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
點(diǎn)擊下一步:標(biāo)簽
然后一直下一步 在下圖中名稱填寫 AWSLoadBalancerControllerIAMPolicy
你也可以自定義名稱宠漩。然后創(chuàng)建策略扒吁。
{{< 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 集群 如下圖
然后點(diǎn)擊該角色-- 點(diǎn)擊附加策略
在搜索框內(nèi) 輸入剛才創(chuàng)建的策略名稱 然后選中饶火,點(diǎn)擊最下邊的附加策略肤寝。
我的策略名稱為:AWSLoadBalancerControllerIAMPolicy
在 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
{{< 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)維博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/211217431135/
相關(guān)話題:https://www.cnsre.cn/tags/aws/