在 Keda 中验证 AWS SQS 缩放器

Authenticate an AWS SQS scaler in Keda

我有一个 Keda 部署,我已经尝试开始工作大约一个月了。目前,我的缩放器看起来像这样:

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: {service-name}-scaler
spec:
  scaleTargetRef:
    deploymentName: {service-name}
    containerName: {service-name}
  pollingInterval: 30
  cooldownPeriod:  600
  minReplicaCount: 0
  maxReplicaCount: 10
  triggers:
  - type: aws-sqs-queue
    authenticationRef:
      name: keda-trigger-authentication
    metadata:
      queueURL: https://sqs.ap-northeast-1.amazonaws.com/{AWS ID}/{Queue-name}
      queueLength: "1"
      awsRegion: "ap-northeast-1"
      identityOwner: pod

关联的触发器身份验证和密码是:

apiVersion: v1
kind: Secret
metadata:
  name: keda-secrets
data:
  AWS_ACCESS_KEY_ID: {base64-encoded-string}
  AWS_SECRET_ACCESS_KEY: {base64-encoded-string}
  KEDA_ROLE_ARN: {base64-encoded-string}

---

apiVersion: keda.k8s.io/v1alpha1
kind: TriggerAuthentication
metadata:
  name: keda-trigger-authentication
spec:
  env:
  - parameter: awsRegion
    name: AWS_REGION
  - parameter: awsAccessKeyID
    name: AWS_ACCESS_KEY_ID
  - parameter: awsSecretAccessKey
    name: AWS_SECRET_ACCESS_KEY
  - parameter: awsRoleArn
    name: KEDA_ROLE_ARN
  secretTargetRef:
  - parameter: awsRoleArn
    name: keda-secrets
    key: KEDA_ROLE_ARN

我了解到这里重复了KEDA_ROLE_ARN值;为了调试目的,我把两者都留下了。部署顺序如下:

  1. 安装公共环境变量(这是存储AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYKEDA_ROLE_ARN值的地方。列出了AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY值作为 AWS_ACCESS_KEY_ID_ASSUMEAWS_SECRET_ACCESS_KEY_ASSUME 分别在文件中,并将在容器上采用它们的适当值。同样,为了调试目的,这些是重复的。我更愿意使用这些值而不是单独的秘密。 使用 Helm
  2. 安装 Keda pods
  3. 部署keda-secrets secret和keda-trigger-authentication触发认证
  4. 部署应缩放的容器。这是 AWS_ACCESS_KEY_ID_ASSUME 值将采用 AWS_ACCESS_KEY_ID 名称的位置,AWS_SECRET_ACCESS_KEY_ASSUME 值将采用 AWS_SECRET_ACCESS_KEY 名称的位置,也是定义 AWS_REGION 值的位置。
  5. 缩放对象已部署

出于某种原因,当缩放器尝试缩放时,我不断收到来自 AWS 的错误消息,说链中没有凭证提供程序。似乎未发送 AWS 凭据。我在这里做错了什么?

我将向您展示两种基于 AWS SQS 成功扩展部署的方法

第一种方式:使用附加到节点的 AWS IAM 角色

如果你的IAM角色(节点角色)有SQS的权限,那么访问SQS就会变得更容易你只需要将identityOwner: pod字段更改为identityOwner: operator,这样KEDA就可以使用节点角色访问AWS SQS

带有 SQS 触发器的示例 ScaledObject 文件

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: aws-sqs-queue-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: test-deployment
  minReplicaCount: 0
  maxReplicaCount: 2
  triggers:
  - type: aws-sqs-queue
    metadata:
      queueURL: https://sqs.us-east-1.amazonaws.com/3243234432432/Queue
      queueLength: "5"
      awsRegion: "us-east-1"
      identityOwner: operator

第二种方式:使用IAM用户

在这种方法中,我们需要创建以下对象

  1. 在 AWS 中创建 IAM 用户。
  2. 在 Kubernetes 中创建秘密。
  3. 在 Kubernetes 中创建 TriggerAuthentication。
  4. 在 Kubernetes 中创建 scaledObject。

创建 IAM 用户并向该 IAM 用户授予 SQS 权限。

首先使用 base64 对 IAM 用户访问密钥和秘密密钥进行编码,这在创建 Kubernetes 秘密时是必需的。

创建秘密

apiVersion: v1
kind: Secret
metadata:
  name: test-secrets
  namespace: default
data:
  AWS_ACCESS_KEY_ID: <base64-encoded-key>
  AWS_SECRET_ACCESS_KEY: <base64-encoded-secret-key>

创建 TriggerAuthentication 这将在 scaledObject

中使用
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: keda-trigger-auth-aws-credentials
  namespace: default
spec:
  secretTargetRef:
  - parameter: awsAccessKeyID     # Required.
    name: test-secrets            # Required.
    key: AWS_ACCESS_KEY_ID        # Required.
  - parameter: awsSecretAccessKey # Required.
    name: test-secrets            # Required.
    key: AWS_SECRET_ACCESS_KEY    # Required.

创建 scaledObject 以将 keda 映射到您要根据 SQS 触发器扩展的部署

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: aws-sqs-queue-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: test-deployment
  minReplicaCount: 0
  maxReplicaCount: 2
  triggers:
  - type: aws-sqs-queue
    authenticationRef:
      name: keda-trigger-auth-aws-credentials
    metadata:
      queueURL: https://sqs.us-east-1.amazonaws.com/012345678912/Queue
      queueLength: "5"
      awsRegion: "us-east-1"