- 下载Amazon负载均衡器控制器的 IAM 策略,该策略允许负载均衡器代表您调用 Amazon API。
a. 下载链接:https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy_cn.json
- 下载Amazon负载均衡器控制器的 IAM 策略,该策略允许Amazon负载均衡器控制器访问由适用于 Kubernetes 的 ALB 入口控制器创建的资源。
a. 下载链接:https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy_v1_to_v2_additional.json
注意:此策略下载下来之后需要将所有类似“arn:aws:ec2:::security-group/*”arn信息中的aws字段改为对应区域字段。比如,当您AWS账号所在区域为中国区,请改为“aws-cn” - 在AWS控制台创建 IAM Policy
a. 在AWS控制台左上角“服务”弹出的检索框检索“IAM”之后在弹出的下拉框中选择“IAM”,之后依次点击“策略” -> “创建策略” -> “JSON”,之后将步骤1中下载下来的Policy JSON文件粘到文本框,然后右下角依次点击“下一步:标签”-> “下一步:审核”,最后在“名称”文本框输入自定义策略名并点击右下角创建策略。
b. AWS控制台左上角“服务”弹出的检索框检索“IAM”之后在弹出的下拉框中选择“IAM”,之后依次点击“策略” -> “创建策略” -> “JSON”,之后将步骤2中下载并更改好的Policy JSON文件粘到文本框,然后右下角依次点击“下一步:标签”-> “下一步:审核”,最后在“名称”文本框输入自定义策略名并点击右下角创建策略。 - 在AWS控制台创建 IAM Role
a. 在AWS控制台左上角“服务”弹出的检索框检索“IAM”之后在弹出的下拉框中选择“IAM”,之后依次点击“角色” -> “创建角色” -> 勾选常见使用案例中的“EC2”选项 -> “下一步”,之后在权限策略的检索框中搜索并勾选添加您在步骤3中创建的两个IAM Policy,完成后点击“下一步”,在“角色名称”的文本框中输入您自定义的角色名并点击右下角“创建角色”。 - 将IAM Role附加到K8s EC2
a. 返回EC2控制台,将步骤4中创建好的IAM Role附加到自建K8s集群的所有节点 - 创建ServiceAccount来继承IAM Role的权限。
a. 将以下内容保存到名为 aws-load-balancer-controller-service-account.yaml 的文件中。
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: aws-load-balancer-controller
name: aws-load-balancer-controller
namespace: kube-system
annotations:
eks.amazonaws.com/role-arn: <IAM Roel ARN>
注意:请将上述yaml文件中 字段替换为步骤4中您所创建的IAM Role的ARN
b. 创建ServiceAccount。
kubectl apply -f aws-load-balancer-controller-service-account.yaml
- 通过应用 Kubernetes 清单来安装Amazon负载均衡器控制器。
a. 安装 cert-manager 以将证书配置注入到 Webhook 中。
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml --validate=false
b. 下载控制器规范。
curl -Lo v2_4_0_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.0/v2_4_0_full.yaml
c. 对步骤7.b中下载下来的v2_4_0_full.yaml文件进行编辑。
(1)删除文件的 ServiceAccount 部分。删除此部分可防止在部署控制器时覆盖带有 IAM 角色的注释,并在删除控制器时保留您在第 3 步中创建的服务账户。
(2)将文件 Deployment spec 部分的 your-cluster-name 替换为您的集群的名称,然后在 --ingress-class=alb 下添加 following parameters。
...
spec:
containers:
- args:
- --cluster-name=your-cluster-name
- --ingress-class=alb
- --enable-shield=false
- --enable-waf=false
- --enable-wafv2=false
...
d. 应用文件。
kubectl apply -f v2_4_0_full.yaml
e. 验证aws elb controller是否安装。
kubectl get deployment -n kube-system aws-load-balancer-controller
- 为您要用作部署NLB的公有子网添加tag(NLB所选可用区子网至少有一个要跟后端实例所在可用区保持一致,或者开启NLB跨区域负载均衡功能)。这样,Kubernetes 就会知道仅将这些子网用于外部负载均衡器,而不是在每个可用区中选择公有子网(按子网 ID 的字典表顺序选择)。
a. 进入AWS VPC控制台界面,点击左侧导航栏“子网”选项,勾选您要部署NLB的公有子网,在下半部分控制台点击“标签”,之后点击“管理标签”。后续请将key和value按照以下添加:
key:kubernetes.io/role/elb
value:1
注意:请根据实际情况进行配置公私网NLB,如果用作内部负载均衡器,之后的Service yaml要对注解进行调整;
如果用作公网NLB请选择公有子网打tag,如果用作内部NLB请选择私有子网打tag,示例在此用作公网NLB。 - 登陆您的K8s集群创建Service。
a. 请将以下yaml文件复制到您的集群中。
apiVersion: v1
kind: Service
metadata:
name: aws-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
注意: aws-service应替换为您自定义的Service名称,spec下的参数需要调整为您所要提供服务的端口或Pod标签
b. 验证Service。
kubectl get svc |grep
注意: 输出结果中EXTERNAL-IP所展示的字段信息为NLB DNS字段信息
- 添加注册目标。
a. 根据步骤9.b中输出的EXTERNAL-IP字段找到对应的NLB,等待其预置完成。
b. 预置完成后,选中对应NLB,点击侦听器,在侦听器信息中点击转发到的目标群组。
c. 跳转到目标群组之后点击“目标”,然后点击“编辑”,在弹出的对话框中将您K8s集群所有节点勾选并点击“添加到已注册”,点击“保存”
d. 等待已注册目标的“状态”信息更新为“healthy”后,请跳转至EC2控制台确认对应K8s集群节点的安全组已开通Service所暴漏的端口。
e. 浏览器访问此NLB的DNS名称进行验证。
AWS ELB Controller Annotations扩展:
官网地址:https://kubernetes-sigs.github.io/aws-load-balancer-controller
- NLB - Service自动注册实例到AWS NLB目标群组
annotations: service.beta.kubernetes.io/aws-load-balancer-target-node-labels
用法示例: service.beta.kubernetes.io/aws-load-balancer-target-node-labels: label1=value1, label2=value2
配置步骤:
a. 首先在集群master节点执行 ”kubectl describe no |grep Provider“查看集群节点的AWS 实例信息是否已经存在于集群数据库中。
如果存在则进行下一步,如果不存在则执行以下命令来将实例信息写入集群。
kubectl patch nodes -p ‘{“spec”:{“providerID”:“aws:///cn-northwest-1c/i-***********”}}’ #注意对应的集群节点实例ID及所在可用区
b. kubectl label no key=value
c. 在Service中Annotations加入此注解并指定标签
d. 创建Service