第 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)服务。
2.1.1. 使用 Cloud Credential Operator 实用程序创建 AWS IAM 角色
您可以使用 Cloud Credential Operator 实用程序(ccoctl
) 为 AWS Load Balancer Operator 创建 AWS IAM 角色。AWS IAM 角色与子网和虚拟私有云 (VPC) 交互。
先决条件
-
您必须提取并准备
ccoctl
二进制文件。
流程
运行以下命令,下载
CredentialsRequest
自定义资源 (CR) 并将其存储在目录中:$ curl --create-dirs -o <credentials_requests_dir>/operator.yaml https://raw.githubusercontent.com/openshift/aws-load-balancer-operator/main/hack/operator-credentials-request.yaml
运行以下命令,使用
ccoctl
实用程序创建 AWS IAM 角色:$ ccoctl aws create-iam-roles \ --name <name> \ --region=<aws_region> \ --credentials-requests-dir=<credentials_requests_dir> \ --identity-provider-arn <oidc_arn>
输出示例
2023/09/12 11:38:57 Role arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-operator created 1 2023/09/12 11:38:57 Saved credentials configuration to: /home/user/<credentials_requests_dir>/manifests/aws-load-balancer-operator-aws-load-balancer-operator-credentials.yaml 2023/09/12 11:38:58 Updated Role policy for Role <name>-aws-load-balancer-operator-aws-load-balancer-operator created
- 1
- 请注意为 AWS Load Balancer Operator 创建的 AWS IAM 角色的 Amazon Resource Name (ARN),如
arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-operator
。
注意AWS IAM 角色名称的长度必须小于或等于 12 个字符。
2.1.2. 使用 Cloud Credential Operator 实用程序为控制器创建 AWS IAM 角色
您可以使用 Cloud Credential Operator 实用程序(ccoctl
) 为 AWS Load Balancer Controller 创建 AWS IAM 角色。AWS IAM 角色用于与子网和虚拟私有云 (VPC) 交互。
先决条件
-
您必须提取并准备
ccoctl
二进制文件。
流程
运行以下命令,下载
CredentialsRequest
自定义资源 (CR) 并将其存储在目录中:$ curl --create-dirs -o <credentials_requests_dir>/controller.yaml https://raw.githubusercontent.com/openshift/aws-load-balancer-operator/main/hack/controller/controller-credentials-request.yaml
运行以下命令,使用
ccoctl
实用程序创建 AWS IAM 角色:$ ccoctl aws create-iam-roles \ --name <name> \ --region=<aws_region> \ --credentials-requests-dir=<credentials_requests_dir> \ --identity-provider-arn <oidc_arn>
输出示例
2023/09/12 11:38:57 Role arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-controller created 1 2023/09/12 11:38:57 Saved credentials configuration to: /home/user/<credentials_requests_dir>/manifests/aws-load-balancer-operator-aws-load-balancer-controller-credentials.yaml 2023/09/12 11:38:58 Updated Role policy for Role <name>-aws-load-balancer-operator-aws-load-balancer-controller created
- 1
- 请注意为 AWS Load Balancer Controller 创建的 AWS IAM 角色的 Amazon Resource Name (ARN),如
arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-controller
。
注意AWS IAM 角色名称的长度必须小于或等于 12 个字符。
2.1.3. 安装 AWS Load Balancer Operator
如果满足某些要求,您可以安装 AWS Load Balancer Operator 和 AWS Load Balancer Controller。
先决条件
- 在 AWS (ROSA)集群上已有带有自带-own-VPC (BYO-VPC)配置的 Red Hat OpenShift Service,在 Hosted Control Plane (HCP)模式下安装了多个可用区(AZ)。
-
您可以使用具有
dedicated-admin
角色的用户访问集群。 - 您可以访问创建的 ROSA 集群的 VPC 和子网。
-
已安装 ROSA CLI (
rosa
)。 - 已安装 Amazon Web Services (AWS) CLI。
- 您可以使用 OpenShift Container Platform 4.13 或更高版本。
安装 AWS Load Balancer Operator 以与 AWS Local Zone (LZ)中的 ROSA 集群一起使用时,您必须为帐户启用 AWS Local Zone。另外,您必须确保 AWS Local Zone 中存在 AWS Elastic Load Balancing v2 (ELBv2)服务。
流程
运行以下命令,识别集群基础架构 ID 和集群 OpenID Connect (OIDC) DNS:
识别 ROSA 集群 ID:
$ rosa describe cluster --cluster=<cluster_name> | grep -i 'Infra ID'
或
$ oc get infrastructure cluster -o json | jq -r '.status.infrastructureName'
使用以下
rosa
CLI 命令识别 ROSA 集群 OIDC DNS:$ rosa describe cluster --cluster=<cluster_name> | grep -i OIDC 1
- 1
- OIDC DNS 示例是
oidc.op1.openshiftapps.com/28q7fsn54m2jjts3kd556aij4mu9omah
。
或
$ oc get authentication.config cluster -o=jsonpath="{.spec.serviceAccountIssuer}"
-
进入 IAM Access Management Identity provider,在 AWS Web 控制台上找到 OIDC Amazon Resource Name (ARN)信息。一个 OIDC ARN 示例为
arn:aws:iam::777777777777:oidc-provider/<oidc_dns_url>
。 - 保存命令的输出。您将在此过程中在以后的步骤中使用此信息。
使用 AWS CLI 为 AWS Load Balancer Operator 创建 AWS IAM 策略。
以具有
dedicated-admin
角色的用户身份登录 ROSA 集群,并使用以下命令创建新项目:$ oc new-project aws-load-balancer-operator
将以下信任策略分配给新创建的 AWS IAM 角色:
$ IDP='{Cluster_OIDC_Endpoint}'
$ IDP_ARN="arn:aws:iam::{AWS_AccountNo}:oidc-provider/${IDP}" 1
- 1
- 将
{AWS_AccountNo}
替换为您的 AWS 帐户号,将{Cluster_OIDC_Endpoint}
替换为此流程前面标识的 OIDC DNS。
验证 trsut 策略是否已分配给 AWS IAM 角色。
输出示例
$ cat EOF albo-operator-trusted-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "${IDP_ARN}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "${IDP}:sub": "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager" } } } ] } EOF
重要在将
{Cluster_OIDC_Endpoint}
替换为之前标识的 OIDC DNS 时,不要包含 OIDC DNS URL 的https
部分。只需要在 URL 中遵循/
的字母数字信息。使用生成的信任策略创建并验证角色:
$ aws iam create-role --role-name albo-operator --assume-role-policy-document file://albo-operator-trusted-policy.json
$ OPERATOR_ROLE_ARN=$(aws iam get-role --role-name albo-operator --output json | jq -r '.Role.Arn')
$ echo $OPERATOR_ROLE_ARN
输出示例
ROLE arn:aws:iam::<aws_account_number>:role/albo-operator 2023-08-02T12:13:22Z ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRoleWithWebIdentity Allow STRINGEQUALS system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-manager PRINCIPAL arn:aws:iam:<aws_account_number>:oidc-provider/<oidc_provider_id>
注意其中为 AWS Load Balancer Operator 创建 AWS IAM 角色警告,如
arn
:aws:iam::777777777:role/albo-operator将 Operator 的权限策略附加到角色:
$ curl -o albo-operator-permission-policy.json https://raw.githubusercontent.com/openshift/aws-load-balancer-operator/release-1.1/hack/operator-permission-policy.json $ aws iam put-role-policy --role-name albo-operator --policy-name perms-policy-albo-operator --policy-document file://albo-operator-permission-policy.json
使用 AWS CLI 为 AWS Load Balancer Controller 创建 AWS IAM 策略:
为您的身份提供程序生成信任策略文件。以下示例使用 OpenID Connect:
$ IDP='{Cluster_OIDC_Endpoint}' $ IDP_ARN="arn:aws:iam::{AWS_AccountNo}:oidc-provider/${IDP}" $ cat <EOF> albo-controller-trusted-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "${IDP_ARN}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "${IDP}:sub": "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-cluster" } } } ] } EOF
使用生成的信任策略创建并验证角色:
$ aws iam create-role --role-name albo-controller --assume-role-policy-document file://albo-controller-trusted-policy.json $ CONTROLLER_ROLE_ARN=$(aws iam get-role --role-name albo-controller --output json | jq -r '.Role.Arn') $ echo $CONTROLLER_ROLE_ARN
输出示例
ROLE arn:aws:iam::<aws_account_number>:role/albo-controller 2023-08-02T12:13:22Z ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRoleWithWebIdentity Allow STRINGEQUALS system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-cluster PRINCIPAL arn:aws:iam:<aws_account_number>:oidc-provider/<oidc_provider_id>
注意其中为 AWS Load Balancer Controller 创建的 AWS IAM 角色警告,如
arn
:aws:iam::777777777:role/albo-controller将控制器的权限策略附加到角色:
$ curl -o albo-controller-permission-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy.json $ aws iam put-role-policy --role-name albo-controller --policy-name perms-policy-albo-controller --policy-document file://albo-controller-permission-policy.json
对于带有 HCP 集群的 ROSA,请添加子网发现所需的标签:
将以下
{Key: Value}
标签添加到托管 ROSA 集群的 VPC 中以及所有子网中。将{Cluster Infra ID}
替换为之前指定的 Infra ID:kubernetes.io/cluster/${Cluster Infra ID}:owned
将以下 ELBv2
{Key: Value}
标签添加到专用子网,也可以选择性地添加到公共子网中:-
专用子网:
kubernetes.io/role/internal-elb:1
公共子网:
kubernetes.io/role/elb:1
注意面向互联网和内部负载均衡器将在这些子网所属的 AWS Availability Zone 中创建。
重要AWS Load Balancer Operator 创建的 ELBv2 资源(如 ALBs 和 NLBs)不会继承 ROSA 集群设置的自定义标签。您必须单独为这些资源设置标签。
-
专用子网:
通过完成以下步骤创建 AWS Load Balancer Operator:
运行以下命令来创建
OperatorGroup
对象:$ cat EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: aws-load-balancer-operator namespace: aws-load-balancer-operator spec: targetNamespaces: [] EOF
运行以下命令来创建
Subscription
对象:$ cat EOF | oc apply -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: aws-load-balancer-operator namespace: aws-load-balancer-operator spec: channel: stable-v1 name: aws-load-balancer-operator source: redhat-operators sourceNamespace: openshift-marketplace config: env: - name: ROLEARN value: "<operator_role_arn>" 1 EOF
- 1
- 指定 AWS Load Balancer Operator 的 ARN 角色。
CredentialsRequest
对象使用此 ARN 角色来置备 AWS 凭证。例如,<operator_role_arn>
示例为arn:aws:iam::<aws_account_number>:role/albo-operator
。
创建 AWS Load Balancer Controller:
apiVersion: networking.olm.openshift.io/v1 kind: AWSLoadBalancerController metadata: name: cluster spec: subnetTagging: Manual credentialsRequestConfig: stsIAMRoleARN: <controller_role_arn>
重要因为 AWS Load Balancer Controller 不支持创建与 AWS Availability Zones 和 AWS Local Zones 关联的 AWS Load Balancers (ALBs),所以 ROSA 集群可以有专门与 AWS Local Zones 或 AWS 可用区关联的 ALB,但不能同时关联。
验证
运行以下命令确认安装是否成功:
收集项目中 pod 的信息:
$ oc get pods -n aws-load-balancer-operator
查看项目中的日志:
$ oc logs -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-manager -c manager
其他资源
- 有关为 AWS IAM 角色分配信任策略的更多信息,请参阅 如何将信任策略与 IAM 角色一起使用。
- 有关创建 AWS IAM 角色的更多信息,请参阅创建 IAM 角色。
- 有关在 AWS IAM 角色中添加 AWS IAM 权限的更多信息,请参阅 添加和删除 IAM 身份权限。
- 有关格式化凭证文件的更多信息,请参阅在 Amazon Web Services Security Token Service 中使用手动模式。
- 如需有关 AWS Load Balancer Controller 配置的更多信息,请 创建多个入口 和添加 TLS 终止
- 有关向 AWS 资源添加标签(包括 VPC 和子网)的更多信息,请参阅 标记 Amazon EC2 资源。
- 有关验证为 ROSA 集群中运行的应用程序创建了 ELBv2 的详细信息,请参阅创建 AWS Load Balancer Controller 实例。
2.1.4. 卸载 AWS Load Balancer Operator
要卸载 AWS Load Balancer Operator 并对相关资源执行整体清理,请执行以下步骤。
流程
- 通过删除由 ALBO 创建和管理的 Load Balancers 来清理示例应用程序。有关删除负载均衡器的更多信息,请参阅 删除应用程序负载均衡器。
- 删除添加到子网中的 VPC 标签,以及创建 Application Load Balancers (ALBs)来清理 AWS VPC 标签。如需更多信息,请参阅 标签基础知识。
- 通过删除 AWS Load Balancer Operator 和 Application Load Balancer Controller 来清理 AWS Load Balancer Operator 组件。如需更多信息,请参阅 从集群中删除 Operator。