第 2 章 网络 Operator


2.1. AWS Load Balancer Operator

AWS Load Balancer Operator 是红帽支持的 Operator,用户可以选择性地在 SRE 管理的 Red Hat OpenShift Service on AWS (ROSA)集群上安装。AWS Load Balancer Operator 管理 AWS Load Balancer Controller 的生命周期,为 ROSA 集群中运行的应用程序置备 AWS Elastic Load Balancing v2 (ELBv2)服务。

提示

AWS Load Balancer Operator 创建的负载均衡器不能用于 OpenShift 路由,并且只应用于不需要 OpenShift Route 完整第 7 层功能的单个服务或入口资源。

AWS Load Balancer Controller 为 Red Hat OpenShift Service on AWS (ROSA)集群管理 AWS Elastic Load Balancers。当使用类型为 LoadBalancer 的 Kubernetes Service 资源实施 Kubernetes Service 资源时,控制器会在创建 Kubernetes Ingress 资源和 AWS Network Load Balancers (NLB) 时置备 AWS Application Load Balancers (ALB)

与默认的 AWS 树内负载均衡器供应商相比,这个控制器会使用 ALBs 和 NLBs 的高级注解开发。一些高级用例有:

  • 使用带有 ALB 的原生 Kubernetes Ingress 对象
  • 将 ALBs 与 AWS Web 应用程序防火墙(WAF)服务集成
  • 指定自定义 NLB 源 IP 范围
  • 指定自定义 NLB 内部 IP 地址

AWS Load Balancer Operator 用于在 ROSA 集群中安装、管理和配置 aws-load-balancer-controller 实例。

AWS Load Balancer Operator 需要具有多个可用区域(AZ)的集群,以及在同一虚拟私有云(VPC)中跨三个 AZ 分割的公共子网。

重要

由于这些要求,AWS Load Balancer Operator 可能并不适合许多 PrivateLink 集群。AWS NLBs 没有这个限制。

在安装 AWS Load Balancer Operator 前,您必须配置以下内容:

  • 具有多个可用区的 ROSA (经典架构)集群
  • BYO VPC 集群
  • AWS CLI
  • OC CLI

2.1.1.1. AWS Load Balancer Operator 环境设置

可选:您可以设置临时环境变量来简化安装命令。

注意

如果您决定不使用环境变量,请手动输入代码片段中提示的值。

流程

  1. 以 admin 用户身份登录集群后,运行以下命令:

    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}")
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/alb-operator"
    $ mkdir -p ${SCRATCH}
    Copy to Clipboard Toggle word wrap
  2. 您可以运行以下命令来验证变量是否已设置:

    $ echo "Cluster name: ${CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    Copy to Clipboard Toggle word wrap

    输出示例

    Cluster name: <cluster_id>, Region: us-east-2, OIDC Endpoint: oidc.op1.openshiftapps.com/<oidc_id>, AWS Account ID: <aws_id>
    Copy to Clipboard Toggle word wrap

2.1.1.2. AWS VPC 和子网

在安装 AWS Load Balancer Operator 之前,您必须标记 AWS VPC 资源。

流程

  1. 将环境变量设置为 ROSA 部署的正确值:

    $ export VPC_ID=<vpc-id>
    $ export PUBLIC_SUBNET_IDS="<public-subnet-a-id> <public-subnet-b-id> <public-subnet-c-id>"
    $ export PRIVATE_SUBNET_IDS="<private-subnet-a-id> <private-subnet-b-id> <private-subnet-c-id>"
    Copy to Clipboard Toggle word wrap
  2. 使用集群名称向集群的 VPC 添加标签:

    $ aws ec2 create-tags --resources ${VPC_ID} --tags Key=kubernetes.io/cluster/${CLUSTER_NAME},Value=owned --region ${REGION}
    Copy to Clipboard Toggle word wrap
  3. 在您的公共子网中添加标签:

    $ aws ec2 create-tags \
         --resources ${PUBLIC_SUBNET_IDS} \
         --tags Key=kubernetes.io/role/elb,Value='' \
         --region ${REGION}
    Copy to Clipboard Toggle word wrap
  4. 在您的专用子网中添加标签:

    $ aws ec2 create-tags \
         --resources ${PRIVATE_SUBNET_IDS} \
         --tags Key=kubernetes.io/role/internal-elb,Value='' \
         --region ${REGION}
    Copy to Clipboard Toggle word wrap

2.1.2. 安装 AWS Load Balancer Operator

使用集群设置环境后,您可以使用 CLI 安装 AWS Load Balancer Operator。

流程

  1. 为 AWS Load Balancer Operator 在集群中创建一个新项目:

    $ oc new-project aws-load-balancer-operator
    Copy to Clipboard Toggle word wrap
  2. 为 AWS Load Balancer Controller 创建 AWS IAM 策略:

    注意

    您可以从 上游 AWS Load Balancer Controller 策略找到 AWS IAM 策略。此策略包括 Operator 正常工作所需的所有权限。

    $ POLICY_ARN=$(aws iam list-policies --query \
          "Policies[?PolicyName=='aws-load-balancer-operator-policy'].{ARN:Arn}" \
          --output text)
    $ if [[ -z "${POLICY_ARN}" ]]; then
         wget -O "${SCRATCH}/load-balancer-operator-policy.json" \
            https://raw.githubusercontent.com/rh-mobb/documentation/main/content/rosa/aws-load-balancer-operator/load-balancer-operator-policy.json
         POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
         --output text iam create-policy \
         --policy-name aws-load-balancer-operator-policy \
         --policy-document "file://${SCRATCH}/load-balancer-operator-policy.json")
    fi
    $ echo $POLICY_ARN
    Copy to Clipboard Toggle word wrap
  3. 为 AWS Load Balancer Operator 创建 AWS IAM 信任策略:

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager", "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-cluster"]
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
    Copy to Clipboard Toggle word wrap
  4. 为 AWS Load Balancer Operator 创建 AWS IAM 角色:

    $ ROLE_ARN=$(aws iam create-role --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
    $ echo $ROLE_ARN
    
    $ aws iam attach-role-policy --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
         --policy-arn $POLICY_ARN
    Copy to Clipboard Toggle word wrap
  5. 为 AWS Load Balancer Operator 创建一个 secret,以假定我们新创建的 AWS IAM 角色:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    stringData:
      credentials: |
        [default]
        role_arn = $ROLE_ARN
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    EOF
    Copy to Clipboard Toggle word wrap
  6. 安装 AWS Load Balancer Operator:

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      upgradeStrategy: Default
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      channel: stable-v1.0
      installPlanApproval: Automatic
      name: aws-load-balancer-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: aws-load-balancer-operator.v1.0.0
    EOF
    Copy to Clipboard Toggle word wrap
  7. 使用 Operator 部署 AWS Load Balancer Controller 实例:

    注意

    如果在此处收到错误,等待一分钟并重试,这意味着 Operator 还没有完成安装。

    $ cat << EOF | oc apply -f -
    apiVersion: networking.olm.openshift.io/v1
    kind: AWSLoadBalancerController
    metadata:
      name: cluster
    spec:
      credentials:
        name: aws-load-balancer-operator
    EOF
    Copy to Clipboard Toggle word wrap
  8. 检查 Operator 和控制器 pod 是否正在运行:

    $ oc -n aws-load-balancer-operator get pods
    Copy to Clipboard Toggle word wrap

    如果没有等待时间并重试,您应该看到以下内容:

    NAME                                                             READY   STATUS    RESTARTS   AGE
    aws-load-balancer-controller-cluster-6ddf658785-pdp5d            1/1     Running   0          99s
    aws-load-balancer-operator-controller-manager-577d9ffcb9-w6zqn   2/2     Running   0          2m4s
    Copy to Clipboard Toggle word wrap

2.1.2.1. 验证部署

  1. 创建一个新项目:

    $ oc new-project hello-world
    Copy to Clipboard Toggle word wrap
  2. 部署 hello world 应用程序:

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
    Copy to Clipboard Toggle word wrap
  3. 为 AWS ALB 配置 NodePort 服务以连接:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-openshift-nodeport
      namespace: hello-world
    spec:
      ports:
        - port: 80
          targetPort: 8080
          protocol: TCP
      type: NodePort
      selector:
        deployment: hello-openshift
    EOF
    Copy to Clipboard Toggle word wrap
  4. 使用 AWS Load Balancer Operator 部署 AWS ALB:

    $ cat << EOF | oc apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: hello-openshift-alb
      namespace: hello-world
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: hello-openshift-nodeport
                    port:
                      number: 80
    EOF
    Copy to Clipboard Toggle word wrap
  5. curl AWS ALB Ingress 端点,以验证 hello world 应用程序是否可以访问:

    注意

    AWS ALB 置备需要几分钟时间。如果您收到一个错误,显示 curl: (6) Could not resolve host,请等待并重试。

    $ INGRESS=$(oc -n hello-world get ingress hello-openshift-alb \
        -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${INGRESS}"
    Copy to Clipboard Toggle word wrap

    输出示例

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

  6. 为您的 hello world 应用程序部署 AWS NLB:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-openshift-nlb
      namespace: hello-world
      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
          targetPort: 8080
          protocol: TCP
      type: LoadBalancer
      selector:
        deployment: hello-openshift
    EOF
    Copy to Clipboard Toggle word wrap
  7. 测试 AWS NLB 端点:

    注意

    NLB 置备需要几分钟时间。如果您收到一个错误,显示 curl: (6) Could not resolve host,请等待并重试。

    $ NLB=$(oc -n hello-world get service hello-openshift-nlb \
      -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${NLB}"
    Copy to Clipboard Toggle word wrap

    输出示例

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

2.1.3. 删除 AWS Load Balancer Operator 示例安装

  1. 删除 hello world 应用命名空间(以及命名空间中的所有资源):

    $ oc delete project hello-world
    Copy to Clipboard Toggle word wrap
  2. 删除 AWS Load Balancer Operator 和 AWS IAM 角色:

    $ oc delete subscription aws-load-balancer-operator -n aws-load-balancer-operator
    $ aws iam detach-role-policy \
      --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
      --policy-arn $POLICY_ARN
    $ aws iam delete-role \
      --role-name "${ROSA_CLUSTER_NAME}-alb-operator"
    Copy to Clipboard Toggle word wrap
  3. 删除 AWS IAM 策略:

    $ aws iam delete-policy --policy-arn $POLICY_ARN
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat