原生Kubernetes 使用 AWS ELB Controller

孟英锐
2023-12-01
  1. 下载Amazon负载均衡器控制器的 IAM 策略,该策略允许负载均衡器代表您调用 Amazon API。
    a. 下载链接: https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy_cn.json
  2. 下载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”
  3. 在AWS控制台创建 IAM Policy
    a. 在AWS控制台左上角“服务”弹出的检索框检索“IAM”之后在弹出的下拉框中选择“IAM”,之后依次点击“策略” -> “创建策略” -> “JSON”,之后将步骤1中下载下来的Policy JSON文件粘到文本框,然后右下角依次点击“下一步:标签”-> “下一步:审核”,最后在“名称”文本框输入自定义策略名并点击右下角创建策略。
    b. AWS控制台左上角“服务”弹出的检索框检索“IAM”之后在弹出的下拉框中选择“IAM”,之后依次点击“策略” -> “创建策略” -> “JSON”,之后将步骤2中下载并更改好的Policy JSON文件粘到文本框,然后右下角依次点击“下一步:标签”-> “下一步:审核”,最后在“名称”文本框输入自定义策略名并点击右下角创建策略。
  4. 在AWS控制台创建 IAM Role
    a. 在AWS控制台左上角“服务”弹出的检索框检索“IAM”之后在弹出的下拉框中选择“IAM”,之后依次点击“角色” -> “创建角色” -> 勾选常见使用案例中的“EC2”选项 -> “下一步”,之后在权限策略的检索框中搜索并勾选添加您在步骤3中创建的两个IAM Policy,完成后点击“下一步”,在“角色名称”的文本框中输入您自定义的角色名并点击右下角“创建角色”。
  5. 将IAM Role附加到K8s EC2
    a. 返回EC2控制台,将步骤4中创建好的IAM Role附加到自建K8s集群的所有节点
  6. 创建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
  1. 通过应用 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
  1. 为您要用作部署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。
  2. 登陆您的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字段信息
  1. 添加注册目标。
    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

  1. 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
 类似资料: